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

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 欢迎转载或分享,但请务必声明文章出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值