使用文献中提供的方法思路,实现使用对数映射函数来提高图像对比度。
该论文实现是我很久之前一个课程的结课小项目,现在将其开源,写得不好,还请指教。
Matlab代码开源链接(个人Gitee):Adaptive Logarithmic Mapping: 论文的实现Adaptive Logarithmic Mapping For Displaying High Contrast Scenes
参考论文《Adaptive Logarithmic Mapping For Displaying High Contrast Scenes》提出了一种快速、高质量的色调映射技术,以在亮度值动态范围有限 的设备上显示高对比度图像。论文的原意是用在高对比场景下的自适应对数 映射算法,该方法基于亮度值的对数压缩,模仿人类对光的反应。引入偏置 幂函数自适应地改变对数基,可以很好地保留细节和对比度。为了提高暗色区域的对比度,论文还改进了伽玛校正方法。总结下来,该映射方法具有普适 性,对所有图像都能适用,而不是仅适用于某些特定的图像,而且具有自适应 性,可以根据图像自身的情况调整参数。
一、自适应对数映射方法简介
人眼亮度响应性质
论文开篇基于人眼对亮度的响应具有对数性质展开研究。人眼正是通过这一对数性质来接收宽达 10^8
倍的亮度范围。但是人所能察觉到的亮度增量的度量是以 B 为底的 对数增量形式,不是线性增量。其测算公式如下:
传统对数映射
根据人眼对于亮度的响应性质,论文提出一个假设
,认为显示器给人眼看到的亮度值
和场景亮度值
(
原图像亮度值
)
之
间
存在如下对数映射关系
:
这个亮度关系式的好处是能把图像最大像素亮度映射为数值 1,其他像素会由于对数关,系呈现缓慢上升的趋势。然而,通过这个亮度关系式运算后,我们发现图像整体的亮度过度压缩了,并且会感觉到图像的高对比度内容失真。于是,参考论文进一步展开了自适应对数映射的算法研究。
基于上面公式缺点,参考论文提出了自己的色调映射方案,其设计的方案遵循以下原则:
1)不管外界场景颜色如何丰富多变,算法必须都能输出连续的结果;
2)它应该具有自适应性和可扩展性,能显示出场景的物理本质同时不得引入对比度反 转和光晕。总的亮度也必须忠实于实际的内容;
3)算法也需要对用户友好,也就是说在大部分情况下需要能自动实现,少数情况需要 调节一些比较直观的参数。
改进的自适应对数基偏置
参考论文采用的是我们数学中耳熟能详的对数换底公式进行展开的。其数学变换公式如下:
上述公式的缺点是,当对数基小于 2 时,其值迅速增加,导致曝光调整很困难。另 一方面,当对数基大于 10 时,亮度压缩的量很小,导致这个图片丢失了太多的对比 度。同时,高对数基时会有一些颜色偏移的现象。上述公式不同对数基得出的映射 变换如下图 1所示:
为了实现不同像素与不同的对数基以及像素的连续性的要求,参考论文还借鉴了 Perlin 和 Hoffert 的偏置对数函数,该函数是纹理分析的标准工具并且在计算机视觉与图像处理上广为应用。偏置函数定义在单位区间[0,1]之间的 power 函数,有一个参 数 b,直接决定了输出值的大小,这是参考论文中提出的最具特色的色调映射函数,即 根据每个像素的信息来自适应的调整函数中的对数基,具体公式如下:
根据上述公式取不同 b 值得到的对数基作为对数映射变换对比如下图 2 所示:
由上图 2 可以发现,通过引入幂函数和偏置值 b 后,图像的亮度情况可以进行动态 调节了。这公的来源在于实验表明人眼对亮度的感受值和实际值之间符合对数曲线, 为了使得对数变换变得“平滑”,使用了上面的偏置函数,该函数就是将一个数值 t 做一 个指数变换,来达到调节的目的,当 b=0.5 时
, ,
当 b=0.73 时,
,
得到的调整 函数最接近𝛾𝛾 = 2.2
的矫正结果.论文尝试了一系列的 b 值,最后认为 b=0.85 时,效果是 最好的。
核心对比度映射算法
根据参考论文的描述,将算法流程归纳如下:
1) 将读到的 RGB 图像中各个通道像素进行归一化,再通过线性变换变换到 CIE-XYZ 色 度空间上。由于在表色空间 CIE 上,Y 分量是表征亮度信息,我们根据公式,算出 图像中最大亮度
,即上述的
场景亮度的最大值。
2) 根据公式,以及自适应动态映射的思路,得到了新的亮度公式如下:
其中
是指显示设备的显示能力,一般取
=100cd/m2 ,再乘以比例系数0.01, 代表常用的 CRT 显示器的显示能力。然后,第二个分式中,根据对数的换底公式不难发
现,第二个分式的对数基取值范围是在 2 到 10 之间(也即分式的分母括号中部分)。于是,整个亮度公式
便是一个动态调节的版本,也就是自适应对数映射。不同 b 值和不 同 World Luminance 对应的对数映射如下图 3 所示:
3)对映射后的结果进行 CIE-XYZ 转 RGB,进行 Gamma 校正后去归一化。
4)根据需求可添加适当参量的高斯平滑,对图像做 4X4 模板的高斯滤波处理。
Gamma 校正
现实世界中几乎所有的 CRT 显示设备、摄影胶片和许多电子照相机的光电转换特 性都是非线性的。这些非线性部件的输出与输入之间的关系(例如,电子摄像机的输 出电压与场景中光强度的关系,CRT 发射的光的强度与输入电压的关系)可以用一个幂 函数来表示:
由于该参考论文给的自适应对数变换效果还不够好,但是具体 slope 和 start 的取 值是多少,在参考论文中并没有看到描述,所以经过文献查询[1]
使用改进的伽玛校正方法校正最后的结果,其校正公式如下:
其中,start 的值和 slope 的取值可以参考文献[1],其具体公式如下:
值得注意的是,Gamma 校正可根据需求进行,并非所有图像都需要 Gamma 校正,有些图像经过 Gamma 校正后效果可能会变差。
高斯平滑处理
本项目在高斯滤波中采用了 MATLAB 自带的函数 fspecial 进行滤波,由于图像是 RGB 三通道的,所以需要分 3 个通道分别进行滤波,最后再组合成 RGB 即可。 项目添加了对于高斯滤波的可调参量 sigma, sigma 指定滤波器的标准差,默认值 是 0.5。要深刻理解的是,sigma 决定了高斯模糊核的模糊程度。从数学上来讲, 高 斯半径(sigma)对曲线形状的影响,sigma 越小,曲线越高越尖,sigma 越大,曲线越低越 平缓。因此高斯半径越小,则模糊越小,高斯半径越大,则模糊程度越大。换句话说, sigma 越小,数值分布就越集中,sigma 越大,数值分布就越分散。所以当我们使用
sigma 的值很大的时候,然后运用此模糊核对图像处理,会使图像更加模糊,在实际运 用中要根据实际的图片的质量进行参量的调节,以便获得最好的观感。
二、源码
Test.m
除此之外利用 MATLAB 中的 AppDesigner 开发了一个 自适应对数映射的综合 GUI 交互界面,以便于调整参数和保存相应处理后的的图片,进入项目文件夹后运行 GUI.mlapp 文件
提供的测试图片放在
./For_Test_img/Sample.jpg
设置参数bias=0.85 ,gamma=1.61,sigma=9 的情况下所处理的图片对比如下:


参考
[1] Parameter Values for the HDTV Standards for Production and International Programme Exchange:ITU-R BT.709-6-2015[S]. 2015.
[2]
Adaptive Logarithmic Mapping For Displaying High
Contrast Scenes