Python版本是Python3.7.3,OpenCV版本OpenCV.3.4.1,开发环境为PyCharm
在RGB图像中,图像是由R通道、G通道、B通道三个通道构成的。需要注意的是,在OpenCV中,通道是按照B通道→G通道→R通道的顺序存储的。
在图像处理过程中,可以根据需要对通道进行拆分和合并。下面就来介绍如何对通道进行拆分和合并。
1.1 通道拆分
针对RGB图像,可以分别拆分出其R通道、G通道、B通道。在OpenCV中,既可以通过索引的方式拆分通道,也可以通过函数的方式拆分通道。
1.通过索引拆分
通过索引的方式,可以直接将各个通道从图像内提取出来。例如,针对OpenCV内的BGR图像img,如下语句分别从中提取了B通道、G通道、R通道。
b = img[ : , : , 0 ]
g = img[ : , : , 1 ]
r = img[ : , : , 2 ]
eg1:编写程序,演示图像通道拆分及通道值改变对彩色图像的影响。
代码如下:
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。
运行上述程序,得到如下图所示的结果,其中:
● 图( 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]
eg2:编写程序,使用函数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()
上述语句与如下语句是等价的:
b=cv2.split(a)[0]
g=cv2.split(a)[1]
r=cv2.split(a)[2]
运行上述程序,得到如图2-22所示的三个通道图像,其中:
● 左图是B通道图像b。
● 中间的图是G通道图像g。
● 右图是R通道图像r。
1.2 通道合并
通道合并是通道拆分的逆过程,通过合并通道可以将三个通道的灰度图像构成一幅彩色图像。函数cv2.merge()可以实现图像通道的合并,例如有B通道图像b、G通道图像g和R通道图像r,使用函数cv2.merge()可以将这三个通道合并为一幅BGR的三通道彩色图像。其实现的语句为:
bgr=cv2.merge([b, g, r])
eg4:编写程序,演示使用函数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()
陌上花开 21:36:11
根据题目要求,编写代码如下:
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。
运行上述程序,得到如下图所示的图像,其中:
● 左图是原始图像lena。
● 中间的图是lena图像经过通道拆分、合并后得到的BGR通道顺序的彩色图像bgr。
● 右图是lena图像经过通道拆分、合并后得到的RGB通道顺序的彩色图像rgb。
通过本例可以看出,改变通道顺序后,图像显示效果会发生变化。