当前位置:网站首页>Chapter3、色调映射
Chapter3、色调映射
2022-08-05 07:17:00 【王大队长】
色调映射大体上说就是使HDR图像能够在我们的低动态范围的显示器(LDR)显示出来,并且尽量符合人眼视觉体验。
3.1、TMO MATLAB框架
通常,无论属于哪一类TMO,都有两个共同的步骤。 本节描述了大多数但不是全部TMO使用的通用例程。 第一步是从输入的HDR图像或帧中提取亮度信息。 这是因为TMO通常在亮度通道上工作,从而避免了颜色压缩。 第二步是恢复压缩图像中的颜色信息。 list3.1和list3.2中显示了这两个步骤的实现。
在list3.1的第一步中,检查输入图像img,看它是否由三个颜色通道组成。 然后,使用函数lum.m在文件夹ColorSpace下提取亮度通道。 请注意,对于本章将介绍的每个TMO,用于确定输出图像外观的可选输入参数imgOut,进行了验证。如果不存在,则将它们设置为其作者建议的默认值。
在list3.2的最后一步中,将文件夹Tmo / util中的ChangeLuminance.m应用于img,以删除旧的亮度L,然后用Ld替换它,以获得imgOut。 可选步骤是颜色校正。 许多TMO通过将公式(3.2)应用于最终输出来处理此问题。 但是,由于颜色外观可能会根据TMO的参数而有很大差异,因此省去了这一额外的过程。 list3.3中显示了ColorCorrection文件夹下的ColorCorrection.m函数,该函数以简单的方式将公式(3.2)应用于输入图像。 注意,校正值cc_s可以是每个像素校正的单通道图像。
本书中所有已实现的TMO都在[0,1]中产生线性色调映射值。 为了在显示器上正确显示色调映射的图像,需要应用监视器的反特性。 对于标准LCD和CRT显示器,一种简单的方法是通过调用文件夹Tmo中的GammaTMO.m函数来应用反伽马函数(通常使用γ= 2.2)或通过调用ConvertRGBtosRGB.m应用sRGB非线性函数。 在ColorSpace文件夹中。
matlab代码演示:
clc
clear
hdr=hdrread("Bottles_Small.hdr");
hdr_r=hdr(:,:,1);
hdr_g=hdr(:,:,2);
hdr_b=hdr(:,:,3);
%提取亮度信息
L=lum(hdr);
Lmax=max(L(:));
%颜色校正
cc_s=0.5;
Ld = L / Lmax; %这里我仅仅是用了真实亮度和显示器亮度的线性映射,这显然是不好的。
imgout = ChangeLuminance(hdr, L, Ld);
for i=1:size(hdr, 3)
imgout(:,:,i) = ((hdr(:,:,i) ./ L).^cc_s) .* Ld;
end
RGBout=ConvertRGBtosRGB(imgout,0);
%RGBout=GammaTMO(imgout,2.2,0,0); %这个函数做了一个gamma矫正,正如上文所说,用上一行的那个函数也行
%如果像素值大于1,压缩到1,如果像素值小于0,压缩到0
RGBout(RGBout>1)=1;
RGBout(RGBout<0)=0;
figure(1)
imshow([hdr RGBout]);
title('原图 输出图');
结果(GammaTMO):注:这里的原图指的是未经过色调映射的图像,下同
结果(ConvertRGBtosRGB):
貌似区别不大。通过上面的代码我们就完成了上文所说的通常的两个步骤:改变亮度和颜色校正。当然在这里我们改变亮度的方式并不好所以得到的结果比较暗,在后文给出了更好的方法和结果。
3.2、全局算子
对输入图像的每个像素使用相同的算子,保存全局对比度。算子有时可能会对图像进行第一遍计算,以计算图像统计信息。这些随后用于优化动态范围减小。通常为色调映射计算的一些常见统计数据是最大亮度,最小亮度以及对数或算术平均值;请参见第1.1.3节。为了提高鲁棒性并避免离群值,这些统计数据使用百分位来计算,尤其是对于最小值和最大值,因为它们可能会在图像捕获期间受到噪声的影响。将全局运算符扩展到时域相对简单。在大多数情况下,在时间上过滤计算出的图像统计数据就足够了,从而减少或避免了由于序列中帧的时间不连续性而可能产生的闪烁伪影。全局算子的主要缺点是,由于他们利用了全局图像统计信息,因此无法保持局部对比度和原始HDR图像的精细细节。
简单易懂的算子基于实际功能,例如线性缩放,对数函数和指数函数。 尽管它们通常快速且易于实现,但它们不能完全准确地压缩动态范围。
线性曝光:
线性曝光是一种直观的HDR图像可视化方法。起始图像乘以一个因子e,这个因子在概念上类似于数码相机的曝光:用户基于可视化的有趣信息选择e。 当e = 1 /Lw,max时,这种缩放被称为归一化,它会导致非常暗的外观; 参见图3.2(a)。 如果通过最大程度地曝光像素数来计算e,则缩放称为自动曝光[285]; 参见图3.2(b)。 Ward [406]提出通过使用TVI函数匹配图像和显示器中的阈值可见性来进行计算; 参见第1.1.2节。 但是,简单的线性比例无法压缩场景的动态范围,因此只能显示一片信息。
对数映射:
q∈[1,∞),k∈[1,∞)由用户进行选择。
指数映射:
k∈(0,∞)
指数映射和对数映射都可以很好地处理中等动态范围内容。 但是,这些算子在尝试压缩完整的HDR内容时会遇到困难。 这可能会导致图像的外观非常暗或明亮,全局对比度的保留率较低以及外观不自然。
matlab代码演示:
clc
clear
hdr=hdrread("CS_Warwick.hdr");
hdr_r=hdr(:,:,1);
hdr_g=hdr(:,:,2);
hdr_b=hdr(:,:,3);
%提取亮度信息
L=lum(hdr);
Lmax=max(L(:));
Lwa = logMean(L);
%归一化映射
%Ld = L / Lmax;
%对数映射
%q=1.0;k=1;
%Ld = L / Lmax;
%Ld = log10(1+q*L) / log10(1+k*Lmax);
%指数映射
Ld = 1 - exp(-0.1 * (L / Lwa));
imgout = ChangeLuminance(hdr, L, Ld);
%颜色校正
cc_s=0.5;
for i=1:size(hdr, 3)
imgout(:,:,i) = ((hdr(:,:,i) ./ L).^cc_s) .* Ld;
end
RGBout=ConvertRGBtosRGB(imgout,0);
%RGBout=GammaTMO(imgout,2.2,0,0);
%如果像素值大于1,压缩到1,如果像素值小于0,压缩到0
RGBout(RGBout>1)=1;
RGBout(RGBout<0)=0;
figure(1)
imshow([hdr RGBout]);
title('原图 输出图');
分别改变代码中的Ld以获得不同的映射结果
线性映射:
对数映射:
指数映射(k=0.1):
3.2.2、HDR生成亮度信息
Tumblin和Rushmeier [373]提出了计算机图形学领域的第一个TMO。 随后,Tumblin等人对其进行了修订。 [372]。 该操作员的灵感来自HVS,并采用了史蒂文斯(Stevens)和史蒂文斯(Stevens)关于亮度的工作[353,354]。 TMO定义为:
其中Ld为显示器的适应亮度(LDR显示器为30–100 cd / m2)。 函数γ(x)是人类适应亮度值x的史蒂文斯和史蒂文斯的CSF,定义为
最后,m是自适应尺度项,用于防止夜间异常灰度图像。它被定义为:
其中Cmax为显示器的最大对比度。
list3.6提供了Tumblin等人的MATLAB代码。 完整的代码可以在文件TumblinTMO.m中找到。 该方法将显示器的以下参数作为输入:显示器的适应亮度L da(默认值为20 cd / m2),显示器的最大亮度Ld Max(默认值为100 cd / m2)和最大值 对比度,C Max(默认为100)。 Lwa是公式(3.5)和公式(3.7)中的Lw,H,它使用文件夹Tmo / util中的logMean.m计算为img的几何平均值。
下一步是计算史蒂文斯和史蒂文斯的CSFγ(x),以适应两个观察者的亮度适应(实际输入图像和显示图像)。 这是使用实现公式(3.6)的函数StevensCSF.m计算的,可以在Tmo / util文件夹中找到; 参见清单3.7。
然后,如等式(3.7)中计算与适应相关的缩放项m,其与代码中的m相对应。 最后,使用等式(3.5)计算压缩亮度Ld。
matlab代码演示:
%% Brightness Reproduction
%TumblinTMO
clc
clear
hdr=hdrread("Bottles_Small.hdr");
hdr_r=hdr(:,:,1);
hdr_g=hdr(:,:,2);
hdr_b=hdr(:,:,3);
%亮度压缩
L=lum(hdr);
Lmax=max(L(:));
L_wa=logMean(L);
gamma_w=StevensCSF(L_wa);
%显示器的适应亮度Lda
L_da=30;
gamma_d=StevensCSF(L_da);
gamma_wd=gamma_w/(1.855+0.4*log(L_da));
%Cmax为显示器的最大对比度。
C_max=100;
m=C_max.^((gamma_wd-1)/2.0);
Ld=L_da*m.*((L/L_wa).^(gamma_w/gamma_d));
Ld=Ld/Lmax;
%颜色校正
cc_s=0.5;
imgout = ChangeLuminance(hdr, L, Ld);
for i=1:size(hdr, 3)
imgout(:,:,i) = ((hdr(:,:,i) ./ Ld).^cc_s) .* Ld;
end
RGBout=ConvertRGBtosRGB(imgout,0);
%如果像素值大于1,压缩到1,如果像素值小于0,压缩到0
RGBout(RGBout>1)=1;
RGBout(RGBout<0)=0;
RGBout=RemoveSpecials(RGBout);
imshow([hdr,RGBout]);
title('原图 输出图像')
结果:
3.2.3、HDR量化
Schlick [341]提出了一种基于有理函数的算子,以提供一种直接直观的色调映射方法。 TMO定义为:
其中p∈[1,∞),它可以自动估算为 :
变量N是输出显示的位数,L0是HVS可以感知的监视器的最低亮度值。 由于将相同的函数应用于所有像素,因此在公式(3.9)中使用p是统一的量化过程。 可以使用如下自适应参数p进行非均匀量化处理:
其中k∈[0,1]是用户选择的不均匀权重,L w,avg(x)是围绕像素的给定区域的平均亮度强度。 这种不统一过程的行为通常与局部算子相关。 Schlick在所有实验中均使用k = 0.5。 还提出了三种计算平均亮度强度值Lw,avg(x)的技术。 有关更多详细信息,请参阅Schlick的原始文章[341]。 这种不统一的过程可以由以下事实证明:
人眼在图像中从一个点连续移动到另一点。 对于眼睛所关注的每个点,都存在一个周围区域,该区域创建局部适应并修改亮度感知。 量化技术提供了一种简单且计算速度快的TMO。 参见图3.4。 但是,用户需要为每个图像指定适当的k值。
清单3.8提供了Schlick TMO [341]的MATLAB代码。完整代码可在文件SchlickTMO.m中找到。参数s模式指定所使用的Schlick技术的模型类型。共有三种模式:手动,自动和不一致。手动模式将参数p作为用户的输入。自动模式和非均匀模式分别使用均匀和非均匀量化技术。取决于使用的模式,变量p是p或p',nBit是输出显示的位数N,L0是L0,k是k。第一步是以一种健壮的方式(以避免出现不愉快的现象)来计算最大值L Max和最小亮度L Min,即计算百分位数。这些值可用于计算p。然后,基于s模式,选择三种模态之一,p由用户给定(手动模式),或者使用公式(3.9)(自动模式)或使用公式(3.10)(非均匀模式)计算。最后,通过应用公式(3.8)来减小亮度通道的动态范围
matlab代码验证:
%% HDR量化
% Schlick TMO
clc
clear
hdr=hdrread("Bottles_Small.hdr");
hdr_r=hdr(:,:,1);
hdr_g=hdr(:,:,2);
hdr_b=hdr(:,:,3);
%亮度压缩
L=lum(hdr);
%计算最大亮度
Lmax=MaxQuart(L,0.99); % 将亮度通道顺序排列,返回亮度通道中99%位置的亮度
%计算最小亮度
Lmin=MaxQuart(L(L>0.0),0.01); % 返回1%位置的亮度
L0=1;
nBit = 8; % N=8
k=1;
s_mode = 'nonuniform';
switch s_mode
case 'manual'
p = max([p,1]); %使用这个前先自己定义一个变量p并设定其值
case 'automatic'
p = L0 * Lmax / (2^nBit * Lmin);
case 'nonuniform'
p = L0 * Lmax / (2^nBit * Lmin);
p = p * (1 - k + k * L / sqrt(Lmax * Lmin));
end
Ld=p.*L./((p-1).*L+Lmax);
imgout=ChangeLuminance(hdr, L, Ld);
%颜色校正
cc_s=0.5;
for i=1:size(hdr, 3)
imgout(:,:,i) = ((hdr(:,:,i) ./ Ld).^cc_s) .* Ld;
end
RGBout=ConvertRGBtosRGB(imgout,0);
%如果像素值大于1,压缩到1,如果像素值小于0,压缩到0
RGBout(RGBout>1)=1;
RGBout(RGBout<0)=0;
RGBout=RemoveSpecials(RGBout);
imshow([hdr,RGBout]);
title('原图 输出图')
结果:
3.2.4、一种视觉适应的模型
Ferwerda等人[130]提出了一个基于主观实验的TMO,随后由Durand和Dorsey[117]进行了扩展。该算子对HVS的各个方面进行了建模,如阈值可见性、颜色外观、视力和灵敏度随时间的变化,这些变化依赖于HVS的适应机制;见图3.5。
这是通过使用TVI函数建模视锥细胞(TVIp,光视视觉)和视杆细胞(TVIs,暗视视觉)来实现的。这些函数被定义为
该操作符是用于模拟光色条件的每个颜色通道的线性尺度,并添加到用于模拟暗色条件的消色差项中。
该运算符为:
其中Ld,a是显示器的亮度适应(例如,Ld、=Ld,max/2,其中Ld,最大值是显示器的最大亮度水平),Lwa是图像的亮度适应(例如,Lwa=Lw,max),先生和mc是依赖于TVI函数的两个比例因子。它们被定义为
TMO模拟了HVS的许多方面,但动态范围的减少是通过一个简单的线性尺度来实现的,不能应用剧烈的范围压缩。
MATLAB代码验证
clc
clear
hdr=hdrread("CS_Warwick.hdr");
%提取亮度信息
L=lum(hdr);
d_b = 0.5;
d_Ld_Max = 100;
Lwa = logMean (L );
Lwa = Lwa / ((1.0 + d_b - 0.85) ^5) ;
LMax = max (L (:) );
L_s = L / Lwa ; % scale by Lwa
LMax_s = LMax / Lwa ;
c1 = log ( d_b ) / log (0.5) ;
p1 = ( d_Ld_Max / 100.0) / ( log10 (1 + LMax_s ) );
p2 = log (1.0 + L_s ) ./ log (2.0 + 8.0 * (( L_s / LMax_s ) .^ c1 ) );
Ld = p1 * p2 ;
imgout = ChangeLuminance(hdr, L, Ld);
%颜色校正
cc_s=0.5;
for i=1:size(hdr, 3)
imgout(:,:,i) = ((hdr(:,:,i) ./ L).^cc_s) .* Ld;
end
RGBout=ConvertRGBtosRGB(imgout,0);
%RGBout=GammaTMO(imgout,2.2,0,0);
%如果像素值大于1,压缩到1,如果像素值小于0,压缩到0
RGBout(RGBout>1)=1;
RGBout(RGBout<0)=0;
figure(1)
imshow([hdr RGBout]);
title('原图 输出图');
结果:
待更新..
参考资料:
3.2 Global Operators全局算子 (Advanced High Dynamic Range Imaging )_岁月蹉跎的一杯酒的博客-CSDN博客
边栏推荐
- 【LeetCode】235.二叉搜索树的最近公共祖先
- 风控特征的优化分箱,看看这样教科书的操作
- JS实现从照片中裁切自已的肖像
- openSource 知:社区贡献
- 二叉树进阶复习1
- 利用Jenkins的持续集成
- PCI Pharma Services Announces Multi-Million Dollar Expansion of UK Manufacturing Facility to Meet Growing Demand for Global High Potency Drug Manufacturing Services to Support Oncology Treatment
- Libpq 是否支持读写分离配置
- 关于MP3文件中找不到TAG标签的问题
- An IP conflict is reported after installing the software on a dedicated computer terminal
猜你喜欢
Flink Learning 11: Flink Program Parallelism
利用Jenkins的持续集成
In the anaconda Promat interface, import torch is passed, and the error is reported in the jupyter notebook (only provide ideas and understanding!)
数据库——概述
Illegal key size 报错问题
每月稳定干2万
线程池的创建及参数设置详解
双向循环带头链表
Mysql为什么 建立数据库失败
【 LeetCode 】 235. A binary search tree in recent common ancestor
随机推荐
RK3568 environment installation
算法拾遗十五补链表相关面试题
TRACE32——List源代码查看
691. 立方体IV
二叉搜索树问题
693. 行程排序
TCP sticky packet unpacking problem + solution
Week 8 Document Clustering
数据库——概述
Flink学习11:flink程序并行度
MAYA大炮建模
环网冗余式CAN/光纤转换器 CAN总线转光纤转换器中继集线器hub光端机
DeFi 前景展望:概览主流 DeFi 协议二季度进展
C# FileSystemWatcher
VXE-Table融合多语言
GAN生成动漫头像Pytorch
After working for 3 years, I recalled the comparison between the past and the present when I first started, and joked about my testing career
【Dynamic type detection Objective-C】
binary search tree problem
2022起重机司机(限桥式起重机)考试题库及模拟考试