opencv-008-图像通道的分离与合并

知识点

OpenCV中默认imread函数加载图像文件,加载进来的是三通道彩色图像,色彩空间是RGB色彩空间、通道顺序是BGR(蓝色、绿色、红色)、对于三通道的图像OpenCV中提供了两个API函数用以实现通道分离与合并。

  • split // 通道分类
  • merge // 通道合并

扩展
在很多CNN的卷积神经网络中输入的图像一般会要求[h, w, ch]其中h是高度、w是指宽度、ch是指通道数数目、OpenCV DNN模块中关于图像分类的googlenet模型输入[224,224,3]表示的就是224x224大小的三通道的彩色图像输入。

代码(c++,python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

/*
* 图像通道分离与合并
*/
int main() {
Mat src = imread("../images/baboon.jpg");
if (src.empty()) {
cout << "could not load image.." << endl;
}
imshow("input", src);

vector<Mat> mv; // mv用于存储图像分离后各通道像素
Mat dst1, dst2, dst3;

// 令蓝色通道为0
split(src, mv);
mv[0] = Scalar(0);
merge(mv, dst1);
imshow("blue == 0", dst1);

// 令绿色通道为0
split(src, mv);
mv[1] = Scalar(0);
merge(mv, dst2);
imshow("green == 0", dst2);

// 令红色通道为0
split(src, mv);
mv[2] = Scalar(0);
merge(mv, dst3);
imshow("red == 0", dst3);

waitKey(0);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import cv2 as cv

src = cv.imread("../images/baboon.jpg")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)

# 蓝色通道为零
mv = cv.split(src)
mv[0][:, :] = 0
dst1 = cv.merge(mv)
cv.imshow("output1", dst1)

# 绿色通道为零
mv = cv.split(src)
mv[1][:, :] = 0
dst2 = cv.merge(mv)
cv.imshow("output2", dst2)

# 红色通道为零
mv = cv.split(src)
mv[2][:, :] = 0
dst3 = cv.merge(mv)
cv.imshow("output3", dst3)

cv.waitKey(0)
cv.destroyAllWindows()

结果


代码地址

github