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

結果

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