OpenCV .直方圖均衡 CLAHE算法學習


前言
  圖像識別工程開發中需要增強圖像對比度,便於后續處理,接觸到了CLAHE(Contrast Limited Adaptive Histogram Equalization),記錄一下其中的學習過程。

1.直方圖均衡
1.1灰度直方圖
  灰度圖中像素值的分布為0-255,以灰度值為橫坐標,縱坐標為該灰度值對應的像素點數目/比例,則得到了灰度圖像的直方圖,體現的是圖像中灰度的整體分布情況。

  OpenCV中提供了相應的計算函數calcHist(),可以得到相應分布范圍的像素點數;將其繪制出來觀察,更為直觀。下圖為某輸入圖像和其灰度直方圖分布。

  一般性規律:對於灰度圖像,以個人觀察意願將其分為前景和背景區域,前景是我們所感興趣的區域,背景則反之。若前景和背景的灰度差異大,則易於人們觀察,否則不易觀察。一般來說若圖像的灰度直方圖集中在某個區域,其整體對比度較差,不易於我們區分前景和背景;反之若灰度直方圖分布較為均勻,則整體對比度較好,易於我們區分前景和背景。

1.2直方圖均衡化(Histogram Equalization, HE)
1)效果
  直方圖均衡化就是一種使圖像的灰度直方圖分布更佳均勻的變換方法。OpenCV中的equalizeHist()實現了該功能

左側為原始灰度圖,中間上方為其灰度分布;右側為HE處理后得到的圖像,中間下方為其灰度分布;對比灰度分布可知右方圖像的灰度分布更為均勻,圖像效果上來看結果圖像對比度更強。

2)數學原理

先說概率分布與概率密度函數,看一下下圖中的題目回想一下以前的數學知識。

接下來對概率密度函數的變換做一些數學推導,輸入公式比較麻煩,截圖為圖像粘貼進來。

 

  這里可以看到轉換函數T()為單調遞增函數,不過結果圖的直方圖分布並不是理想的一條水平線;原因在於我們是在連續分布上推導得到轉換函數,作用於離散分布,且不允許產生非整數形式的新結果。不過整體看來該轉換函數使新的分布具有展開直方圖分布的效果,增強了整體的對比度。

2.CLAHE
上述的HE算法得到的結果存在一些問題,主要包括:1)部分區域由於對比度增強過大,成為噪點;2)一些區域調整后變得更暗/更亮,丟失細節信息。

2.1CLHE
  針對問題1),有人提出了CLHE,即加入對比度限制的HE算法。轉換函數T受像素灰度概率分布的影響:其變化率與概率密度成比例;概率密度過大,會導致原始像素經過變換后灰度值過高,對比度增強過大。

  因此需要限制對比度,即限制灰度的分布;同時還需要確保概率密度的積分仍然為1。

  如下圖所示,一般操作為設置直方圖分布的閾值,將超過該閾值的分布“均勻”分散至概率密度分布上,由此來限制轉換函數(累計直方圖)的增幅。

   下圖是使用CLHE和HE的對比,左側圖像為HE結果,中間上方圖像為其灰度直方圖;右側圖像為CLHE結果,中間下方圖像為其灰度直方圖;觀察灰度直方圖可看到上述的限制效果;同時CLHE結果中噪點的分布相對於HE結果要小一些。

2.2 AHE
  針對問題2),有人提出自適應直方圖均衡算法(AHE),基本思想為:對原圖中每個像素,計算其周圍一個鄰域內的直方圖,並使用HE映射得到新的像素值。為了能夠處理圖像邊緣的像素,一般先對原始圖像做鏡像擴邊處理。

  不過這樣做計算量偏大,為了減少計算量,一般先把原始圖像分為MXN個子區域,分別對每個子區域進行HE變換。但是這樣又產生了新的問題,子區域相接處像素值分布不連續,產生很強的分割線,如下圖所示。

為了解決該問題,有人提出加入雙線性插值的AHE,也就形成了完整的CLAHE。算法流程如下:

1)將圖像分為多個矩形塊大小,對於每個矩形塊子圖,分別計算其灰度直方圖和對應的變換函數(累積直方圖)

2)將原始圖像中的像素按照分布分為三種情況處理;對比下圖,紅色區域中的像素按照其所在子圖的變換函數進行灰度映射,綠色區域中的像素按照所在的兩個相鄰子圖變換函數變換后進行線性插值得到;紫色區域中的像素按照其所在的四個相鄰子圖變換函數變換后雙線性插值得到

3. OpenCV中的CLAHE

  OpenCV中提供了CLAHE的實現和接口,調用也十分簡單,其提供的兩個設置接口分別用於設置自適應處理中的閾值,和子圖的大小。下面是調用OpenCV的HE和CLAHE處理的示例代碼和結果圖像。

 1 void opencvEqualizeHist()  2 {  3  Mat img, img_gray, result;  4  Mat clahe_result;  5     img = imread("test.jpg");  6  cvtColor(img, img_gray, CV_BGR2GRAY);  7  equalizeHist(img_gray, result);  8  
 9     cv::Ptr<CLAHE> clahe = cv::createCLAHE(); 10     clahe->setClipLimit(4); 11     clahe->setTilesGridSize(cv::Size(10, 10)); 12     clahe->apply(img_gray, clahe_result); 13  
14     imshow("src", img_gray); 15     imshow("result", result); 16     imshow("clahe_result", clahe_result); 17  
18  waitKey(); 19 }

  對比可發現CLAHE的結果相對於HE的結果,未出現結果像素相比於原圖因調整得更亮/更暗而丟失了細節的情況,且局部對比度更強。


免責聲明!

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



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