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

原圖

歸一化映射圖像

對數映射結果圖像

指數映射圖像

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