iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 28
2
Software Development

C++ 30天屠龍記系列 第 28

C++ 30天屠龍記(第28天): OpenCV圖片美化

OpenCV

大綱

  1. 介紹Gamma Correction(Underexposure)
  2. 代碼

介紹Gamma

好吧我們可以用OpenCV嘗試處理曝光不足的圖片,例如

那好了代碼是怎樣的呢?

void gammaCorrection(const Mat &img, const double gamma)
{
    CV_Assert(gamma_ >= 0);
    //! [changing-contrast-brightness-gamma-correction]
    Mat lookUpTable(1, 256, CV_8U);
    uchar* p = lookUpTable.ptr();
    for( int i = 0; i < 256; ++i)
        p[i] = saturate_cast<uchar>(pow(i / 255.0, gamma_) * 255.0);

    Mat res = img.clone();
    LUT(img, lookUpTable, res);
    //! [changing-contrast-brightness-gamma-correction]

    hconcat(img, res, img_gamma_corrected);
    imshow("Gamma correction", img_gamma_corrected);
}
int main(){
 Mat image;
    image = cv::imread(argv[1], 1);
    Mat large;
    //resize(image, large, Size(), 10.0, 10.0, INTER_AREA);

    //gamma 部分
    //我們先設一個Gamma值
    auto gamma = 0.4;
    Mat lookUpTable(1, 256, CV_8U);
    auto p = lookUpTable.ptr();
    //轉換顏色數值
    for(auto i = 0;i<256;i++){
    	//這是CV特有的Cast,專門處理Pixel的
    	p[i] = saturate_cast<uchar>(pow(i / 255.0, gamma) * 255.0);
    }
    auto res = img.clone();
    //用這個新的Lookuptable 去運作image,得出Res
    LUT(img, lookUpTable, res);
    //把 img ,res合併以得出真正的Image--img_gamma_corrected
 	hconcat(img, res, img_gamma_corrected);
 	//gamma完畢


    imwrite("large.jpeg", large);

    namedWindow("Display Image", WINDOW_AUTOSIZE);
    imshow("Display Image", large);
    waitKey(0);

    return 0;
}

然後你可以運行一下Code,應該看到不錯的結果
那麼如果我們需要使用幾個方法開處理圖片。我們可以把他們寫成lambda

//這是昨日的東西
auto enlarge_image = [](auto& image, auto size){
	Mat large;
	resize(image, large, Size(), size, size, INTER_AREA);
	imwrite("large.jpeg", large);
	return large;
}; 
//今天第一個方法
auto gamma_corections = [](auto& image, auto gamma){
	auto gamma = 0.4;
	//更改Lookup table(轉換顏色的方法)
	Mat lookUpTable(1, 256, CV_8U);
	auto p = lookUpTable.ptr();
	for(auto i = 0;i<256;i++){
    	p[i] = saturate_cast<uchar>(pow(i / 255.0, gamma) * 255.0);
    }
    //應用方法
    auto res = image.clone();
    LUT(image, lookUpTable, res);
    return res;
};
//如果要放大新圖片就不能用compare了
auto compares = [](auto& old, auto& newer){
	Mat compare;
	hconcat(old, newer, compare);
	return compare;
};

今天就這樣了,本來還要說Equalize Histogram的,但是效果一般就不講了


上一篇
C++ 30天屠龍記(第27天):OpenCV大法好(一)
下一篇
C++ 30天屠龍記(第28天): FFMPEG超速影片剪輯
系列文
C++ 30天屠龍記30

尚未有邦友留言

立即登入留言