如下实验基于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