PhotoShop算法实现--Gamma校正(指数变换)(五)
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校正
作者:kezunhai 出处:http://blog.csdn.net/kezunhai 欢迎转载或分享,但请务必声明文章出处。