颜色转换

/*
颜色转换及其显示
*/
#include<opencv2\opencv.hpp>
#include<opencv2\imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
vector<Mat> showSeparatedChannels(vector<Mat> channels);           

int main() {
	double t = (double)getTickCount();
	vector<Mat> showSeparatedChannels(vector<Mat> channels);
	Mat img = imread("D://图片//5.jpg");
	Mat tem;
	if (img.empty()) {
		cout << "图片加载失败!" << endl;
		return -1;
	}

	imshow("img", img);
	cvtColor(img, img, COLOR_RGB2YCrCb);

	vector<Mat> channels;
	split(img, channels);

	imshow("channels[0]", channels[0]);
	imshow("channels[1]", channels[1]);
	imshow("channels[2]", channels[2]);

	vector<Mat> splitechannels = showSeparatedChannels(channels);   //把每个通道转换成3通道,以便转换图片类型

	for (int i = 0; i < 3; i++) {
		cvtColor(splitechannels[i], splitechannels[i], COLOR_YCrCb2BGR);   //转换回bgr显示
	}

	imshow("schannels[0]", splitechannels[0]);
	imshow("schannels[1]", splitechannels[1]);
	imshow("schannels[2]", splitechannels[2]);
	
	double elasped = ((double)getTickCount() - t) / getTickFrequency();
	cout << "t = " << elasped << endl;
	waitKey(0);
	destroyAllWindows;
	return 0;
}


vector<Mat> showSeparatedChannels(vector<Mat> channels){

	vector<Mat> splitechannels;        //返回值

	for (int i = 0; i < 3; i++) {

		Mat zero = Mat::zeros(channels[0].size(), channels[0].type());   //定义一个通道向量,并且数据初始化为0
		vector<Mat> combine;   

		for (int j = 0; j < 3; j++) {
			if (i == j) {          //对应通道填相应的值
				combine.push_back(channels[i]);
			}
			else
				combine.push_back(zero);    //对于其他通道做一些数据填充
		}

		Mat final;
		merge(combine, final);      //把通道信息合并到图片上
		splitechannels.push_back(final);   //合并3次
	}
	return splitechannels;
}

运行结果:

颜色转换_第1张图片

你可能感兴趣的:(颜色转换)