1. 程式人生 > >影象處理之直方圖處理

影象處理之直方圖處理

灰度級範圍為[0,L-1]的數字影象的直方圖是離散函式:

h(r_{k}) = n_{k}

其中r_{k}是第k級灰度值(r_{k}=k),n_{k}是影象中灰度值為r_{k}的畫素個數。

通常用MN表示的影象畫素的總數除它的每個分量n_{k}歸一化直方圖,即:

p(r_{k}) = n_{k}/MN

M和N分別是影象的行和列維數,k = 0,1,...,L-1。歸一化直方圖的所有分量和為1。

若一幅影象的畫素傾向於佔據整個可能的灰度級並且均勻分佈,則該影象會有高對比度的外觀和灰度細節豐富的特點。如下圖:

直方圖均衡

用變數r表示待處理的影象的灰度,灰度變換函式通常需要滿足兩個條件:

  • (a) T(r)在空間0\leqslant r\leqslant L-1上為單調遞增函式
  • (b) 當0\leqslant r\leqslant L-1時,0\leqslant T(r)\leqslant L-1

當考慮反函式r = T^{-1}(s),0\leqslant s\leqslant L-1時,條件(a)改為:

  • (a') T(r)在空間0\leqslant r\leqslant L-1
    上是嚴格單調遞增函式

條件(a)保證輸出灰度值不少於相應的輸入值,防止灰度反變換時產生人為的缺陷;條件(b)保證輸出灰度的範圍與輸入灰度的範圍相同;條件(a')保證從s到r的反對映是單值的,即一對一的,防止出現二義性。如下圖:

 為了產生均衡的直方圖,使用如下的灰度變換函式:

s = T(r) = (L-1)\int_{0}^{r}p_{r}(w)dw....................................(1)

容易看出,該變換滿足條件a和b。

下面解釋為什麼經過(1)式的灰度變換能產生均衡直方圖。

p_{r}(r)p_{s}(s)分別表示隨機變數r和s的概率密度函式(PDF)。若p_{r}(r)和T(r)已知,則變換後的變數s的PDF為:

p_{s}(s) = p_{r}(r)|dr/ds|  ......................................................(2)

使用(1)式的變換函式,得:

\frac{ds}{dr} = \frac{dT(r)}{dr} = (L-1)\frac{d}{dr}[\int_{0}^{r}p_{r}(w)dw] = (L-1)p_{r}(r)

將dr/ds代入(2)式,得:

p_{s}(s) = p_{r}(r)|dr/ds| = p_{r}(r)\left | \frac{1}{(L-1)p_{r}(r)} \right | = \frac{1}{L-1},0\leqslant s\leqslant L-1

可知,p_{s}(s)始終是一個均勻概率密度函式,與p_{r}(r)的形式無關。所以,經過(1)式灰度變換的影象能產生均衡直方圖。

(1)式的積分形式針對的是連續灰度值,而對於離散值,用求和的形式處理。一幅影象中灰度級r_{k}出現的概率為:

p(r_{k}) = n_{k}/MN,k = 0,1,2,...,L-1

(1)式中變換的離散形式為:

s_{k} = T(r_{k}) = (L-1)\sum_{j=0}^{k}p_{r}(r_{j}) = \frac{(L-1)}{MN}\sum_{j=0}^{k}n_{j},k = 0,1,2,...,L-1

注:在實際使用中,需要將灰度值取近似為最接近的整數。

直方圖匹配(規定化)

直方圖匹配直方圖規定化,是指處理後的影象具有規定的直方圖形狀。

具體說來就是,要找到一個灰度變換函式,使影象在該灰度變換函式的作用下,產生一個我們指定形狀的直方圖,所謂指定形狀的直方圖形狀,其實就是一個指定的概率密度函式。

假設r和z分別表示輸入影象和輸出影象的灰度級,p_{r}(r)是輸入影象的概率密度函式,p_{z}(z)是我們希望輸出影象所具有的指定概率密度函式。

令:

s = T(r) = (L-1)\int_{0}^{r}p_{r}(w)dw

可以看出,這就是直方圖均衡中的變換函式。知道p_{r}(r),就能得到T(r)。

定義隨機變數z:

G(z) = (L-1)\int_{0}^{z}p_{z}(t)dt = s

同樣,知道p_{z}(z),就能得到G(z),而p_{z}(z)就是我們指定的概率密度函式。

可得:

z = G^{-1}[T(r)] = G^{-1}(s)

上式就是我們要求的直方圖匹配的灰度變換函式。

對於離散形式,類似的我們令:

s_{k} = T(r_{k}) = (L-1)\sum_{j=0}^{k}p_{r}(r_{j}) = \frac{(L-1)}{MN}\sum_{j=0}^{k}n_{j},k = 0,1,2,...,L-1

G(z_{q}) = (L-1)\sum_{i=0}^{q}p_{z}(z_{i})=s_{k},q=0,1,2,...,L-1

其中,p_{z}(z_{i})規定的直方圖的第i個值,z_{q}是規定的直方圖對應的影象的第q級灰度值(z_{q}=q),利用反變換找到期望的z_{q}

z_{q} = G^{-1}(s_{k})

實踐中,並不需要反變換。因為我們處理的灰度級是整數(如8位元影象的灰度級是從0到255),我們常用下面的直方圖規定化過程:

  1. 計算給定影象的p_{r}(r)及其直方圖均衡變換s_{k},把s_{k}四捨五入為範圍[0,L-1]內的整數;
  2. 對q=0,1,2,...,L-1計算G(z_{q}),其中p_{z}(z_{i})規定的直方圖的值,把G四捨五入為範圍[0,L-1]內的整數,將G存在一個表中;
  3. 對每一個s_{k},k=0,1,2,...,L-1,從步驟2中儲存的G值表中尋找G(z_{q})使G(z_{q})最接近s_{k}。例如表中第64個G(z_{q})最接近s_{k},則根據G(z_{q})的定義,此時q=63,也就是z_{q}=63。當滿足給定s_{k}z_{q}值多於一個時,按慣例選擇最小的值。

參考資料:岡薩雷斯《數字影象處理》