柱狀圖(Histogram)
這次的範例圖像是這張:
柱狀圖的概念是把一張影像的灰階分布用機率的角度來看每個灰階值在影像中出現的頻率,如果將上方這張影像轉換成灰階後的柱狀圖會長這樣:
X 軸是一張影像的灰階,這邊以 p 代稱;Y 軸是這些灰階出現的頻率,這邊以 H(p) 代稱。
基於前言提到的想法,假設理想影像的灰階是 q ,那頻率分佈就是 G(q),直觀一點來看,我們希望做出以下圖示的轉換:
這邊的色塊只是個示意,並不代表真實的值,但理想上我們希望每個灰階值在一張影像中出現的頻率是接近的。
接著來看柱狀圖等化法在數學上如何被描述與應用。
柱狀圖等化法(Histogram Equalization)
這邊再次將符號定義重申一次:
原始影像的灰階稱為 p,出現頻率為 H(pi)
期望影像的灰階稱為 q,出現頻率為 G(qi)
因為轉換前後頻率一定相等(離散頻率總和不變),所以可寫出下列公式:
這邊的 pk 指的是原始柱狀圖灰階最大的地方,p0 則相反,是指灰階最小的地方。
再來則是開始將已知的變數代入,首先我們假設影像長寬是 M * N,那期望影像的灰階機率則是:
這邊的 q0 和 qk 需要人為事先定義好,通常這兩個值會拉得很開,這樣灰階分布才不會集中。
而 H(p) 和 G(q) 皆為非零的灰階值種類,且因為是同張影像所以必定相等,接著可以引進機率守恆概念開始找出一個 function,使 f(p) = q:
也就等價於:
這時 q 就成了我們的待解變數,經過移項可得:
這裡從 p0 做積分積到 p 的值其實是已知的,依離散形式可得:
這就是我們一開始要找的 f(p),接著來看看實際應用。
實作應用
這邊為了凸顯柱狀圖等化法的效果,除了原始影像是一張比較暗的影像,我另外用 Phototshop 製造一張灰階分佈類似,但比較亮的影像,並且同時將這兩張影像做柱狀圖等化法的運算,再將結果並列顯示:
這樣就可以很直觀地看見柱狀圖等化法的效果,python 的 opencv 有 equalizeHist 這個 function 可以快速實作出這樣的結果。
Source code: