直方圖均衡(HE)與局部色調映射(LTM) .


直方圖均衡(Histogram Equalization)是圖像處理中一個十分基礎的概念,具有調整圖像灰度,增強對比度的作用。

   限制對比度自適應直方圖均衡(Contrast Limited Adaptive Histogram Equalization,CLAHE),關於該算法的中文原理性描述可以參考網址:http://www.cnblogs.com/Imageshop/archive/2013/04/07/3006334.html 

   下面我按照自己的理解來介紹一下CLAHE算法:

   自適應直方圖均衡(AHE)算法,對於圖像中存在明顯比其他區域亮或者暗的地方時,普通的直方圖均衡算法就不能將該處的細節信息描述出來。AHE算法通過在當前處理像素周邊的一個矩形區域內進行直方圖均衡,來達到擴大局部對比度,顯示平滑區域細節的作用。

   AHE算法的2個屬性:1、AHE算法處理的局部領域,矩形領域小,局部對比度強,矩形領域大,局部對比度弱。2、如果矩形區域內的圖像塊信息比較平坦,灰度接近,其灰度直方圖呈尖狀,在直方圖均衡的過程中就可能會出現過度放大噪聲的情況。

   CLAHE,對比度受限的自適應直方圖均衡算法就能夠有效的限制噪聲放大的情形。下圖表示的就是局部矩形領域內的灰度直方圖,由於對比度放大的程度與像素點的概率分布直方圖的曲線斜度成比例,所以為了限制對比度,將大於一定閾值的部分平均分配到直方圖的其他地方,如右圖所示,這樣的話,通過限制CDF(累積分布函數)的斜率來一定程度限制對比度。

   

   插值過程,得到了CDF函數,也就獲得了對應的亮度變換函數,在計算變換函數的時候可以通過插值過程來降低計算量。其中紅色塊(圖像角點處)的變換函數是完全按照定義獲得的,綠色塊(圖像邊緣)的變換函數是通過旁邊兩個圖像塊的變換函數線性插值得到的,藍色部分圖像塊的變換函數則是通過雙線性插值得到。

   

   目前,Matlab和OpenCV中都已經集成了CLAHE函數,在Matlab中,就是函數J = adapthisteq(I);

   在OpenCV中,按照如下代碼段處理:

 

  1. Ptr<CLAHEclahe = createCLAHE();   
  2. clahe ->apply(src,dst);  
Ptr<CLAHE> clahe = createCLAHE(); 
clahe ->apply(src,dst);

 

 

   局部色調映射(Local Tone Mapping)

   重建視覺外觀是色調映射的終極目標。色調映射算法在降低高動態圖像(HDR)范圍的同時着力保護捕捉到的原始圖像的外觀。色調映射算子分兩種策略,一種是全局的,另一種是局部的。

   全局映射算子

   每一個像素點將會根據它的全圖特征和亮度信息進行映射,不管其空間位置幾何。全局算子一個比較典型的例子就是色調曲線。全局色調映射在處理12位(12-bit)深度的圖像的時候是完全OK的,當圖像的動態范圍特別高的時候,那就不行了。這是因為所有的像素點都采取同一種方式進行處理,根本就沒有管它是在較亮區域還是較暗區域。這樣的話,就是導致圖像色調映射過后看起來很平坦,失去了其局部的細節信息。

   局部映射算子    像素點所在的空間位置會被考慮,在進行尺度變換的時候,所以,具有相同亮度值的兩個像素點會被映射成不同的值,因為它們的空間位置周邊的亮度信息可能不一樣。局部色調映射需要考慮到每個像素點周圍的亮度信息,這樣這會使得計算量和內存的使用會更大,但是會有更好的結果。如果處理得當,局部色調映射會很好的保護高亮和陰影部分的局部對比度和細節信息。

   目前的一些色調映射算法:

   1、伽馬壓縮算法

   2、基於直方圖均衡的壓縮算法

   3、基於Retinex的算法

   4、基於梯度的壓縮算法,等等

   下面給出2組基於CLAHE的LTP算法效果圖:(測試圖像在網上找的)

   Matlab代碼如下:

  1. %% local tone mapping  
  2. clc,clear ,close all  
  3. % src = imread('m_ImageDemosaic.bmp');  
  4. src = imread('C:\Users\Administrator\Desktop\LTP5.png');  
  5. figure;imshow(src);  
  6. srcHDR = double(src) * 256;  
  7. hsv = rgb2hsv(srcHDR);  
  8. figure;imshow(uint16(srcHDR))  
  9. J = adapthisteq(uint16(hsv(:,:,3)));  
  10. hsv(:,:,3) = double(J);  
  11. dstHDR = hsv2rgb(hsv);  
  12. figure;imshow(uint16(dstHDR))  
  13. imwrite(uint16(dstHDR),'C:\Users\Administrator\Desktop\LTP5_1.png')  
%% local tone mapping
clc,clear ,close all
% src = imread('m_ImageDemosaic.bmp');
src = imread('C:\Users\Administrator\Desktop\LTP5.png');
figure;imshow(src);
srcHDR = double(src) * 256;
hsv = rgb2hsv(srcHDR);
figure;imshow(uint16(srcHDR))
J = adapthisteq(uint16(hsv(:,:,3)));
hsv(:,:,3) = double(J);
dstHDR = hsv2rgb(hsv);
figure;imshow(uint16(dstHDR))
imwrite(uint16(dstHDR),'C:\Users\Administrator\Desktop\LTP5_1.png')

   由於獲取不到源HDR,所以自己先將8-bit圖像映射到16-bit之后再進行試驗

 

   測試圖像來源鏈接:http://www.vista123.com/vista/9226.htmlhttp://www.nipic.com/show/7139458.html

 

 

        

         

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM