1 提取
如下:
Mat img = imread("a.jpg", IMREAD_UNCHANGED);
Mat tmp = Mat(img.rows, img.cols, CV_8UC3, Scalar(255, 255, 0));
Mat red = img -tmp;
矩阵img 减去 tmp,由于tmp前面2个通道全部为255,img减去它会小于0,那结果是0,所以最终相减结果是(0,0,和img之前的R通道的值),所以这样操作就提取出了img的R通道,
G通道和B通道同理。
所以有下面的代码:
#include <stdio.h>
#include <assert.h>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;
using namespace std;
#define SIZE 400
int main(int argc, char **argv) {
Size size(SIZE, SIZE);
Mat img = imread("a.jpg", IMREAD_UNCHANGED);
Mat red = img - Mat(img.rows, img.cols, CV_8UC3, Scalar(255, 255, 0));
Mat blue = img - Mat(img.rows, img.cols, CV_8UC3, Scalar(255, 0, 255));
Mat green = img - Mat(img.rows, img.cols, CV_8UC3, Scalar(0, 255, 255));
cout << endl;
Mat result = red + blue + green;
imwrite("out.jpg", result);
namedWindow("opencv", WINDOW_FREERATIO);
imshow("111", result);
int k = waitKey(0);
return 0;
}
说明:
先提取出各个通道的值:red ,blue 和green ,
然后再通过矩阵的加法,合并得到新的图片,保存。
查看发现和之前的图片一模一样.