2.5 通道操作
在RGB图像中,图像是由R通道、G通道、B通道三个通道构成的。需要注意的是,在OpenCV中,通道是按照B通道→G通道→R通道的顺序存储的。
在图像处理过程中,可以根据需要对通道进行拆分和合并。本节就来介绍如何对通道进行拆分和合并。
2.5.1 通道拆分
针对RGB图像,可以分别拆分出其R通道、G通道、B通道。在OpenCV中,既可以通过索引的方式拆分通道,也可以通过函数的方式拆分通道。
1.通过索引拆分
通过索引的方式,可以直接将各个通道从图像内提取出来。例如,针对OpenCV内的BGR图像img,如下语句分别从中提取了B通道、G通道、R通道。
b = img[ : , : , 0 ] g = img[ : , : , 1 ] r = img[ : , : , 2 ]
【例2.16】编写程序,演示图像通道拆分及通道值改变对彩色图像的影响。
根据题目要求,编写代码如下:
import cv2 lena=cv2.imread("lenacolor.png") cv2.imshow("lena1", lena) b=lena[:, :,0] g=lena[:, :,1] r=lena[:, :,2] cv2.imshow("b", b) cv2.imshow("g", g) cv2.imshow("r", r) lena[:, :,0]=0 cv2.imshow("lenab0", lena) lena[:, :,1]=0 cv2.imshow("lenab0g0", lena) cv2.waitKey() cv2.destroyAllWindows()
本例实现了通道拆分和通道值改变:
● 语句b=lena[:, :,0]获取了图像img的B通道。
● 语句g=lena[:, :,0]获取了图像img的G通道。
● 语句r=lena[:, :,0]获取了图像img的R通道。
● 语句lena[:, :,0]=0将图像img的B通道值设置为0。
● 语句lena[:, :,1]=0将图像img的G通道值设置为0。
运行上述程序,得到如图2-21所示的结果,其中:
图2-21 【例2.16】程序的运行结果
● 图(a)是原始图像lena。
● 图(b)是原始图像lena的B通道图像b。
● 图(c)是原始图像lena的G通道图像g。
● 图(d)是原始图像lena的R通道图像r。
● 图(e)是将图像lena中B通道值置为0后得到的图像。
● 图(f)是将图像lena中B通道值、G通道值均置为0后得到的图像。
由于本书为黑白印刷,所以为了更好地观察运行效果,请大家亲自上机运行程序。
2.通过函数拆分
函数cv2.split()能够拆分图像的通道。例如,可以使用如下语句拆分彩色BGR图像img,得到B通道图像b、G通道图像g和R通道图像r。
b, g, r=cv2.split(img)
上述语句与如下语句是等价的:
b=cv2.split(a)[0] g=cv2.split(a)[1] r=cv2.split(a)[2]
【例2.17】编写程序,使用函数cv2.split()拆分图像通道。
根据题目要求,编写代码如下:
import cv2 lena=cv2.imread("lenacolor.png") b, g, r=cv2.split(lena) cv2.imshow("B", b) cv2.imshow("G", g) cv2.imshow("R", r) cv2.waitKey() cv2.destroyAllWindows()
运行上述程序,得到如图2-22所示的三个通道图像,其中:
图2-22 三个通道的图像
● 左图是B通道图像b。
● 中间的图是G通道图像g。
● 右图是R通道图像r。
由于本书为黑白印刷,所以为了更好地观察运行效果,请大家亲自上机运行程序。
2.5.2 通道合并
通道合并是通道拆分的逆过程,通过合并通道可以将三个通道的灰度图像构成一幅彩色图像。函数cv2.merge()可以实现图像通道的合并,例如有B通道图像b、G通道图像g和R通道图像r,使用函数cv2.merge()可以将这三个通道合并为一幅BGR的三通道彩色图像。其实现的语句为:
bgr=cv2.merge([b, g, r])
【例2.18】编写程序,演示使用函数cv2.merge()合并通道。
根据题目要求,编写代码如下:
import cv2 lena=cv2.imread("lenacolor.png") b, g, r=cv2.split(lena) bgr=cv2.merge([b, g, r]) rgb=cv2.merge([r, g, b]) cv2.imshow("lena", lena) cv2.imshow("bgr", bgr) cv2.imshow("rgb", rgb) cv2.waitKey() cv2.destroyAllWindows()
在本例中,首先对BGR图像进行了拆分,接下来又对其进行了两种不同形式的合并。
● 语句b, g, r=cv2.split(lena)对图像lena进行拆分,得到b、g、r这三个通道。
● 语句bgr=cv2.merge([b, g, r])对通道b、g、r进行合并,合并顺序为B通道→G通道→R通道,得到图像bgr。
● 语句rgb=cv2.merge([r, g, b])对通道r、g、b进行合并,合并顺序为R通道→G通道→B通道,得到图像rgb。
运行上述程序,得到如图2-23所示的图像,其中:
图2-23 【例2.18】程序的运行结果
● 左图是原始图像lena。
● 中间的图是lena图像经过通道拆分、合并后得到的BGR通道顺序的彩色图像bgr。
● 右图是lena图像经过通道拆分、合并后得到的RGB通道顺序的彩色图像rgb。
由于本书为黑白印刷,所以为了更好地观察运行效果,请大家亲自上机运行程序。
通过本例可以看出,改变通道顺序后,图像显示效果会发生变化。