紅外圖像動態範圍壓縮和對比度增強


2參考文獻:

Dynamic-range compression and contrast enhancement in infrared imaging systems


對比度增強(CE)和動態範圍壓縮(DRC)技術

       對比度增強技術廣泛應用於圖像處理中,該技術可以被劃分爲兩類:基於非銳化掩碼(unsharp mask)的方法和基於直方圖均衡化(histogram equalization)的方法。基於非銳化掩碼的方法的思想是將圖像分解爲低通成分和高通成分(低頻圖像和高頻圖像,即背景圖像和目標圖像),然後將高通成分按照比鄰加權加到原始圖像中,以此來獲得銳化的圖像,數學模式爲:

                                                

公式中,\alpha爲高通成分的增強係數,fm爲低通成分。

該方法存在兩個主要的缺點:

其一,放大均勻區域的噪聲;

其二,過度增強高頻細節,導致出現僞影(光暈僞影);


       基於直方圖均衡化的方法簡單並且高效,是圖像對比度增強的通用方法。該方法可以分爲兩類,一是基於全局直方圖均衡化的方法;而是基於自適應的直方圖均衡化方法。基於全局直方圖均衡化的方法針對整張圖像進行操作,方法簡單,但是實驗效果欠缺;基於自適應的直方圖均衡化的方法採用固定的滑動窗口來計算均衡化曲線,該方法計算量大,並且在圖像的邊緣區域會產生強僞影。不管是基於全局直方圖均衡化方法還是基於自適應直方圖均衡化方法都存在缺陷。在這兩種情況下,對於給定的輸入灰度級,映射函數的斜率與該灰度級的直方圖所設定的值成正比。這意味着,如果出現大的平坦區域,映射函數與高頻的像素值對應的斜率將非常高。因此,大量的不包含細節信息的灰度級在輸出灰度級中佔據了大量的灰度級範圍。而圖像中包含重要結構信息的部分的灰度級被映射到灰度級範圍更少。爲了解決在映射過程中,圖像的細節信息被抑制的問題,論文引入了對比度限制的自適應直方圖均衡化算法(CLAHE)。該方法的思想是計算一個閾值(論文中以百分比來計算該閾值),統計直方圖中所有灰度級的像素個數超出該閾值的總和,然後將超出的部分再分配這個直方圖中。


動態範圍壓縮技術(Dynamic Range Compression)

       現代熱成像相機和商用的數碼相機的動態範圍爲12bit到16bit,需要經過動態範圍壓縮(DRC)才能在顯示器上顯示這些高動態範圍的圖像。其主要任務是用簡單的線性壓縮方法降低高亮度邊緣的對比度和增強低對比度部分的可視度。增強低對比度區域的小邊緣可能會產生光暈僞影。針對這個需求,現在大多數方法都是在對數域(log domain)內工作的,因爲亮度的對數值(真實世界測量到的輻射度)代表了人眼感知到的亮度的近視值(人眼對場景的感知)。由此,也科研人員也提出了一系列的處理方法。

       論文提出了一種新的方法用於可視化高動態範圍(HDR)的紅外圖像。該方法採用一種新的局部CLAHE方法來推導一種結合局部對比度增強和動態範圍壓縮的技術。命名爲Balanced CLAHE和Contrast Enhancement(平衡的對比度限制的自適應直方圖均衡化Balanced CLAHE和對比度增強BCCE技術)。

       局部對比度增強用於提升低對比度細節信息,動態範圍壓縮(DRC)用於有效地利用到整個輸出灰度級動態範圍,尤其是當存在較大像素強度變化時(如地平線的情形)。爲此,論文采用基於CLAHE算法的映射函數來產生具有零斜率均衡的曲線,用於映射輸入圖像直方圖中像素個數爲0的灰度級。


算法模型如下,該模型可以分爲兩個部分來看,一個是高動態向低動態範圍的映射函數,另一個是局部對比度增強。


代碼實現

1、計算圖像局部對比度圖

% 計算局部對比度圖CImage
meanFilterKer = fspecial('average', [5, 5]);
meanImage = imfilter(Image, meanFilterKer, 'replicate');
CImage =1.0 .* double(Image) ./double(meanImage);  

2、計算映射關係。爲了簡化實現,代碼沒有對圖像進行分塊處理。

function lPhist_new = balancedCLAHE(image, Min, Max)
[iHeight, iWidth] = size(image);
grayLevel = 65535;
plateauValue = grayLevel;
% 計算經過平臺值graylevel調整後的直方圖plateauPhist,及累積直方圖
[plateauPhist, lPhist, img] = plateauAlg(image, grayLevel, plateauValue,iHeight, iWidth);

% 平臺值S
S = 100;
Phist_clipped = plateauPhist;
excessPixel = 0;
lowPhist = plateauPhist;
for i = 1: grayLevel
    if plateauPhist(i) > S
        excessPixel = plateauPhist(i) - S + excessPixel;
        Phist_clipped(i) = S;
        lowPhist(i) = 0;  % 提取小於閾值S的部分
    end
end


Sum_lowPhist = sum(lowPhist);
for i = 1: grayLevel
    normalLowPhist(i) = lowPhist(i) / Sum_lowPhist;
end

phist_New = Phist_clipped;
numLowLevel = 0;
sumLowPixel = 0;
for i = 1: grayLevel
    if Phist_clipped(i) < S & Phist_clipped(i) > 1
        phist_New(i) = floor(normalLowPhist(i) * excessPixel) + Phist_clipped(i);
        numLowLevel = numLowLevel + 1;
        if phist_New(i) > S
            phist_New(i) = S;
        end
        sumLowPixel = sumLowPixel + phist_New(i);
    end
end

phist_New = phist_New ./sum(phist_New);

for i = 1: grayLevel-1
    if i == 1
        lPhist_new(i) = phist_New(i);
    else
        lPhist_new(i) = lPhist_new(i-1) + phist_New(i);
    end
end

end
        

3、輸出

for i = 1: iHeight
    for j = 1: iWidth
        outImg1(i, j) = 255 * lPhist_new(Image(i, j) + 1) * CImage(i, j);
    end
end

 

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