- 在 RGB 图像中,图像是由 R 通道、G 通道、B 通道三个通道构成的。需要注意的是,在 OpenCV 中,通道是按照 B 通道→G 通道→R 通道的顺序存储的。
- 在图像处理过程中,可以根据需要对通道进行拆分和合并。
1. 通道拆分
针对 RGB 图像,可以分别拆分出其 R 通道、G 通道、B 通道。在 OpenCV 中,既可以通过索引的方式拆分通道,也可以通过函数的方式拆分通道。
1.1 通过索引拆分
通过索引的方式,可以直接将各个通道从图像内提取出来。例如,针对 OpenCV 内的 BGR 图像 img,如下语句分别从中提取了 B 通道、G 通道、R 通道。
b = img[ : , : , 0 ]
g = img[ : , : , 1 ]
r = img[ : , : , 2 ]
【例 2.16】编写程序,演示图像通道拆分及通道值改变对彩色图像的影响。
import cv2
lena = cv2.imread("/Users/zhaofeier/Desktop/lenacolor.png")
cv2.imshow("lena",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("lena,b=0",lena)
lena[:,:,1] = 0
cv2.imshow("lena,g=0",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。
1.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()拆分图像通道。
lena = cv2.imread("/Users/zhaofeier/Desktop/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. 通道合并
通道合并是通道拆分的逆过程,通过合并通道可以将三个通道的灰度图像构成一幅彩色图 像。函数 cv2.merge()可以实现图像通道的合并,例如有 B 通道图像 b、G 通道图像 g 和 R 通道 图像 r,使用函数 cv2.merge()可以将这三个通道合并为一幅 BGR 的三通道彩色图像。其实现的 语句为:
bgr=cv2.merge([b,g,r])
lena = cv2.imread("/Users/zhaofeier/Desktop/lenacolor.png")
b,g,r = cv2.split(lena)
bgr = cv2.merge([b,g,r])
rgb = cv2.merge([r,g,b])
cv2.imshow("bgr",bgr)
cv2.imshow("rgb",rgb)
cv2.waitKey()
cv2.destroyAllWindows()
- 语句 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。
3902

被折叠的 条评论
为什么被折叠?



