将RGB顔色空間轉換到Lab,修改一幅圖像的顔色;
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc.hpp>
using namespace cv;
using namespace std;
int main( int argc, char *argv[] )
{
Mat src, tar;
src = imread( argv[1] );
if( src.empty() ){
cout << "Couldn't load image" << endl;
return -1;
}
tar = imread( argv[2] );
if( tar.empty() ){
cout << "Couldn't load image" << endl;
return -1;
}
//變換到Lab和CV_32FC1
Mat src_lab, tar_lab;
cvtColor( src, src_lab, COLOR_BGR2Lab );
cvtColor( tar, tar_lab, COLOR_BGR2Lab );
src_lab.convertTo( src_lab, CV_32FC1);
tar_lab.convertTo( tar_lab, CV_32FC1);
//為每幅圖像找到每個通道的标準值和std值
Mat mean_src, mean_tar, stdd_src, stdd_tar;
meanStdDev( src_lab, mean_src, stdd_src );
meanStdDev( tar_lab, mean_tar, stdd_tar );
//拆分成獨立的通道
vector<Mat> src_chan, tar_chan;
split( src_lab, src_chan );
split( tar_lab, tar_chan );
//為每個通道計算顔色分布
for( int i = 0; i < 3; i++ ){
tar_chan[i] -= mean_tar.at<double>(i);
tar_chan[i] *= (stdd_src.at<double>(i) /stdd_src.at<double>(i) );
tar_chan[i] += mean_src.at<double>(i);
cout << "mean_tar[" << i << "]: " << mean_tar.at<double>(i) << endl;
cout << "stdd_src.at<double>(" << i << "): " << stdd_src.at<double>(i) << endl;
cout << "(stdd_src.at<double>(i) /stdd_src.at<double>(i) )" <<
(stdd_src.at<double>(i) /stdd_src.at<double>(i) ) << endl;
}
//合并通道,轉換到CV_8UC1的每個通道,并轉換到BGR
Mat output;
merge( tar_chan, output );
output.convertTo( output, CV_8UC1 );
cvtColor( output, output, COLOR_Lab2BGR );
namedWindow( "Source Image", WINDOW_AUTOSIZE );
imshow("Source Image", src);
namedWindow( "Target Image", WINDOW_AUTOSIZE );
imshow("Target Image", tar);
namedWindow( "Result Image", WINDOW_AUTOSIZE );
imshow("Result Image", output);
imwrite("result.jpg", output);
waitKey(0);
return 0;
}
結果