[论文阅读] ALM-HCS(高对比场景自适应对数映射)
[论文阅读] ALM-HCS(高对比场景自适应对数映射)
文章: Adaptive Logarithmic Mapping for Displaying High Contrast Scenes
1. 论文目的
将高动态范围图像映射到机器可以显示的动态范围, 作者提出了几个要求:
The design of our tone mapping technique was guided by a few rules.
- It must provide consistent results despite the vast diversity of natural scenes and the possible radiance value inaccuracy found in HDR photographs.
- Additionally, it should be adaptable and extensible to address the current capabilities ofdisplaying methods and their future evolution.
- Tone mapping must capture the physical appearance of the scene, while avoiding the introduction of artifacts such as contrast reversal or black halos.
- The overall brightness of the output image must be faithful to the context. It must be “user-friendly” i.e., automatic in most cases, with a few in- tuitive parameters which provide possibility for adjustments.
- It must be fast for interactive and realtime applications while avoiding any trade-off between speed versus quality
总结起来就是:
- 具有普适性, 对所有图像都能适用, 而不是仅适用于某些特定的图像;
- 具有自适应性, 可以根据图像自身的情况调整参数;
2. 论文方法
论文方法归纳起来就是自适应对数变换(Adaptive Logarithmic Mapping) + gamma校正, 同时满足上述要求:
- 对于普适性, 论文中使用公式1, 将图像输出调整[0, 1], 再根据需要调整需要显示的动态范围(一般是[0,255]).

- 对于自适应性, 论文中使用对数变换 \(log_{base}(L_w+1)\) 来对图像的对比度进行调整, 其中,
base是根据图像自身的信息来进行调整的.
论文中的公式4就是上述过程的综合:

其中, Lw为图像中每个像素的亮度, Lwmax为图像中亮度最大值, Ldmax为显示最大值, 一般 Ldmax*0.01=1, 参数b对数函数的基底进行调整.
然后使用gamma校正来进一步调整图像. 因而论文方法步骤可以概括为:
- 自适应对数变换;
- gamma校正;
3. 论文核心
3.1 场景亮度映射到图像亮度-缩放因子很关键
论文中使用了一个缩放因子来调整图像映射后的整体亮度, 根据论文中的说明, 公式1可以更改为:

其中, 参数 Lwa 是很关键的, 这个会影响到图像最终的亮度, 如下图所示为上述公式的在不同 Lwa 下的曲线:

图中, 最上边蓝色的曲线为 Lwa=1 的情况, 与公式1是完全一样的. 我们可以看到, 当 Lwa=1 时, 曲线斜率很大, 映射后像素的亮度值会增加很大, 会导致图像整体偏亮, 对比度降低, 所以必须要有这个缩放因子.
如下所示图像测试结果(从左到右依次为: 原图, lwa=1的图像, lwa=50的图像):

可以看到, 当Lwa=1 时, 图像亮度亮度过高, 对比度低.
3.2 自适应对数映射-基底很关键
为方便理解, 这里将公式4调整为如下公式:

其中, Ldmax*0.01=1 省略了, 然后利用文中的换底公式2(\(log_{base}(x)=log(x)/log(base)\)), 可以将上式变换成公式4.
从上述调整后的公式可以看到, 对数变换的基底 base 很重要, 下图为论文中给出的 log2(左图) 和 log10(右图) 的对比效果:

从图中可以看到:
- log2 时图像整体偏亮, 对比度更强, 如右上角的暗部区域细节增强较好, 但对于较亮的区域, 如几个窗户则过度增强了, 出现了饱和, 丢失了细节;
- log10时图像整体偏暗, 对比度要低一些, 如右上角的暗部区域细节没有得到很好的增强, 但对于较亮区域的细节则保持的很好, 如几个窗户的细节清晰;
因而, 如果使用固定的基底, 则适应所有图像, 不具备普适性, 所以基底很重要, 需要具有自适应性.
这里对自适应性说明一下:
- 当亮度
Lw越小, 公式中计算出来的基底base就越小, 对数变换 \(log_{base}(L_w+1)\) 的值就越大, 亮度增加的越多; - 当亮度
Lw越大, 公式中计算出来的基底base就越大, 对数变换 \(log_{base}(L_w+1)\) 的值就越小, 亮度增加的越少;
对于不同的亮度, 计算出来的基底在[2,10]内取值, 因而可以做到自适应.
3.3 gamma校正
在自适应对数变换后, 论文中还使用了gamma校正来进一步调整图像亮度, 原因应该就是论文中的自适应对数变换效果还不够好. 论文中使用的gamma变换为ITU-R BT.709的改进, 其公式如下所示:

下图所示为论文中方法实现的效果, gamma=2.2:

上图依次为原图, 自适应对数变换, 自适应对数变换+gamma校正, 可以看到, 自适应对数变化的效果还不够好, 需要使用gamma校正来进一步提高图像效果.
4. 核心参数说明
4.1 缩放因子lwa
论文中使用场景亮度均值 Lwa 作为景亮度到图像亮度的缩放因子, 这是由于图像显示的整体亮度由场景的整体亮度决定的, 从3.1中的曲线图可以看到, 处理后图像的亮度与 lwa 成反相关:
lwa越小, 处理后图像越亮提升越多lwa越大, 处理后图像越亮提升越少
上面的关系可以这么来解释: Lwa 越小, 场景亮度越低, 亮度需要提高的就越多; Lwa 越大, 场景亮度越高, 亮度需要提升的就越少. 如下图所示为不同 Lwa 的效果, b固定为0.85, 依次为50, 100, 150:

从图中可以看到, 图像的亮度是依次降低的. 同时从3.1中的曲线图可以看到, Lwa 越大, 变换曲线越接近于直线, 起到的作用也就越低.
4.2 偏置参数b
来看看参数b对图像亮度的影响, 如下图所示为公式4在不同参数b的情况:

从上图可以看到, b的情况与lwa情况有点类似, 都与图像亮度成反相关:
- b越小, 斜率越大, 处理后图像亮度提升越多
- b越大, 斜率越小, 处理后图像亮度提升越少
但b不能小于0.7. 从上图可以看到, 当b<0.7是, 曲线不是单调函数, 且最终结果会大于1, 这样处理后的图像有副作用, 如图像太亮, 且不能保持图像中像素的相对大小. 论文中作者推荐b=0.85.
如下图所示为不同b的效果, lwa固定为亮度均值, 依次为0.5, 0.7, 0.9:

从上图可以看到, 当b=0.5时, 处理后图像并没有太亮, 且也没有出现副作用, 可能是由于lwa影响了b的效果.
4.3 lwa 与 b关系
从公式4中可以看到, 并没有lwa, 这里对公式改写如下:

下图为更改后, 不同参数的情况(b=0.5, 0.6, 0.7, 0.8, 0.9, 1.0):


从图中可以看到, lwa的效果比b的效果要明显些. 为了保持处理后的图像亮度的稳定性, 作者使用了如下公式来调整lwa:

对于公式4, b越小, 处理后图像越亮, 使用上述公式后, lwa越大, 图像亮度越小, b使图像亮度增加, lwa使图像亮度降低, 二者相互抵消. 如下图所示:

从图中可以看到, 图像亮度基本是恒定的, 但效果不是很理想, 因而还需要后续进行gamma校正处理.
4.4 最大数对数基底
如公式4中, 对最大数取对数时, 使用基底为10, 至于为什么取10, 论文中给出的解释是:
In the denominator decimal logarithm is used since the maximum luminance value in the scene is always re-sampled to decimal logarithm by the bias function.
而真正的原因应该是自适应 base 的取值为[2,10], 最大数对数基底要取这个里面的最大值, 否则得到最大数就被放大, 会压缩图像的亮度. 如下所示为基底为2的情况:

从图中可以看到, 当最大值对数取基底为2时, 处理后图像亮度没有达到最大值1, 图像亮度被压缩.
4.5 参数设置小结
对于上述分析, 这里总结下:
- 缩放因子lwa: 取图像亮度均值, 对处理后图像亮度影响较大, 对于较暗图像, 处理效果不是太理想, 需结合gamma校正;
- 参数b: 配合lwa使用, 对处理后图像亮度影响没有lwa大;
- 最大数对数基底: 需取base取值范围内的最大值, 否则图像亮度会被压缩;
- gamma校正: gamma值, 目前仅测试了gamma=2.2, 根据图像亮度进行调整(需研究方法)效果应该会更好;
5. 最终实现
5.1 效果
使用参数为: lwa=亮度均值, b=[0.5, 0.7, 0.9], gamma=2.2, 最大数对数为log10, 最终效果如下(从左到右依次为: 原图, b=0.5, b=0.7, b=0.9):

5.2 代码
作者开源了代码, 详见这里: http://resources.mpi-inf.mpg.de/tmo/logmap/. 这里使用matlab实现了, 代码如下:
img_path = './src/test.jpg';
rgb = imread(img_path);
alm = alm_hcs(rgb);
alm_g = double(alm) / 255;
alm_g = gamma_function(alm_g, 2.2);
alm_g = uint8(alm_g * 255);
impair = cat(2, rgb, alm, alm_g);
imshow(impair)
function [alm] = alm_hcs(rgb, b, lwa)
rgb = double(rgb);
% RGB转XYZ
xyz = colorConvert(rgb, 'rgb2xyz');
Y = xyz(:,:,2);
lwa = lwa / (1 + b - 0.85) ^ 5;
Y = Y / lwa;
lwmax = max(Y(:));
bias_p = log(b)/log(0.5);
div = log10(lwmax + 1);
base = 2 + power(Y / lwmax, bias_p) * 8;
Y_new = log(Y + 1) ./ log(base) / div;
% 同比例处理X,Z通道
scalefactor = Y_new ./ Y / lwa * 255;
scalefactor(Y == 0) = 0;
scalefactor = cat(3, scalefactor, scalefactor, scalefactor);
alm = scalefactor .* xyz;
alm = max(min(alm, 255), 0);
% XYZ转RGB
alm = colorConvert(alm, 'xyz2rgb');
alm = uint8(alm);
end
唯一觉得美中不足是, 论文使用的是全局映射, 没有考虑局部信息来进一步增加对比度.
[论文阅读] ALM-HCS(高对比场景自适应对数映射)的更多相关文章
- Tone Mapping算法系列二:一种自适应对数映射的高对比度图像显示技术及其速度优化。
办公室今天停电,幸好本本还有电,同事们好多都去打麻将去了,话说麻将这东西玩起来也还是有味的,不过我感觉我是输了不舒服,赢了替输的人不舒服,所以干脆拜别麻坛四五年了,在办公室一个人整理下好久前的一片论文 ...
- 论文阅读 | Region Proposal by Guided Anchoring
论文阅读 | Region Proposal by Guided Anchoring 相关链接 论文地址:https://arxiv.org/abs/1901.03278 概述 众所周知,anchor ...
- [论文阅读]阿里DIN深度兴趣网络之总体解读
[论文阅读]阿里DIN深度兴趣网络之总体解读 目录 [论文阅读]阿里DIN深度兴趣网络之总体解读 0x00 摘要 0x01 论文概要 1.1 概括 1.2 文章信息 1.3 核心观点 1.4 名词解释 ...
- 深度学*点云语义分割:CVPR2019论文阅读
深度学*点云语义分割:CVPR2019论文阅读 Point Cloud Oversegmentation with Graph-Structured Deep Metric Learning 摘要 本 ...
- 【医学图像】3D Deep Leaky Noisy-or Network 论文阅读(转)
文章来源:https://blog.csdn.net/u013058162/article/details/80470426 3D Deep Leaky Noisy-or Network 论文阅读 原 ...
- 论文阅读:《Bag of Tricks for Efficient Text Classification》
论文阅读:<Bag of Tricks for Efficient Text Classification> 2018-04-25 11:22:29 卓寿杰_SoulJoy 阅读数 954 ...
- 论文阅读:Adaptive NMS: Refining Pedestrian Detection in a Crowd
论文阅读:Adaptive NMS: Refining Pedestrian Detection in a Crowd 2019年04月11日 23:08:02 Kivee123 阅读数 836 ...
- YOLO 论文阅读
YOLO(You Only Look Once)是一个流行的目标检测方法,和Faster RCNN等state of the art方法比起来,主打检测速度快.截止到目前为止(2017年2月初),YO ...
- [论文阅读笔记] LouvainNE Hierarchical Louvain Method for High Quality and Scalable Network Embedding
[论文阅读笔记] LouvainNE: Hierarchical Louvain Method for High Quality and Scalable Network Embedding 本文结构 ...
随机推荐
- php操作redis集群哨兵模式
前段时间项目里正好用到了redis的集群哨兵部署,因为此前并无了解过,所以一脸懵逼啊,查阅了几篇资料,特此综合总结一下,作为记录. 写在前沿:随着项目的扩张,对redis的依赖也越来越大,为了增强re ...
- Java实验项目三——平面图形和立体图形抽象类
Program:按照下面要求完成类的设计 (1)设计一个平面图形抽象类和一个立体图形抽象类,提供该类对象公共的方法和属性. (2)修改项目三中第2题中所设计的球类.圆柱类,圆锥类.矩形类.三角形类.圆 ...
- ESP32-默认事件循环
默认的事件循环是一个事件循环的系统应用发布和处理事件(例如,Wi-Fi无线事件). 基于ESP-IDF4.1 1 #include "esp_log.h" 2 #include & ...
- Spring Cloud中的注解
一.Eureka @EnableEurekaServer: @EnableDiscoverClient:标注服务是一个Eureka的客户端 @LoadBalanced:自动构造LoadBalancer ...
- 【论文小综】基于外部知识的VQA(视觉问答)
我们生活在一个多模态的世界中.视觉的捕捉与理解,知识的学习与感知,语言的交流与表达,诸多方面的信息促进着我们对于世界的认知.作为多模态领域的一个典型场景,VQA旨在结合视觉的信息来回答所提出的问题 ...
- SpringMVC中@Controller和@RequestMapping用法
一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Mo ...
- Windows内核开发-3-内核编程基础
Windows内核开发-3-内核编程基础 这里会深入讲解kernel内核的API.结构体.和一些定义.考察代码在内核驱动中运行的机制.最后把所有知识合在一起写一个有用的驱动. 本章学习要点: 1:通用 ...
- Spring中定时任务@Scheduled的一点小小研究
最近做一个公众号项目,微信公众号会要求服务端找微信请求一个access_token,获取的过程: access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_tok ...
- 优化 Workerman 检查主进程是否存活的逻辑
主要新增了判断进程是否为 Workerman 进程的逻辑,从而优化了确定主进程是否存活的准确性 发现问题 年前逛 GitHub 的时候,发现 Workerman 有一个 2017 年打开的 Issue ...
- 【洛谷P1318积水面积】最小生成树
我写一篇绝对原创的题解,算法原创,求洛谷通过!!!(让更多人看到这篇题解) 绝大多数人肯定认为这道题是一道模拟题 以下为正解 我们来看一下这一道题,其实就是找到左右高点,在模拟. 但是这个是正常人的想 ...