opencv直方图增强/Gamma矫正算法

gamma矫正算法实现原理/思路:

opencv直方图增强/Gamma矫正算法_第1张图片

实现代码:

#include 
#include 
using namespace cv;
using namespace std;

/*手动实现 gamma 矫正o*/
void program(Mat channel)
{

	int bins = 256;  
	float  *hist = new float[bins];
	memset(hist, 0, sizeof(float)*bins);  // 建立动态数组:像素查找表
	for (float i = 0; i < bins; i++)
	{ 
		float k = i / 255;               //归一化
		hist[int(i)] = pow(k, 2);       //预补偿
		hist[int(i)] = 255 * hist[int(i)];  //反归一化 并将结果存入 gamma 像素查找表 hist中
	}

	for (int n = 0; n < channel.rows; n++)
	{
		for (int m = 0; m < channel.cols; m++)
		{
			int a = channel.at(n, m);
			channel.at(n, m) = hist[a];  //遍历整个图像,将每个像素赋值为其对应的查找表中的值
		}
	}

	delete[] hist;  // 手动释放内存
}


/*主函数o*/
int main()
{
	Mat srcMat = imread("D://ͼƬ1.jpg");

	if (srcMat.empty()) 
	{
		cout << "fail to read pic!" << endl;
		return -1;
	}
	imshow("srcMat", srcMat);

	std::vector channels;
	split(srcMat, channels);                // 由于是彩色图像,需要用split将通道分离

	program(channels[0]);					//调用函数
	program(channels[1]);
	program(channels[2]);  

	Mat gamma;
	merge(channels, gamma);					//	将分离开的通道合并
	imshow("gamma", gamma);

	waitKey(0);
}

结果

依次为原图、γ=0.5、γ=2:

opencv直方图增强/Gamma矫正算法_第2张图片

opencv直方图增强/Gamma矫正算法_第3张图片

opencv直方图增强/Gamma矫正算法_第4张图片

ps:这张图片老师有设置彩蛋环节,但是由于图片像素太低了看不太清楚~ ~

opencv直方图增强/Gamma矫正算法_第5张图片 李竹老师超级帅(γ= 0.2)

你可能感兴趣的:(opencv,算法,c++)