【數字影像處理】直方圖均衡化詳解及程式設計實現

weixin_34121282發表於2011-10-28
 直方圖均衡化的英文名稱是Histogram Equalization.
  影像對比度增強的方法可以分成兩類:一類是直接對比度增強方法;另一類是間接對比度增強方法。直方圖拉伸和直方圖均衡化是兩種最常見的間接對比度增強方法。直方圖拉伸是通過對比度拉伸對直方圖進行調整,從而“擴大”前景和背景灰度的差別,以達到增強對比度的目的,這種方法可以利用線性或非線性的方法來實現;直方圖均衡化則通過使用累積函式對灰度值進行“調整”以實現對比度的增強。
  直方圖均衡化處理的“中心思想”是把原始影像的灰度直方圖從比較集中的某個灰度區間變成在全部灰度範圍內的均勻分佈。直方圖均衡化就是對影像進行非線性拉伸,重新分配影像畫素值,使一定灰度範圍內的畫素數量大致相同。直方圖均衡化就是把給定影像的直方圖分佈改變成“均勻”分佈直方圖分佈。
  缺點:
  1)變換後影像的灰度級減少,某些細節消失;
  2)某些影像,如直方圖有高峰,經處理後對比度不自然的過分增強。
  直方圖均衡化是影像處理領域中利用影像直方圖對對比度進行調整的方法。
  這種方法通常用來增加許多影像的區域性對比度,尤其是當影像的有用資料的對比度相當接近的時候。通過這種方法,亮度可以更好地在直方圖上分佈。這樣就可以用於增強區域性的對比度而不影響整體的對比度,直方圖均衡化通過有效地擴充套件常用的亮度來實現這種功能。
  這種方法對於背景和前景都太亮或者太暗的影像非常有用,這種方法尤其是可以帶來X光影像中更好的骨骼結構顯示以及曝光過度或者曝光不足照片中更好的細節。這種方法的一個主要優勢是它是一個相當直觀的技術並且是可逆操作,如果已知均衡化函式,那麼就可以恢復原始的直方圖,並且計算量也不大。這種方法的一個缺點是它對處理的資料不加選擇,它可能會增加背景雜訊的對比度並且降低有用訊號的對比度。
  直方圖均衡化的基本思想是把原始圖的直方圖變換為均勻分佈的形式,這樣就增加了象素灰度值的動態範圍從而可達到增強影像整體對比度的效果。設原始影像在(x,y)處的灰度為f,而改變後的影像為g,則對影像增強的方法可表述為將在(x,y)處的灰度f對映為g。在灰度直方圖均衡化處理中對影像的對映函式可定義為:g = EQ (f),這個對映函式EQ(f)必須滿足兩個條件(其中L為影像的灰度級數):
  (1)EQ(f)在0≤f≤L-1範圍內是一個單值單增函式。這是為了保證增強處理沒有打亂原始影像的灰度排列次序,原圖各灰度級在變換後仍保持從黑到白(或從白到黑)的排列。
  (2)對於0≤f≤L-1有0≤g≤L-1,這個條件保證了變換前後灰度值動態範圍的一致

性。
  累積分佈函式(cumulative distribution function,CDF)即可以滿足上述兩個條件,並且通過該函式可以完成將原影像f的分佈轉換成g的均勻分佈。此時的直方圖均衡化對映函式為:
  gk = EQ(fk) = (ni/n) = pf(fi) ,
  (k=0,1,2,……,L-1)
  上述求和區間為0到k,根據該方程可以由源影像的各畫素灰度值直接得到直方圖均衡化後各畫素的灰度值。在實際處理變換時,一般先對原始影像的灰度情況進行統計分析,並計算出原始直方圖分佈,然後根據計算出的累計直方圖分佈求出fk到gk的灰度對映關係。在重複上述步驟得到源影像所有灰度級到目標影像灰度級的對映關係後,按照這個對映關係對源影像各點畫素進行灰度轉換,即可完成對源圖的直方圖均衡化。

關於程式設計實現,同樣是不呼叫matlab庫函式,自己程式設計實現。這樣可以更深刻地理解直方圖均衡化技術,提高程式設計能力。

實現程式碼(matlab):

%直方圖均衡化 I = imread('rice.png'); [height,width] = size(I); figure subplot(221) imshow(I)%顯示原始影像 subplot(222) imhist(I)%顯示原始影像直方圖 %進行畫素灰度統計; NumPixel = zeros(1,256);%統計各灰度數目,共256個灰度級 for i = 1:height for j = 1: width NumPixel(I(i,j) + 1) = NumPixel(I(i,j) + 1) + 1;%對應灰度值畫素點數量增加一 end end %計算灰度分佈密度 ProbPixel = zeros(1,256); for i = 1:256 ProbPixel(i) = NumPixel(i) / (height * width * 1.0); end %計算累計直方圖分佈 CumuPixel = zeros(1,256); for i = 1:256 if i == 1 CumuPixel(i) = ProbPixel(i); else CumuPixel(i) = CumuPixel(i - 1) + ProbPixel(i); end end %累計分佈取整 CumuPixel = uint8(255 .* CumuPixel + 0.5); %對灰度值進行對映(均衡化) for i = 1:height for j = 1: width I(i,j) = CumuPixel(I(i,j)); end end subplot(223) imshow(I)%顯示原始影像 subplot(224) imhist(I)%顯示原始影像直方圖


執行結果:


轉載於:https://www.cnblogs.com/xiajun/archive/2011/10/28/2298639.html

相關文章