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