3.5.3 Interactive Local Manipulation of Tonal Values(局部自动色调映射)

3.5.3 Interactive Local Manipulation of Tonal Values(局部自动色调映射)

Lischinski等人提出了一种基于用户的系统,用于修改HDR / LDR图像中的色调值。 [229]。 该系统基于Levin等人启发的画笔界面。 [222]和Agarwala等。 [9],它可以看作是一种软分段方法。 用户指定图像中的哪些区域需要通过画笔进行曝光调整; 见图3.21。

 图3.21。 Lischinski等人的自动操作器示例。 [229]应用于运河HDR图像:(a)每个区域的曝光图。 (b)平滑的曝光图; 请注意,应保留锋利的边缘。 (c)最终色调映射图像。

有四种可能的画笔:

  • 基本画笔。 为画笔所覆盖的像素设置约束,并分配w = 1的权重。
  • 亮度画笔。将约束应用于亮度类似于画笔覆盖的像素。 如果µ是笔刷下像素的平均亮度,而σ是笔刷参数,为亮度为L的像素赋权
  • Luma-chrome画笔。一种类似亮度的刷子,但它考虑亮度和色度。
  • 曝光过度画笔。选择所有被绘制的笔画包围的过度曝光像素。

一旦使用不同的笔刷绘制出笔触,系统将尝试找到一个空间变化的曝光函数f。这必须满足用户指定的约束条件,并将边缘考虑在内。在最小化方面,f可以定义为:

 其中L ' = log(L), L是LDR或HDR图像的亮度。函数w(x)∈[0,1]定义约束像素,g(x)是提供目标曝光量的函数。最小化提出了一个平滑的条件,考虑到大的梯度和被定义为:

 变量α定义了该项对对数亮度图像的导数的敏感性,而ǫ是一个小的非零值,用于避免奇点。 通过求解线性系统来计算最小值f [312]。 之后,通过应用f调整图像

最后,系统提供了一个自动的预览TMO,该TMO是继Adams[4]的zone系统之后的。利用式(3.35)将图像分割为n个区域,计算每个区域的正确曝光值为:

 

 这些曝光和片段被用作线性系统求解器的输入,生成色调映射图像。图3.21给出了一个例子。

该系统为摄影师、艺术家和用户提供了一个用户友好的GUI和一个完整的工具,用于直观地色调映射HDR图像或增强LDR图像。此外,它可以应用于其他任务,如修改景深和空间变化的白平衡。

list3.20提供了Lischinski等人的MATLAB代码。 [229] TMO。 完整代码可在LischinskiTMO.m文件中找到。 该方法将起始曝光pAlpha和最大输出亮度pWhite作为输入。 这些参数与Reinhard等人的全局运算符[323]相同。

list3.20提供了Lischinski等人的MATLAB代码。 [229] TMO。 完整代码可在LischinskiTMO.m文件中找到。 该方法将起始曝光pAlpha和最大输出亮度pWhite作为输入。 这些参数与Reinhard等人的全局运算符[323]相同。

 

 该算法从提取输入HDR图像的最小和最大亮度值开始。 使用公式(3.35)计算图像的区域数量,并将其存储在Z中。下一步是找到由变量fstopMap表示的空间变化的曝光函数f。 针对每个区域计算代表亮度值R z(Rz),作为该区域中像素的中间亮度。 Reinhard等人的全局色调映射方法。 [323]用于将Rz映射到目标值f(Rz)并存储在f中。 最后,目标曝光量存储在fstopMap中。 之后,使用Linschinski Minimization.m函数(可在Tmo / util文件夹中找到)来最小化公式(3.34),它是稀疏线性系统A·b = x的典型解。

代码:

%%
clc
clear
hdr=hdrread("HDR_040_Field_Ref.hdr");
hdr_r=hdr(:,:,1);
hdr_g=hdr(:,:,2);
hdr_b=hdr(:,:,3);
%亮度信息
L=0.2126 * hdr_r + 0.7152 * hdr_g + 0.0722 * hdr_b;
epslon=1e-6;
minLlog=log2(min(L(:))+epslon);
maxLlog=log2(max(L(:)));
%ceil朝无穷大方向取整
Z=ceil(maxLlog-minLlog);
%选择每个区域代表性的Rz
fstopMap=zeros(size(L));
Lav=logMean(L);
pAlpha = ReinhardAlpha(lum(hdr));
pWhite = ReinhardWhitePoint(lum(hdr));
for i=1:Z
    lower_i=2^(i-1+minLlog);
    upper_i=2^(i+minLlog);
    index=find(L>=lower_i&L<upper_i);
    if(~isempty(index))
        Rz=MaxQuart(L(index),0.5);
        Rz_s=(pAlpha*Rz)/Lav;
        f=(Rz_s*(1+Rz_s/(pWhite^2)))/(Rz_s+1);
        fstopMap(index)=log2(f/Rz);
    end
end
figure;imshow(fstopMap);title("区域曝光图");
%保边平滑曝光图
fstopMap=2.^LischinskiMinimization(log2(L+epslon),fstopMap,0.07*ones(size(L)));
figure;imshow(fstopMap);title("平滑区域保边图像");
imgout=zeros(size(hdr));
for i=1:size(hdr,3)
    imgout(:,:,i)=hdr(:,:,i).*fstopMap;
end
figure;imshow(imgout);title("结果图像");
%%
%matlab自带的函数
out=LischinskiTMO(hdr);
imshow(out);

原图:

 曝光区域

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章