基本思想:因为考试华为中级AI需要,简单记录一下复习的图像知识,使用OpenCV进行像素通道的分离和合并
#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
using namespace std;
using namespace cv;
int main() {
Mat img = imread("/home/ubuntu/Downloads/a.jpeg");
cout << img.cols << " " << img.rows << endl;
Mat result;
vector<Mat> channel;
split(img, channel);//分离颜色空间
Mat empty = cv::Mat::zeros(cv::Size(img.cols, img.rows), CV_8UC1);;
vector<Mat> merge_channel;
merge_channel.push_back(empty); //去填充opencv bgr 的 b空间
merge_channel.push_back(empty); //去填充opencv bgr 的 g空间
merge_channel.push_back(channel[2]);
merge(merge_channel, result); //合并颜色空间
imwrite("R.jpg", result); //其他空间操作雷同
merge_channel.clear();
vector<Mat>().swap(merge_channel);
merge_channel.push_back(empty); //去填充opencv bgr 的 b空间
merge_channel.push_back(channel[1]); //去填充opencv bgr 的 g空间
merge_channel.push_back(empty);
merge(merge_channel, result); //合并颜色空间
imwrite("G.jpg", result); //其他空间操作雷同
merge_channel.clear();
vector<Mat>().swap(merge_channel);
merge_channel.push_back(channel[0]); //去填充opencv bgr 的 b空间
merge_channel.push_back(empty); //去填充opencv bgr 的 g空间
merge_channel.push_back(empty);
merge(merge_channel, result); //合并颜色空间
imwrite("B.jpg", result); //其他空间操作雷同
merge_channel.clear();
vector<Mat>().swap(merge_channel);
Mat B_imge=imread("/home/ubuntu/CLionProjects/test/cmake-build-debug/B.jpg");
Mat R_imge=imread("/home/ubuntu/CLionProjects/test/cmake-build-debug/R.jpg");
Mat G_imge=imread("/home/ubuntu/CLionProjects/test/cmake-build-debug/G.jpg");
//
result =B_imge+G_imge+R_imge;
imwrite("origial.jpeg",result);
add(B_imge,R_imge,result);
add(result,G_imge,result);
imwrite("addoriginal.jpg",result);
Mat pre_image=imread("/home/ubuntu/mpv-shot0001.jpg");
Mat now_image=imread("/home/ubuntu/mpv-shot0002.jpg");
imshow("subtract",now_image-pre_image);
//减法操作 似乎 相差帧的背景变化很少的时候 有用
waitKey(0);
return 0;
}
个人理解,单通道显示图片一定时黑白色彩,无论单通道使用B通道\G通道\R通道,都是纯色的灰度图;
但是如果使用三通道显示一张图片,组成[B 0 0] 即图片显示为蓝色,以此类推;