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

4.5 alpha通道

在RGB色彩空间三个通道的基础上,还可以加上一个A通道,也叫alpha通道,表示透明度。这种4个通道的色彩空间被称为RGBA色彩空间,PNG图像是一种典型的4通道图像。alpha通道的赋值范围是[0, 1],或者[0, 255],表示从透明到不透明。

例4.12】编写一个程序,分析alpha通道的值。

为了方便观察,本例中使用一个随机数组来模拟图像,进行观察。

根据题目要求,设计程序如下:

        import cv2
        import numpy as np
        img=np.random.randint(0,256, size=[2,3,3], dtype=np.uint8)
        bgra = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
        print("img=\n", img)
        print("bgra=\n", bgra)
        b, g, r, a=cv2.split(bgra)
        print("a=\n", a)
        a[:, :]=125
        bgra=cv2.merge([b, g, r, a])
        print("bgra=\n", bgra)

在本例中,使用语句bgra=cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)将img从BGR色彩空间转换到BGRA色彩空间。在转换后的BGRA色彩空间中,A是alpha通道,默认值为255。

接下来,分别使用打印语句打印原始图像img的值和转换后的图像bgra的值。

然后,使用语句a[:, :]=125将从bgra中提取的alpha通道的值设定为125,并使用语句bgra=cv2.merge([b, g, r, a])构建一个新的bgra图像。在本步骤中,使用cv2.merge()函数将新的alpha通道与原有的BGR通道进行合并,得到一个新的图像。从另外一个角度理解就是,本步骤实现了将bgra图像中alpha通道的值更改为125。

最后,使用print语句显示重构后的bgra图像。

运行程序,结果如下所示。

        img=
         [[[141  62  75]
          [ 64  55238]
          [ 10167220]]

         [[ 19  29  93]
          [234219238]
          [108  33  99]]]
        bgra=
         [[[141  62  75255]
          [ 64  55238255]
          [ 10167220255]]

         [[ 19  29  93255]
          [234219238255]
          [108  33  99255]]]
        a=
         [[255255255]
         [255255255]]
        bgra=
         [[[141  62  75125]
          [ 64  55238125]
          [ 10167220125]]

         [[ 19  29  93125]
          [234219238125]
          [108  33  99125]]]

例4.13】编写一个程序,对图像的alpha通道进行处理。

根据题目要求,设计程序如下:

        import cv2
        img=cv2.imread("lenacolor.png")
        bgra = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
        b, g, r, a=cv2.split(bgra)
        a[:, :]=125
        bgra125=cv2.merge([b, g, r, a])
        a[:, :]=0
        bgra0=cv2.merge([b, g, r, a])
        cv2.imshow("img", img)
        cv2.imshow("bgra", bgra)
        cv2.imshow("bgra125", bgra125)
        cv2.imshow("bgra0", bgra0)
        cv2.waitKey()
        cv2.destroyAllWindows()
        cv2.imwrite("bgra.png", bgra)
        cv2.imwrite("bgra125.png", bgra125)
        cv2.imwrite("bgra0.png", bgra0)

在本例中,首先从当前目录下读取文件lenacolor.png,然后将其进行色彩空间变换,将其由BGR色彩空间转换到BGRA色彩空间,得到bgra,即为原始图像lena添加alpha通道。

接下来,分别将提取得到的alpha通道的值设置为125、0,并将新的alpha通道与原有的BGR通道进行组合,得到新的BGRA图像bgra125、bgra0。

接着,分别显示原始图像、原始BGRA图像bgra、重构的BGRA图像bgra125和bgra0。

最后,将3个不同的BGRA图像保存在当前目录下。

运行程序,显示的图像如图4-7所示。图中:

图4-7 【例4.13】程序的运行结果

● 图(a)是原始图像lena。

● 图(b)是由原始图像lena通过色彩空间转换得到的图像bgra,该图像内alpha通道的值是默认值255。

● 图(c)是将图像bgra中alpha通道值设置为0得到的。

● 图(d)是将图像bgra中alpha通道值设置为125得到的。

从图中可以看到,各个图像的alpha通道值虽然不同,但是在显示时是没有差别的。

除此以外,程序还分别保存了不同alpha通道值的图像。打开当前文件夹,可以看到当前文件夹下保存了三幅图像,如图4-8所示,其中:

图4-8 保存的图像

● 图(a)是保存的图像bgra,该图像由原始图像lena通过色彩空间转换得到,该图像内alpha通道的值是默认值255。

● 图(b)是保存的图像bgra125,该图像是将图像bgra中alpha通道值设置为125得到的。

● 图(c)是保存的图像bgra0,该图像是将图像bgra中alpha通道值设置为0得到的。需要注意,在图像bgra0处于预览模式时,看起来可能是一幅黑色的图像,将其打开后就会看到它实际上是纯色透明的。