OpenCV程序练习(二):图像处理基础
一、彩色图像像素处理
代码
import cv2
import numpy as np
#----------蓝色通道----------
blue=np.zeros((300,300,3),dtype=np.uint8)
blue[:,:,0]=255
print("blue=\n",blue)
cv2.imshow("blue",blue)
#----------绿色通道----------
green=np.zeros((300,300,3),dtype=np.uint8)
green[:,:,1]=255
print("green=\n",green)
cv2.imshow("green",green)
#----------红色通道----------
red=np.zeros((300,300,3),dtype=np.uint8)
red[:,:,2]=255
print("red=\n",red)
cv2.imshow("red",red)
#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()
运行结果
程序分析
● 针对数组blue,将其第0个通道的值设置为255。从图像角度来 看,图像blue的B通道值为255,其余两个通道值为0,因此图像blue为蓝色图像。
同理,数组green的第1个通道(图像green的G通道)值为255,数组red的第1个通道(图像red的R通道)值为255。
● 从通道值设置可以看出,在OpenCV中,通道的顺序是 B→G→R
同理,数组green的第1个通道(图像green的G通道)值为255,数组red的第1个通道(图像red的R通道)值为255。
● 从通道值设置可以看出,在OpenCV中,通道的顺序是 B→G→R
二、生成像素值为随机数的图像
1、灰度图像
代码
import cv2
import numpy as np
img=np.random.randint(0,256,size=[256,256],dtype=np.uint8)
cv2.imshow("Grayscale",img)
#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()
运行结果
2、彩色图像
代码
import cv2
import numpy as np
img=np.random.randint(0,256,size=[256,256,3],dtype=np.uint8)
cv2.imshow("Colorscale",img)
#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()
运行结果
3、程序分析
随机灰度图像和随机彩色图像差别仅在size:随机灰度图像的size=[256,256],随机彩色图像的size=[256,256,3]
区别在于随机彩色图像必随机灰度图像多了两个通道数,随机灰度图像的size也可写为size=[256,256,1]
三、使用numpy.array访问彩色图像像素
代码
import cv2
import numpy as np
img=cv2.imread("demoimg.jpg")
cv2.imshow("before",img)
#使用item()函数读取原图像第0行第0列位置上的 B通道、G通道、R通道三个通道上的像素值
print("修改前:")
print("(0,0,0)=",img.item(0,0,0))
print("(0,0,1)=",img.item(0,0,1))
print("(0,0,2)=",img.item(0,0,2))
#使用嵌套循环语句将位于“第0行到第49行”和“第0列到第99列”的交叉区域内的像素值赋予随机值
for i in range(0,50):
for j in range(0,100):
for k in range(0,3):
img.itemset((i,j,k),np.random.randint(0,256,dtype=np.uint8)) #使用itemset()函数对像素进行修改
cv2.imshow("after",img)
#使用item()函数读取修改后图像第0行第0列位置上的 B通道、G通道、R通道三个通道上的像素值
print("修改后:")
print("(0,0,0)=",img.item(0,0,0))
print("(0,0,1)=",img.item(0,0,1))
print("(0,0,2)=",img.item(0,0,2))
#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()
运行结果
四、感兴趣区域(ROI)
1、获取ROI
代码
import cv2
img=cv2.imread("demoimg.jpg")
roi=img[170:220,110:160] #获取ROI
cv2.imshow("original image",img) #显示原始图像
cv2.imshow("ROI",roi) #显示ROI
#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()
运行结果
2、对ROI打码
代码
import cv2
import numpy as np
img=cv2.imread("demoimg.jpg",cv2.IMREAD_UNCHANGED) #读取图像,读取标记值cv2.IMREAD_UNCHANGED为保持原格式不变
cv2.imshow("original image",img) #显示原始图像
img[170:220,110:160]=np.random.randint(0,256,(50,50,3)) #将原图像的ROI用随机图像替换
cv2.imshow("result",img) #显示替换后图像
#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()
运行结果
五、通道操作
1、通道拆分
代码
import cv2
img=cv2.imread("colorimg.jpg") #读取图像
cv2.imshow("original image",img) #显示原图像
#分别拆分B、G、R三个通道
b,g,r=cv2.split(img)
"""
使用函数cv2.split()拆分图像通道,等价于:
b=img[:,:,0]
g=img[:,:,1]
r=img[:,:,2]
"""
#分别显示单独拆分出B、G、R三个通道的图像
cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)
#B通道设为0
img[:,:,0]=0
cv2.imshow("B0",img)
#G通道设为0,此时原图像的B和G通道值都为0,仅R通道有值
img[:,:,1]=0
cv2.imshow("B0G0",img)
#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()
运行结果
程序分析
- 从运行结果看出,单独拆分出的通道其对应的颜色会偏白,与其相对的颜色则偏黑
- 将指定通道值设为0后,该通道的颜色偏黑
2、通道合并
代码
import cv2
img=cv2.imread("colorimg.jpg") #读取图像
cv2.imshow("original image",img) #显示原图像
b,g,r=cv2.split(img) #分别拆分B、G、R三个通道
#分别按照B→G→R和R→G→B顺序合并通道
bgr=cv2.merge([b,g,r])
rgb=cv2.merge([r,g,b])
#分别显示按照B→G→R和R→G→B顺序合并通道后的图像
cv2.imshow("BGR",bgr)
cv2.imshow("RGB",rgb)
#----------释放窗口---------
cv2.waitKey()
cv2.destroyAllWindows()
运行结果
程序分析
从运行结果可以看出,改变通道顺序后,图像显示效果会发生变化,从纯颜色角度看,其余对应的颜色相互颠倒,但R→G→B顺序的通道红色部分相对原图偏暗。
很高兴本文对你有用(*^_^*),如需转载请记得标明出处哟(☆▽☆):
本文来自博客园,作者:香菜大魔法师,原文链接:https://www.cnblogs.com/corianderfiend/p/16583137.html