OpenCV 改變圖片顏色 C++

將RGB顏色空間轉換到Lab,修改一幅圖像的顏色;

 

/*
 * color_transfer.cpp
 *
 *  Created on: May 21, 2018
 *      Author: cui
 */

#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;
}


 

結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章