3.2 Global Operators全局算子 (Advanced High Dynamic Range Imaging )

3.2 Global Operators全局算子 (Advanced High Dynamic Range Imaging )

使用全局运算符,会将相同的运算符f应用于输入图像的所有像素,从而保留全局对比度。操作员有时可能会对图像进行第一遍计算,以计算图像统计信息。这些随后用于优化动态范围减小。通常为色调映射计算的一些常见统计数据是最大亮度,最小亮度以及对数或算术平均值;请参见第1.1.3节。为了提高鲁棒性并避免离群值,这些统计数据使用百分位来计算,尤其是对于最小值和最大值,因为它们可能会在图像捕获期间受到噪声的影响。将全局运算符扩展到时域相对简单。在大多数情况下,在时间上过滤计算出的图像统计数据就足够了,从而减少或避免了由于序列中帧的时间不连续性而可能产生的闪烁伪影。全局算子的主要缺点是,由于他们利用了全局图像统计信息,因此无法保持局部对比度和原始HDR图像的精细细节。

3.2.1简单亮度映射方法

简单易懂的运算符基于实际功能,例如线性缩放,对数函数和指数函数。 尽管它们通常快速且易于实现,但它们不能完全准确地压缩动态范围。

图3.2。 将简单算子应用到地窖HDR图像的示例:(a)归一化。 (b)自动曝光。 (c)对数映射q = 0.0且k =1。(d)指数映射k = 0.1。

线性曝光是一种直观的HDR图像可视化方法。起始图像乘以一个因子e,这个因子在概念上类似于数码相机的曝光:

用户基于可视化的有趣信息选择e。 当e = 1 /Lw,max时,这种缩放被称为归一化,它会导致非常暗的外观; 参见图3.2(a)。 如果通过最大程度地曝光像素数来计算e,则缩放称为自动曝光[285]; 参见图3.2(b)。 Ward [406]提出通过使用TVI函数匹配图像和显示器中的阈值可见性来进行计算; 参见第1.1.2节。 但是,简单的线性比例无法压缩场景的动态范围,因此只能显示一片信息。

对数映射将对数函数应用于HDR值。 基数是HDR图像的最大值,用于映射[0,1]范围内的非线性值。 运算符定义为:

其中q∈[1,∞)和k∈[1,∞)是用户选择的常数,用于确定所需的图像外观

清单3.4提供了对数映射运算符的MATLAB代码。 完整代码可在文件LogarithmicTMO.m中找到。 变量log q和log k分别等于等式(3.3)中的参数q和k。 图3.2(c)显示了使用对数映射运算符对q = 0.0和k = 1.0映射的图像色调的示例。

指数映射将指数函数应用于HDR值。 它将值映射到间隔[0,1],其中每个值除以算术平均值。 运算符定义为:

清单3.5提供了指数映射技术的MATLAB代码。 完整的代码可以在文件ExponetialTMO.m中找到。 在式(3.4)中,变量exp k为k。 图3.2(d)显示了k = 0.1时指数映射运算符的使用。

指数映射和对数映射都可以很好地处理中等动态范围内容。 但是,这些算子在尝试压缩完整的HDR内容时会遇到困难。 这可能会导致图像的外观非常暗或明亮,全局对比度的保留率较低以及外观不自然。

代码演示

%% Global Operators
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(:));
%亮度归一化
Ld=1/Lmax.*(L);
%对数映射
Ldlog=log10(1+10*L)./log10(1+10*Lmax);
%指数色调映射
Lwa=mean(L);
Ldexp=1-exp(-0.1*(L./Lwa));
%颜色校正
cc_s=0.5;
imgout=zeros(size(hdr));
for i=1:size(hdr, 3)
    imgout(:,:,i) = ((hdr(:,:,i) ./ Ldlog).^cc_s) .* Ldlog;
end
RGBout=ConvertRGBtosRGB(imgout,0);
%如果像素值大于1,压缩到1,如果像素值小于0,压缩到0
for i=1:size(hdr,1)
    for j=1:size(hdr,2)
        for k=1:size(hdr,3)
            if(RGBout(i,j,k)>1)
                RGBout(i,j,k)=1;
            end
            if(RGBout(i,j,k)<0)
                RGBout(i,j,k)=1;
            end
        end
    end
end
max(max(RGBout));
imshow(RGBout);
function l = lum(img)
col = size(img, 3);

switch col
    case 1
        l = img;
        
    case 3
        l = 0.2126 * img(:,:,1) + 0.7152 * img(:,:,2) + 0.0722 * img(:,:,3);
        
    otherwise
        l = mean(img, 3); 
        disp('Mean of channels was computed; the input image is not an RGB or luminance image!');
end

end
function imgOut = ConvertRGBtosRGB(img, inverse)
a = 0.055;
imgOut = zeros(size(img));

if(inverse == 0) %from linear RGB to sRGB
    gamma_inv = 1.0 / 2.4;
    imgOut(img <= 0.0031308) = 12.92 * img(img <= 0.0031308);
    imgOut(img >  0.0031308) = (1 + a) * (img(img > 0.0031308).^gamma_inv) - a;
end

if(inverse == 1) %from sRGB to linear RGB
    gamma = 2.4;
    imgOut(img <= 0.04045) = img(img <= 0.04045) / 12.92;
    imgOut(img >  0.04045) = ((img(img > 0.04045) + a) / (1 + a)).^gamma;
end
            
end

原图

归一化映射图像

对数映射结果图像

指数映射图像

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