天天看點

OpenCV 改變圖檔顔色 C++

将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;

}

結果

OpenCV 改變圖檔顔色 C++

繼續閱讀