这里主要讨论二值图像,灰度图像,彩色图像的基本表示方法。
二值图像是指仅仅包含黑色和白色两种颜色的图像。在计算机中,图像是以矩阵的形式存在,矩阵中的每一个元素代表一个像素点,在二值图像中,计算机将白色像素点处理为‘1’,将黑色像素点处理为‘0’,其灰度值用1个bit就可以表示。
计算机通常用8bit来表示灰度值,灰度级通常为0~255,黑色灰度值为0,白色灰度值为255,灰度图像中不仅含有黑白两种颜色像素点,介于两者之间还存在一些其他的灰度颜色。
彩色图像是更常见的一类图像,它使用三通道来表示不同的颜色,通常为R,G,B三通道,但在Opencv中为B(blue),G(green),R(red)三通道每一个通道的灰度值都介于0~255之间,通过三通道不同灰度值混合,可以得到各种颜色。 在计算机中通常用三维数组来表示彩色图像。
在opencv中没有二值图像这种数据类型,通常我们通过阈值处理得到二值图像,使用0表示黑色,255表示白色。
灰度图像在opencv中以二维数组的形式表示,数据类型为numpy.ndarray,所以我们可以借助numpy库来对图像相应的像素点进行处理。 例如我们可以通过numpy创建数组构成特殊图像:
import cv2 import numpy as np black=np.zeros((200,200),dtype=np.uint8)#元素全0 white=black+255#元素全255 cv2.imshow("white",white) cv2.imshow("black",black) cv2.waitKey(0) cv2.destroyAllWindows()运行结果显示: 也可以通过修改原图像对应位置值对图像进行修改:
import cv2 import numpy as np image=cv2.imread("color_2.png",cv2.IMREAD_GRAYSCALE)#读取灰度图 before=image.copy()#保存修改前数据 #修改第10~100行,20~60列 for i in range(10,100): for j in range(20,60): image[i,j]=0 cv2.imshow("before",before) cv2.imshow("after",image) cv2.waitKey(0) cv2.destroyAllWindows() image.shape运行结果显示:
在opencv中彩色图像以三维数组形式表示,第一维度为长,第二维度为宽,第三维度为B,G,R三通道。
import cv2 import numpy as np image=np.zeros((200,200,3),dtype=np.uint8)#元素全0,三维数组 blue=image.copy() green=image.copy() red=image.copy() blue[:,:,0]=255 green[:,:,1]=255 red[:,:,2]=255 cv2.imshow("blue",blue) cv2.imshow("green",green) cv2.imshow("red",red) cv2.waitKey(0) cv2.destroyAllWindows()运行结果:
numpy.array 提供了item()与itemset()函数来访问和修改像素值,使用这两种函数比使用索引要更便捷。
函数item()可以高效访问图像像素点,其用法:
item(行,列)函数itemset()可以用来修改像素值,其用法:
itemset(索引值,新值) import numpy as np arr=np.arange(0,9).reshape(3,3) print(arr) print(arr.item(2,2)) arr.itemset((2,2),1000) print(arr)运行结果:
item()与itemset()访问和修改彩色图像,用法与灰度图一致,只是索引需再添加一个维度。
在数字图像处理的过程中,可能需要对图像的某个特定区域进行相关操作,这个区域就是感兴趣区域。我们此时可以借助numpy中切片对感兴趣的整块区域进行操作。
运行结果:
运行结果:
运行结果:
彩色图像由B,G,R三通道组成,我们可以对图像进行通道的拆分和合并。 我们可以通过索引来提取图像各通道的信息,也可以调用opencv API函数来进行操作。
运行结果:
可以通过切片对像素进行重组,也可以调用如下函数进行通道合并。
cv2.merge([b,g,r]) #只有一个参数,以列表或元组的形式传入b,g,r的值属性包括图像的大小,类型等。
返回图像数组的形状,如果为灰度图,返回(行,列);如果为彩色图,返回(行,列,通道数);
返回图像数组元素个数,即原始图像像素点的个数。
返回图像数组元素的数据类型
import cv2 import numpy as np #读入一幅彩色图 image=cv2.imread("color_2.png") print("shape",image.shape) print("size",image.size) print("type",image.dtype)运行结果: