【opencv图像处理】图片通道的拆分——cv2.split

原创
2019/09/02 23:01
阅读数 649

以下实验基于python==3.6.8、opencv-python==4.1.0.25、imutils==0.5.2、numpy==1.17.0、matplotlib==3.1.1


图片通道的拆分

我们都知道常规的彩色图片一般都是三个通道RGB,Red=红色、Green=绿色、Blue=蓝色(有些图片还有第四个通道A,Alpha=透明度)

对于一张图片有几个通道,只需要通过img.shape进行查看就行了,比如我们读取一张图片,然后打印它的shape值

发现该图片高度为800px,宽度为600px,一共有三个channel

img (800, 600, 3)

现在试着将三个通道拆开,并将三个图像分别展示出来

channels = cv2.split(img)
cv2.imshow("img0", channels[0])
cv2.imshow("img1", channels[1])
cv2.imshow("img2", channels[2])

但是很奇怪,为什么三张图片都变成了灰度图片了呢?

其实从之前的认识中我们已经知道了,一个通道的图片都是灰度图片,三个通道的图片才是彩色图片,现在我们将一张三个通道的图片拆成了三张单个通道的图片,在展示的时候自然就都变成了灰度图片。

打印一下这三张图片的shape值看一下,确实都是单通道的

channels[0] (800, 600)
channels[1] (800, 600)
channels[2] (800, 600)

看来光分离三个通道是没有办法单独查看纯色的图片的,那么我们就需要将这三个单通道的图片补全成三通道的图片

这里可以将自身以外的通道都填充为0,可以使用numpy.zeros方法来初始化全为0的图片,然后将分离出的单通道去覆盖响应的通道


new_img0 = np.zeros(img.shape, dtype='uint8')
new_img0[:, :, 0] = channels[0]
cv2.imshow("img0", new_img0)

new_img1 = np.zeros(img.shape, dtype='uint8')
new_img1[:, :, 1] = channels[1]
cv2.imshow("img1", new_img1)

new_img2 = np.zeros(img.shape, dtype='uint8')
new_img2[:, :, 2] = channels[2]
cv2.imshow("img2", new_img2)

然后再重新显示这三张图片看看

可以看到三个通道已经被单独展示出来了,但是这个顺序有点奇怪,并不是我们认识上的RGB,而是BGR

我们将原图使用matplotlib(左)显示和opencv(右)显示的图片比较一下试试,果然颜色不正

我们再使用cv2.cvtColor方法把BGR转回RGB,再用matplotlib显示看看(但是使用opencv显示时颜色就不正了)

完整代码已经上传至github

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部