OpenCV轻松入门:面向Python
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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。

由于本书为黑白印刷,所以为了更好地观察运行效果,请大家亲自上机运行程序。

通过本例可以看出,改变通道顺序后,图像显示效果会发生变化。