好吧我們可以用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的,但是效果一般就不講了