1. 程式人生 > >opencv中的影象亮度變換(影象增強)

opencv中的影象亮度變換(影象增強)

專案中遇到了影象對比度不強的影象,於是想通過對影象進行亮度變換以達到預期的影象,於是研究了一下影象的亮度變換。其實,之前在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;
}

效果圖:


參考: