在 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("C:\\Users\\Administrator\\Desktop\\opencv\\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[:,:,1]获取了图像 img的G 通道
语句 r=lena[:,:,2]获取了图像 img的R 通道
语句lena[:,:,0]]=0 将图像 img的B 通道值设置为 0
语句lena[:,:,1]=0 将图像 img的G 通道值设置为0
图(a)是原始图像 lena
图(b)是原始图像 lena的B 通道图像b
图(c)是原始图像 lena的G 通道图像
图(d)是原始图像 lena的R 通道图像r。
图(e)是将图像 lena中B 通道值置为0 后得到的图像。
图(f )是将图像 lema中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("C:\\Users\\Administrator\\Desktop\\opencv\\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 所示的三个通道图像,其中
左图是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("C:\\Users\\Administrator\\Desktop\\opencv\\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
2.6 获取图像属性
在图像处理过程中,经常需要获取图像的属性,例如图像的大小、类型等。这里介绍几个
常用的属性。
shape:如果是彩色图像,则返回包含行数、列数、通道数的数组:如果是二值图像或灰度图像,则仅返回行数和列数。通过该属性的返回值是否包含通道数,可以判断一幅图像是灰度图像(或二值图像)还是彩色图像
size:返回图像的像素数。其值为“行x列x 通道数”,灰度图像或者二值图像的通道 数为1
dtype:返回图像的数据类型
【例 219】编写程序,察图像的常用属性值
根据题目要求,编写代码如下
import cv2
gray=cv2.imread("C:\\Users\\Administrator\\Desktop\\opencv\\lena.bmp",0)
color=cv2.imread("C:\\Users\\Administrator\\Desktop\\opencv\\lenacolor.png")
print("图像gray属性:")
print("gray.shape=",gray.shape)
print("gray.size=",gray.size)
print("gray.dtype=",gray.dtype)
print("图像color属性:")
print("color.shape=",color.shape)
print("color.size=",color.size)
print("color.dtype=",color.dtype)
本例中,分别读取了灰度图像gray和彩色图像color 并分别观察了他们的shape,size,dtype
图像gray属性:
gray.shape= (256, 256)
gray.size= 65536
gray.dtype= uint8
图像color属性:
color.shape= (512, 512, 3)
color.size= 786432
color.dtype= uint8