之前分享了有关颜色空间(色彩空间)的总结,最初的想法是想把RGB图像的三个通道拆分开来,结果拆分过程比较曲折,所以写一篇博客记录下来,仅供参考。
首先,我们可以利用opencv中的两个函数来拆分通道(cv2.split)和合并通道(cv2.merge),代码如下:
import cv2
img = cv2.imread('test.jpg') #opencv读取图像文件
b, g ,r =cv2.split(img) #顺序是b,g,r,不是r,g,b
merged = cv2.merge([b,g,r])
cv2.imshow('image',img)
cv2.imshow("Blue 1", b)
cv2.imshow("Green 1", g)
cv2.imshow("Red 1", r)
cv2.imshow("merged 1", merged)
cv2.waitKey(0) #一定要加cv2.waitKey(0),要不然会报错
运行结果实际上会得到五个图片窗口,这个只放上三通道和R通道的图:
其实到这里我们已经可以将RGB图像的三个通道分离开来了,但是又如下几条弯路也在这里一并和大家分享一下。
我们将RGB图像三通道拆分的过程实际上是先拆分出来,再形成了R/G/B的单通道的图像,而单通道图像就是灰度图(说起来有些绕,其实比较好理解)。如果想把它变成红色/绿色/蓝色的通道图,可以做通道合并(但其他通道分量为零),例如:我想得到红色通道图,代码如下:
import cv2
import numpy as np
img = cv2.imread('test.jpg')
b, g ,r =cv2.split(img)
zeros = np.zeros(img.shape[:2], dtype = "uint8")
merged_r = cv2.merge([zeros,zeros,r]) #通道分量为零可以理解为零矩阵
cv2.imshow('image',img)
cv2.imshow("Red 1", r)
cv2.imshow("merged_r",merged_r)
cv2.waitKey(0)
很多人可能像小编一样用的是jupyter notebook,觉得每次opencv显示窗口图像很麻烦,所以想用matplotlib来解决这一问题。但是在使用opencv和matplotlib的过程中会遇到图像反色或者生成的是伪彩色图像的问题,原因是两个读取RGB通道的顺序是不一样的,opencv的顺序是B-G-R,而matplotlib的顺序是R-G-B,所以这个区分就会产生一些矛盾。话不多说,直接放上代码供大家参考:
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('test.jpg')
b,g,r = cv2.split(img)
image= cv2.merge([r,g,b])
image_merged = cv2.merge([r,g,b])
plt.figure(figsize=(10,5))
plt.subplot(2,3,1), plt.title('image')
plt.imshow(image), plt.axis('off')
plt.subplot(2,3,2), plt.title('image_gray')
plt.imshow(image_gray,cmap='gray'), plt.axis('off')
plt.subplot(2,3,3), plt.title('image_merged')
plt.imshow(image_merged), plt.axis('off')
plt.subplot(2,3,4), plt.title('r')
plt.imshow(r,cmap='gray'), plt.axis('off')
plt.subplot(2,3,5), plt.title('g')
plt.imshow(g,cmap='gray'), plt.axis('off')
plt.subplot(2,3,6), plt.title('b')
plt.imshow(b,cmap='gray'), plt.axis('off')
plt.show()
plt.show()的图像结果如下:
好了,最后在放上一张全家福,当当当!
感谢小伙伴的支持,觉得有帮助的话请双击666,走一波关注,谢谢大家!