影像雜訊去除 — 平滑法(Smoothing Method)
針對影像的雜訊干擾、灰階分布集中等問題,可綜合應用面罩(Mask)、捲積(Convolution)等技巧,對局部像素做加權運算,達到影像降噪的效果。
前言
影像常因環境影響,導致灰階分布集中、影像中含有雜訊,進而影響內容資訊的判讀,若能盡量恢復影像品質,則有助於使用者理解圖像資訊。舉例來說,X 光影像是醫學領域常用來判斷疾病的依據,若能使影像更清晰,則有助於醫生判讀發病區域、疾病嚴重程度。
這篇文章會先介紹最簡單的「平滑法(Smoothing Method)」,此做法利用一個小型的矩陣作為面罩(Mask)對原始影像進行捲積(Conolution),再將捲積得到的響應值(Response)取代矩陣中心的像素值。
單純用文字描述可能太抽象,接著我們舉個 3 * 3 的灰階影像做為範例,直觀一點來看數值上的變化。
平滑法(Smoothing Method)運算方式
這個 3 * 3 的灰階影像,長這樣:
如果是 N * N 的 Mask,那 Mask 的每個 Element 就是1/N²:
就等於對 Mask 內的像素取平均值,這個例子來說就是(5+6+2+3+28+3+1+4+2)/ 9
= 54 / 9
= 6 (這邊如果有小數點就四捨五入)
最後再覆蓋正中間的像素:
再來就透過實際的影像來看它經過平滑法之後的視覺效果。
平滑法(Smoothing Method)實作
透過 python 的 Open-CV 可以用 filter2D function 直接指定原始影像與 Mask,只要先透過 numpy 創造一個 Mask 再放到 fileter2D 很快就能實作出結果:
可以從結果看出,Mask的大小越大,影像會越平滑,尤其在「邊緣」的部分效果更明顯。
Source code:
結論
雜訊去除的方法,其實也可使用先前介紹過的傅立葉轉換(Fourier Transform,FT)、離散餘弦轉換(Discrete Cosine Transform,DCT),這兩種做法對具有週期性的雜訊(例如一些網格狀的紋理)比較敏感,缺點是運算上比較複雜。
這篇介紹的平滑法因為採用 Mask、Convolution 等技巧,所以運算上會比 FT 或 DCT 快許多,但若處理的是週期性雜訊,會將雜訊本身的資訊融入原始圖像,那就可能造成影像整體明暗度提升或下降,也可能產生色偏。因此在不同條件下可選擇較合適的手法來處理影像雜訊。
除了平滑法之外,還有類似的做法叫做「中值法」、「中央加權中值法」,我就之後的文章再繼續介紹,再回來補上連結~