1. 程式人生 > >影象處理基礎02直方圖均衡化的推導和程式設計實現

影象處理基礎02直方圖均衡化的推導和程式設計實現

1 簡介

  • 直方圖均衡化是將影象轉化為另一幅影象,轉化後圖像畫素值的分佈更接近均勻分佈。原本影象的畫素值(灰度值)可能集中在某一區域,這樣我們看到的影象其實是比較模糊的,灰度沒有層次感。直方圖均衡化能夠增加影象灰度值的動態範圍,從而達到增強影象對比度的目的,使影象看起來更清晰。
  • 直方圖均衡屬於空域影象增強,但並沒有考慮影象的空間資訊。但是又能得到很好的視覺效果,很有意思。

2 推導

  • 首先明確我們的目的是得到一個變換關係來對影象進行變換,具體為對所有值為r的畫素點,將r改為s: s=T(r)s = T(r) 通過變換,改變了每種灰度級的個數,變換後圖像的灰度級符合均勻分佈。
  • 岡薩雷斯的書裡給了幾個公式,但沒有推導過程,直接給出了T
    (r)T(r)
    的公式(書中的式3.3-4),並做了證明,證明使用(3.3-4)變換後的影象,灰度級符合均勻分佈。其實根據證明過程也可以知道T(r)T(r) 是如何得出的。
  • 那麼T(r)T(r) 是如何得出的? 用pr(r)p_r(r)ps(s)p_s(s) 表示r和s的概率密度(PDF),則有以下性質(3.3-3): ps(s)ds=pr(r)drp_s(s)ds = p_r(r)dr ps(s)dsp_s(s)ds的意義是區間(s,s+ds)(s,s+ds)上的概率,pr(
    r)drp_r(r)dr
    同理。顯然兩者是相等的。可以通過下圖理解一下,下圖的HB(r)H_B(r)應為pr(s)p_r(s)HA(r)H_A(r) 應為ps(s)p_s(s)

在這裡插入圖片描述

則有dT(r)dr=dsdr=pr(r)ps(s)\frac{dT(r)}{dr} = \frac{ds}{dr} = \frac{p_r(r)}{p_s(s)} 因為SS為均勻分佈,即ps(s)=1L1p_s(s) = \frac{1}{L-1}LL為灰度級數(一般為256),所以 T

(r)=(L1)0rpr(w)dwT(r) = {(L-1)}\int_0^{r}p_r(w)dw 即得到了(3.3-4)。顯然上式就是求r的分佈函式,然後乘上(L1)(L-1)

  • 對一張影象,其均衡化後的影象是唯一的,可以利用這一點來進行直方圖匹配(規定化)。

3 程式設計實現

  • 實際上影象中的畫素值是離散隨機變數,那麼有 sk=T(rk)=(L1)j=0kpr(rj)=(L1)j=0knjnk=0,1,2,...,L1 s_k = T(r_k) = (L-1)\sum_{j=0}^{k}p_r(r_j) = (L-1)\sum_{j=0}^{k} \frac{n_j}{n} \qquad k = 0,1,2, ... ,L-1 其中nn 為畫素點總數,njn_j 為畫素值為j的畫素點數量,LL為灰度級數。注意,njn\frac{n_j}{n}得到的可能是小數,所以得到的sks_k可能為小數,灰度值為小數時也可以顯示,但如果要求得到的資料為指定位數(如8位)那就進行取整。

3.1 python和opencv

3.2 純C語言