首先要了解,在Opencv中的图像数据通道存储顺序是BGR而不是RGB,和我们常规的显示通道顺序正好相反,可以通过结合matplotlib进行验证,并且进而实现对图像的通道分离与合并操作。
彩色图像通道分离与合并
#5,图像通道分离与合并
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
def split_Image(image):
plt.title("Saber")
plt.imshow(image)
b,g,r=cv.split(image)
cv.imshow("b",b)
cv.imshow("g",g)
cv.imshow("r",r)
return b,g,r
def merge_Image(b,g,r):
#merge三通道拼接
mergedImage=cv.merge([b,g,r])
print(mergedImage.shape)
cv.imshow("mergedImage",mergedImage)
srcImage3=cv.imread(r'F:\OutputResult\SrcImage\saber18.jpg')
cv.namedWindow("Saber",1)
cv.imshow("Saber",srcImage3)
b,g,r=split_Image(srcImage3)
merge_Image(b,g,r)
cv.waitKey(0)
cv.destroyAllWindows()
主要涉及函数:
cv.split(src):输入原图像,返回其各自的通道内对应的数组元素的值。
cv.merge(mv):要合并的矩阵的参数mv输入向量;mv中的所有矩阵必须相同尺寸和深度相同。输出通道数量将是矩阵数组中的通道总数。
程序运行结果如下:
matplotlib绘图显示原图像:
可以发现通道是正好相反的。
如果相对某一通道的所有像素值进行操作,直接按照数组形式赋值即可:
下面是分别对B,G,R通道的像素值赋值为0:
#图像通道像素值操作
import cv2 as cv
import numpy as np
srcImage3=cv.imread(r'F:\OutputResult\SrcImage\saber18.jpg')
#B,G,R三通道分别赋值为0:
#srcImage3[:,:,0]=0
#srcImage3[:,:,1]=0
srcImage3[:,:,2]=0
cv.namedWindow("Saber",1)
cv.imshow("Saber",srcImage3)
cv.waitKey(0)
cv.destroyAllWindows()
程序运行效果如下: