01图像色彩空间彩色图像比灰度图像信息量更多。每个像素点通常由红(R)、绿(G)、蓝(B)3个分量表示,每个分量在0~255之间。图像中呈现的不同颜色就是这三种颜色混合形成的R、G、B。在OpenCV中,一幅彩色图像有3个颜色通道,但是通道的顺序是可以改变的,RGB、BRG、BGR、GBR、GRB都是可以的。在读取图像时,我们并不知道图像的颜色通道排列,因此需要先固定图像的颜色通道,这需要调用OpenCV的cvtColor()函数。cvtColor()函数的作用是变换图像的色彩空间。原型如下:dst=cv2.cvtColor(src,code)参数说明:src:输入图像是要变换到颜色空间的原始图像,可以是Mat类。code:转换代码或标识,即决定图片转换成什么格式,转换成什么标准,后面会详细介绍。函数输出存储色彩空间变换后的图像。通过调用cvtColor()函数,彩色图像也可以转换为灰度图像。示例代码见程序3-5,代码运行效果如图3.9所示。▲彩色图像1.jpg程序3-5彩色图像转灰度图像示例:color2gray.py#-*-coding:UTF-8-*-importnumpyasnpimportcv2#Definemain()functiondefmain():img=cv2.imread('1.jpg')img2=cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)#从彩色图像转换为灰度图像cv2.imshow('img2.bmp',img2)cv2.waitKey(0)if__name__=='__main__':main()▲图3.9color2gray.py程序运行结果注:cvtColor()函数也可以通过改变cv2.COLOR_RGB2BRG等参数来改变图像颜色通道的顺序。另外,读取图像函数imread时可以直接将参数设置为0,将彩色图像直接读取为灰度图,img=cv2.imread('1.jpg',0)。02彩色图像的通道分离与混合灰度图像是单通道的,彩色图像有R、G、B三个颜色通道。因此,在图像处理中,往往将颜色通道分开,单独处理一个通道数组,然后合并成一张彩色图像。在实际代码编写中,只需调用OpenCV中的split()和merge()函数即可实现图像通道的分离与合并。split()函数的作用是将多通道矩阵分离成单通道矩阵。原型如下:[,mv]=cv2.split(src)参数说明:输入参数为待分离的图像矩阵,输出参数为Mat数组。merge()函数的作用是将多张单通道图像合并为一张多通道图像。原型如下:dst=cv2.merge([,dst])参数说明:输入参数可以是Mat数组,输出为合并后的图像矩阵。03彩色图像通道分离与混合程序示例输入一幅彩色图像,通过程序3-6将其分成R、G、B三个通道图像,并显示出来。分割前需要确定图像的颜色通道分布,因此首先调用cvtColor()函数固定颜色通道。示例代码参见程序3-6,效果如图3.10所示。程序3-6彩色图像通道分离示例:colorsplit.py#-*-coding:UTF-8-*-importnumpyasnpimportcv2#Definemain()functiondefmain():img=cv2.imread('1.jpg')img2=cv2.cvtColor(img,cv2.COLOR_BRG2RGB)r,g,b=cv2.split(img2)#img分成三张单通道图像cv2.imshow("Red",r)cv2.imshow("Green",g)cv2.imshow("Blue",b)cv2.waitKey(0)if__name__=='__main__':main()▲图3.10colorsplit.py程序运行结果可以看出图像通道分离后,不同颜色通道的图像表现出不同的深浅,单通道图像呈现颜色通道的灰度信息。接下来将这三个颜色通道混合,在代码中加入一行代码:img3=cv2.merge([b,g,r]);,使img3恢复到原来输入的彩色图像样式,以及显示效果如图3.11所示。▲图3.11图像三通道混合后的输出04彩色图像的二值化图像的二值化是将图像上的像素点的灰度值设置为0或255,也就是说整幅图像呈现出明显的黑色和黑色。白色效果。将彩色图像二值化的最简单步骤如下:将彩色图像转换为灰度图像。图像阈值化处理,即像素值高于某个阈值的像素赋值255,反之赋值255。其中,对阈值的操作会调用OpenCV的threshold()函数。threshold()函数声明如下:ret,dst=cv2.threshold(src,thresh,maxval,type);function函数:实现图像固定阈值的二值化。参数说明:src:输入图像,只能输入单通道图像,一般为灰度图。dst:输出地图。阈值:阈值。maxval:当像素值超过阈值(或小于阈值,取决于类型)时分配的值。type:二值化运算的类型,包括5种类型,分别是cv2.THRESH_BINARY、cv2.THRESH_BINARY_INV、cv2.THRESH_TRUNC、cv2.THRESH_TOZERO和cv2.THRESH_TOZERO_INV。有关示例,请参阅步骤3-7。程序3-7彩色图像二值化实例:colorthreshold.py#-*-coding:UTF-8-*-importnumpyasnpimportcv2#Definemain()functiondefmain():img=cv2.imread('1.jpg',0)thresh1,dst=cv2.threshold(img,127,255,cv2.THRESH_BINARY)#imagebinarizationcv2.imshow("dst",dst)cv2.waitKey(0)if__name__=='__main__':main()如程序中所示3-7中,将高于127的像素点全部设置为255,将低于127的像素点全部设置为0,得到如图3.12所示的输出结果。▲图3.12colorthreshold.py程序输出结果05遍历彩色图灰度图的遍历通过访问二维数组得到坐标位置的像素点。彩色图像怎么样?彩色图像可以看成是一个3维数组,遍历方法见程序3-8。程序3-8彩色图片遍历示例:color1.py#-*-coding:UTF-8-*-importnumpyasnpimportcv2#Definemain()functiondefmain():img=cv2.imread('1.jpg')height,width,n=img.shape#获取图片的宽高和维度img2=img.copy()#复制一个和img一样的新图片#遍历图片在宽高两个维度foriinrange(height):forjinrange(width):img2[i,j][0]=0#重新分配第一个通道中的元素cv2.imshow('img2.jpg',img2)cv2.waitKey(0)if__name__=='__main__':main()由于一个通道中的颜色信息全部变为0,图像显示结果如图3.13所示。▲图3.13color1.py程序运行结果在读取不同通道的图像像素值时,首先要判断图像的通道排列是RGB还是BRG。06彩色图和灰度图的转换经过前面的学习,我们知道彩色图转灰度图有3种方式:imread读取图像时,直接设置参数为0,彩色图自动读入成灰度图灰度图像。调用参数设置为cv2.COLOR_BGR2GRAY的cvtColor()函数。调用split()函数将彩色图像分离成三张单通道灰度图像。那么是否可以将灰度图像转换为彩色图像呢?我们知道灰度图像是单通道的,彩色图像是RGB3个颜色通道。那么,是否可以人为增加图像的通道来伪造另外两个通道,另外两个通道可以随机分配呢?程序3-9已经做了尝试。程序3-9添加图像通道示例:gray2color1.py#-*-coding:UTF-8-*-importnumpyasnpimportcv2#Definemain()functiondefmain():img=cv2.imread('gray1.jpg')gray=np.zeros((512,512,3),np.uint8)#生成空彩色图像height,width,n=img.shape#图像像素级遍历foriinrange(height):forjinrange(width):gray[i,j][0]=img[i,j][0]gray[i,j][1]=0gray[i,j][2]=0cv2.imshow('gray.jpg',gray)cv2.waitKey(0)=if__name__=='__main__':main()上面的程序新建了一个3通道的空彩色图像,然后把读取的灰度图放到新建彩色图像的第一个通道,也就是B通道,而其他两个通道都赋值为0,所以整体图像呈现蓝色,程序运行结果如图3.14所示。▲图3.14gray2color1.py程序运行结果上述方法转换后的图像颜色很单一。有没有更智能的方法?在照相机技术还不是很成熟的时期,人们在拍摄的黑白照片上加上了色彩,发明了假彩色影像技术。在OpenCV中,可以使用预定义的Colormap(色度图)对图片进行着色,示例代码见程序3-10。程序3-10图像伪彩技术示例:gray2color2.py#-*-coding:UTF-8-*-importnumpyasnpimportcv2#Definemain()functiondefmain():img=cv2.imread('gray1.jpg')im_color=cv2.applyColorMap(img,cv2.COLORMAP_JET)#给色度图上色cv2.imshow("im_color.jpg",im_color)cv2.waitKey(0)if__name__=='__main__':main()程序运行结果为如图3.15所示。伪彩色图像目前主要用于高度、压力、密度、湿度等的描述,以及彩色数据的可视化。▲图3.15gray2color程序运行结果
