总是会遇到Gamma校正的字眼,但是真的要说明究竟什么是Gamma校正,却很难说清楚,这便是这篇博客的由来。
为了说清楚,从解决疑问的方式入手:
1.什么是Gamma校正?(what)
2.为什么要进行Gamma校正?(why)
3.怎样进行Gamma校正?(how)
1.什么是Gamma校正?
Gamma源于早期的CRT显示器的响应曲线,也就是输出亮度和输入电压的非线性关系,如图所示:
图1 亮度和输入电压的非线性关系图
由图可以看出,亮度和输入电压的关系更加近似于指数函数 (output = input ^ gamma )的关系。事实确实如此,CRT显示器厂商都默认将gamma值设为2.5,也就是如上的曲线。这里的指数,也就是我们所讨论的gamma。
2.为什么要进行Gamma校正?
我们已经知道输出和输入的非线性关系为指数函数 output = input ^ gamma,考虑指数函数的性质:
图2 指数函数性质
由图2可以看出,蓝色曲线对应指数gamma < 1,红色曲线对应指数gamma > 1,考虑一副图像,纵轴代表图像的亮度值,横轴代表自变量区间,当gamma > 1 时,随着gamma的变大,高光区对应的自变量区间逐渐变小,而低光区对应的自变量区间逐渐变大;相反,当gamma < 1 时,随着gamma的变小,高光区对应的自变量区间逐渐变大,而低光区对应的自变量区间逐渐变小。概括起来就是:gamma矫正的值大于1时,图像的高光部分被压缩而暗调部分被扩展,当gamma矫正的值小于1时,图像的高光部分被扩展而暗调部分被压缩。
至此,我们知道,通过调节gamma值,我们可以针对性地控制高光区或者低光区的显示细节(表现为:gamma > 1时,低光区被扩展高光区被压缩。表现为“越来越灰暗”,gamma < 1 是,低光区压缩而高光区扩展,表现为“越来越明亮”)。所以,我们可以根据图像的具体情况,选择合适的gamma值对图像进行校正,提升图像的显示细节。
3.怎么样进行Gamma校正?
根据Gamma校正公式 output = input ^ gamma,用MatLab做三组实验,分别对应着
(1)gamma = 0.4; (2)gamma = 1.0 ; (3) gamma = 1.8;
代码:
%Gamma校正
clear all;
img = imread('lena.jpg');%读入图像
img = rgb2gray(img);%转成灰度图,即将[0,255]转成[0,1]
imgGamma_0_4 = imadjust(img,[],[],0.4);%此处gamma = 0.4
figure,imshow(imgGamma_0_4),title('gamma = 0.4');
imgGamma_1_0 = imadjust(img,[],[],1.0);%此处gamma = 1.0
figure,imshow(imgGamma_1_0),title('gamma = 1.0');
imgGamma_1_8 = imadjust(img,[],[],1.8);%此处gamma = 1.8
figure,imshow(imgGamma_1_8),title('gamma = 1.8');
实验结果:
gamma = 0.4 gamma = 1.0 gamma = 1.8
这里引用一下http://www.cnblogs.com/zhz3996/archive/2010/01/26/1657090.html的例子:
当遇到如下所示的图例:
图3 原始图像
对于这种图像,衣服的颜色属于高光区,难以看清纹理,就是因为高光区被压缩,如果想要看清衣服的纹理(不要邪恶。。。),那么自然想到扩展高光区,根据前面所讲的,那就是将gamma值调小,从而将高光区进行扩展,可以得到如下结果:
图4 Gamma校正后的结果
总结:
通过这样的处理,明显看到衣服的纹理更加清晰。所以Gamma校正就是这样操作的,根据具体情况选择合适的gamma值。
参考:
1.http://www.cnblogs.com/zhz3996/archive/2010/01/26/1657090.html(写得很好很详细)
2.http://blog.youkuaiyun.com/love_xunmeng/article/details/8274400
3.http://www2.xitek.com/info/showarticle.php?id=2521