Opencv——RGB图像的通道拆分(cv2.split)与合并(cv2.merge)

之前分享了有关颜色空间(色彩空间)的总结,最初的想法是想把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通道的图:
Opencv——RGB图像的通道拆分(cv2.split)与合并(cv2.merge)_第1张图片
其实到这里我们已经可以将RGB图像的三个通道分离开来了,但是又如下几条弯路也在这里一并和大家分享一下。

Tip1:分离出来的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)

RGB的红色通道拆分和合并结果如下图:
Opencv——RGB图像的通道拆分(cv2.split)与合并(cv2.merge)_第2张图片

Tip2:解决图像显示的问题

很多人可能像小编一样用的是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()的图像结果如下:
Opencv——RGB图像的通道拆分(cv2.split)与合并(cv2.merge)_第3张图片
好了,最后在放上一张全家福,当当当!
Opencv——RGB图像的通道拆分(cv2.split)与合并(cv2.merge)_第4张图片
感谢小伙伴的支持,觉得有帮助的话请双击666,走一波关注,谢谢大家!

你可能感兴趣的:(杂志杂八的东西,Opencv)