作者:周遭圆

若何用Python+OpenCV处理图像色彩?终于有人疏解白了_图像_通道 智能问答

来源:华章科技

01 图像的颜色空间

彩色图像比灰度图像拥有更丰富的信息,它的每个像素常日是由红(R)、绿(G)、蓝(B)3个分量来表示的,每个分量介于0~255之间。

图像中呈现的不同的颜色都是由R、G、B这3种颜色稠浊而成的。
在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#定义main()函数defmain():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.9 color2gray.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这3个通道的图像并显示。
在分割前须要先确定图像的颜色通道分布,因此先调用cvtColor()函数固定颜色通道。
示例代码拜会程序3-6,效果如图3.10所示。

程序3-6 彩色图像通道分离示例:colorsplit.py

#--coding:UTF-8--importnumpyasnpimportcv2#定义main()函数defmain():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.10 colorsplit.py程序运行结果

可以看出,在图像通道分离后,不同颜色通道的图像显示深浅不一,单通道的图像呈现该颜色通道的灰度信息。
接下来把这3个颜色通道稠浊一下,在代码中加入一行代码:img3 = cv2.merge([b,g,r]);,这样img3又回到了原来输入的彩色图像样式,显示效果如图3.11所示。

▲图3.11 图像三通道稠浊后的输出

04 彩色图像的二值化

图像的二值化是将图像上的像素点的灰度值设置为0或255,也便是将全体图像呈现出明显的黑白效果。
彩色图像二值化最大略的步骤如下:

彩色图像转灰度。
图像阈值化处理,即像素值高于某阈值的像素赋值为255,反之为0。

个中,阈值的操作会调用OpenCV的threshold()函数。

threshold()函数声明如下:

ret, dst = cv2.threshold(src, thresh, maxval, type);

函数功能:实现图像固定阈值的二值化。

参数解释:

src:输入图,只能输入单通道图像,常日来说为灰度图。
dst:输出图。
thresh:阈值。
maxval:当像素值超过了阈值(或者小于阈值,根据type来决定)时所授予的值。
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#定义main()函数defmain():img=cv2.imread('1.jpg',0)thresh1,dst=cv2.threshold(img,127,255,cv2.THRESH_BINARY)#图像二值化cv2.imshow("dst",dst)cv2.waitKey(0)if__name__=='__main__':main()

如程序3-7所示,高于127的像素全部置为255,低于的全部置为0,得到如图3.12所示的输出结果。

▲图3.12 colorthreshold.py程序输出结果

05 彩色图像的遍历

灰度图像的遍历按照访问二维数组的办法得到坐标位置的像素。
那对付彩色图像呢?彩色图像可以看出是3维数组,遍历办法拜会程序3-8。

程序3-8 遍历彩色图像示例:color1.py

#--coding:UTF-8--importnumpyasnpimportcv2#定义main()函数defmain():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.13 color1.py程序运行结果

在读取不同通道的图像像素值时,须要先确定图像的通道排列是RGB还是BRG。

06 彩色图像和灰度图像的转换

经由前面的学习,我们知道彩色图像转成灰度图像有3种路径:

imread读取图像的时候直接设置参数为0,彩色图像自动被读成灰度图像。
调用cvtColor()函数,参数设置为cv2.COLOR_BGR2GRAY。
调用split()函数,可以将一幅彩色图像分离成3个单通道的灰度图像。

那么灰度图像有没有可能转换成彩色图像呢?

我们知道灰度图像是单通道的,彩色图像是RGB 3这个颜色通道。
那么是否可以人为地增加图像的通道,假造出其余两个通道,而其余两个通道可以随机地赋值呢?程序3-9做出了考试测验。

程序3-9 增加图像通道示例:gray2color1.py

#--coding:UTF-8--importnumpyasnpimportcv2#定义main()函数defmain():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.14 gray2color1.py程序运行结果

上述方法转换的图像颜色很单一。
有没有更加智能的方法呢?在摄像技能不是很成熟的期间,人们给拍摄出来的黑白照片上色,发明了一种伪彩色图像技能。
在OpenCV里面,可以用预定义好的Colormap(色度图)来给图片上色,示例代码拜会程序3-10。

程序3-10 伪彩色图像技能示例:gray2color2.py

#--coding:UTF-8--importnumpyasnpimportcv2#定义main()函数defmain():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.15 gray2color程序运行结果

关于作者:周遭圆,在人工智能技能领域有多年的事情经历和丰富的开拓履历。

本文摘编自《人脸识别与美颜算法实战:基于 Python、机器学习与深度学习》,经出版方授权发布。

延伸阅读《人脸识别与美颜算法实战》

推举语:资深AI算法工程师结合60多个人脸图像案例先容基于Python、机器学习及深度学习在人脸识别和美颜算法中的运用。