1. 程式人生 > >直方圖均衡化的理解

直方圖均衡化的理解

均衡化定義

wiki定義。簡單講就是把一副影象的灰度值進行拉伸,使得灰度值可以分佈在更多的灰度級上。在這裡完全按照灰度級對映的觀點來理解直方圖均衡化。

均衡化的要求

不能破壞原來的畫素亮度排序。原來亮的還是亮,暗的還是暗。改變的是它們之間的差(對比度)。

為什麼選用概率密度函式作為對映函式。

先拿一個例項看看,結論在 總結 部分說明。下面給出灰度圖和概率密度分佈圖(pdf)。

原圖
這裡寫圖片描述

原圖的pdf圖
這裡寫圖片描述

可以從pdf圖中看到畫素值[50,100]區間,概率密度上升的非常快,說明很大一部分原圖的畫素值集中在這個區間。下面再看均衡化後的影象和pdf圖。

處理後的圖
這裡寫圖片描述

處理後的pdf圖
這裡寫圖片描述

總結

  1. 選用pdf做對映函式就是因為在pdf中可以體現出原圖的這種“陡峭”的狀態和“平滑”狀態。在上面的例子中,“陡峭”的部分大致是[50,100]的這個區間。在這個區間內原圖的畫素點非常集中,剩下的區間可以說都是“平滑”狀態。我在這裡沒有畫出直方圖,但是可以想象原圖的直方圖是在[50,100]之間有大量畫素,其它區間畫素點很少。我們已經知道在某塊區間畫素非常集中,然後有什麼用呢。在“陡峭”的情況下,如果從縱軸來觀察,它的跨度相對於橫軸大了很多。於是我們可以用pdf做對映函式,把橫軸這個小區間對映放大到縱軸這個大區間。這樣用pdf做對映函式的好處有: (1)畫素灰度值的範圍可以被拉昇到[0,255]這個區間裡。(2)

    “陡峭”的地方變“平滑”了,“平滑”的地方還是保持“平滑”。這個結果可以從處理後的pdf圖中看到,pdf變成了一個近似45°的直線。

  2. 從這個例子可以看出,直方圖均衡化的視覺效果不一定很好。

  3. 直方圖均衡化會使得pdf本來上凸或者下凹的曲線變為一個近似的直線(用其它圖做過實驗,也是一樣)。

  4. 均衡化的結果會使得直方圖分佈更均勻(本來就是這個目的),以此來提高區域性對比度。

  5. 我上面給的圖並不是pdf圖,縱座標沒有除以影象的畫素總和,但是形狀是相同的,就拿來分析了。

PS:

  1. 順便就給出課件裡的C++版本直方圖均衡化程式碼吧。
void HistogramEqualize(BYTE *pImg
,int nSize){ BYTE *pCur,*pEnd=pImg+nSize; int hist[256],sum,i,LUT[256]; memset(hist,0,sizeof(int)*256); for(pCur=pImg;pCur<pEnd;) hist[*pCur++]++; for(sum=hist[0],LUT[0]=0,i=1;i<256;i++){ sum+=hist[i]; LUT[i]=255*sum/nSize; } for(pCur=pImg;pCur<pEnd;) *pCur++=LUT[*pCur]; }
  1. 關於 總結 裡面的第3點也可以用wiki的圖來說明,左上角是原始影象,左下角是均衡化後的影象。右上角和右下角分別是左邊圖對應的直方圖和pdf圖。其中紅色的是灰度直方圖,黑色的線是pdf。可以看出pdf的曲線變成了一條差不多45度的直線:
    這裡寫圖片描述