现在的位置: 首页 > 综合 > 正文

PhotoShop算法实现– Gamma校正(指数变换)(五)

2017年10月04日 ⁄ 综合 ⁄ 共 1189字 ⁄ 字号 评论关闭

PhotoShop算法实现--Gamma校正(指数变换)(五)

kezunhai@gmail.com

http://blog.csdn.net/kezunhai

          Gamma曲线是一种特殊的色调曲线,当Gamma值大于1时,曲线为与坐标轴成45°的直线,这个时候输出亮度等于输入亮度;当Gammaa大于1时,则会造成输出亮度增大;当Gamma小于1时则会造成亮度暗化。  Gamma校正(Gamma Correction)就是通过一定的方法来矫正图像亮度的偏差。在一定情况下,它用于平滑地扩展暗调的细节。当作为Gamma校正的值大于1时,图像的高亮部分被压缩而暗调部分被扩展;当Gamma矫正值小于1时,图像的高亮部分被扩展而暗调被压缩。如下图所示:


计算公式如下所示:


实现代码:

// Gamma 矫正量[0.1, 5.0]
void PhotoShop::GammaaCorrect(Mat& img, Mat& cImg, float gamma)
{
	if ( cImg.empty())	
		cImg.create(img.rows, img.cols, img.type());		

	cImg = cv::Scalar::all(0);

	int i, j;
	Size size = img.size();
	int chns = img.channels();

	if (img.isContinuous() && cImg.isContinuous())
	{
		size.width *= size.height; 
		size.height = 1;
	}

	// 验证参数范围
	if ( gamma<0.1) gamma = -0.1;
	if ( gamma> 5.0) gamma = 5.0;	

	// 加速,建立查找表
	unsigned char lut[256];  
	for(  i = 0; i < 256; i++ )  
	{  
		lut[i] = saturate_cast<uchar>(cv::pow((float)(i/255.0), gamma) * 255.0f);  
	} 

	for (  i= 0; i<size.height; ++i)
	{
		const unsigned char* src = (const unsigned char*)(img.data+ img.step*i);
		unsigned char* dst = (unsigned char*)cImg.data+cImg.step*i;
		for (  j=0; j<size.width; ++j)
		{					
			dst[j*chns] = lut[src[j*chns]];
			dst[j*chns+1] = lut[src[j*chns+1]];
			dst[j*chns+2] = lut[src[j*chns+2]];		
		}
	}	
}

实现效果图:

更多有关Gamma校正的资料参考:

1、gamma校正

2、Gamma校正及其OpenCV实现 

作者:kezunhai 出处:http://blog.csdn.net/kezunhai 欢迎转载或分享,但请务必声明文章出处。

抱歉!评论已关闭.