3.1 TMO MATLAB 框架(Advanced High Dynamic Range Imaging )

3.1 TMO MATLAB 框架(Advanced High Dynamic Range Imaging )

通常,无论属于哪一类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文件夹中。

代码演示

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;
imgout=zeros(size(hdr));
for i=1:size(hdr, 3)
    imgout(:,:,i) = ((hdr(:,:,i) ./ L).^cc_s) .* L;
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
imshow([hdr 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

结果

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