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

如下实验基于python==3.6.八、opencv-python==4.1.0.2五、imutils==0.5.二、numpy==1.17.0、matplotlib==3.1.1python


图片通道的拆分

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

对于一张图片有几个通道,只须要经过img.shape进行查看就好了,好比咱们读取一张图片,而后打印它的shape值github

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

img (800, 600, 3)

如今试着将三个通道拆开,并将三个图像分别展现出来3d

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

可是很奇怪,为何三张图片都变成了灰度图片了呢?code

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

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

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

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

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

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

相关文章
相关标签/搜索