opencv中的影象亮度變換(影象增強)
阿新 • • 發佈:2019-01-07
專案中遇到了影象對比度不強的影象,於是想通過對影象進行亮度變換以達到預期的影象,於是研究了一下影象的亮度變換。其實,之前在matlab中也碰到過,在岡薩雷斯的《數字影象處理(matlab版)》第47頁,有對亮度變換函式imadjust進行了講解。當然啦,也可以直接通過matlab的help,檢視imadjust的用法:
J = imadjust(I) J = imadjust(I,[low_in; high_in],[low_out; high_out]) J = imadjust(I,[low_in; high_in],[low_out; high_out],gamma) newmap = imadjust(map,[low_in; high_in],[low_out; high_out],gamma) RGB2 = imadjust(RGB1,...)
需要注意的是:low_in,high_in,low_out, high_out都在[0,1]之間,並且low_in 必須要小於high_in的,但是low_out 則可以大於high_out,這相當於對影象進行了反轉。gamma不寫的時候,預設是1,且當gamma小於1的時候趨向更亮;當gamma大於1的時候趨向於更暗。
下面我們直接上程式碼:
效果圖:>> I = imread('rice.tif'); >> J = imadjust(I,[0,0.5],[0.5,1]); >> imshow(I) >> figure,imshow(J) >>
由於需要在專案中使用,所以不得不轉換使用OpenCV來實現它。
環境:OpenCV2.46 + VS2010
程式碼如下:
// opencv學習筆記-影象亮度變換(影象增強).cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <opencv.hpp> using namespace cv; using namespace std; int imageAdjust(Mat &src,Mat &dst, double low_in,double high_in, double low_out,double high_out, double gamma) { if ( low_in < 0 && low_in >1 && high_in <0 && high_in >1 && low_out < 0 && low_out > 1 && high_out < 0 && high_out > 1 && low_out > high_out ) return -1; double low2 = low_in*255; double high2 = high_in*255; double bottom2 = low_out*255; double top2 = high_out*255; double err_in = high2 - low2; double err_out = top2 - bottom2; int x, y; double val; uchar* p; //亮度變換 for ( y = 0; y < src.cols; y++) { p = src.ptr<uchar>(y); //行指標 for ( x = 0; x < src.rows; x++) { val = pow((p[x] - low2)/err_in,gamma)*err_out + bottom2; if (val > 255 ) val = 255; if (val < 0 ) val = 0; dst.at<uchar>(y,x) = (uchar) val; } } } int _tmain(int argc, _TCHAR* argv[]) { Mat src; //讀取影象 src = imread("C:\\Documents and Settings\\Administrator\\My Documents\\MATLAB\\rice.tif",0); if(src.data == NULL) { cout << "read image failed" << endl; return -1; } //顯示源影象 imshow("rice【源影象】",src); Mat dst = src.clone(); //影象亮度變換 imageAdjust(src,dst,0,0.5,0.5,1,1); imshow("亮度變換後的圖",dst); waitKey(0); return 0; }
效果圖:
參考: