影像雜訊去除 — 中值濾波器(Median filter)

若雜訊的數值大於周遭像素非常多,平滑法的效果會變得很差,因為數值差距太大,取均值降噪後仍會被視為雜訊。這時改取中值(Median)代替,則可改善雜訊數據過於唐突的影響。

Ken Huang
電腦視覺
Nov 6, 2020

--

前言

關於影像雜訊的議題,先前文章提到過「平滑法(Smoothing method)」,透過捲積(Convolution)的技巧讓遮罩(Mask)對局部影像取平均值之後取代中間像素。這種作法如果遇到雜訊素質與周遭差異過大的情形,效果會變得很有限。

為了凸顯平滑法不適用的情況,接下來舉一個 3 * 3 影像做為例子。

中值濾波器(Medium filter)運算方式

這個範例長這樣:

與平滑法範例不同之處在於中間的數值與接鄰像素差異非常大,為了方便比較,這邊同時套用平滑法與中值濾波器的運算方式,再將結果並列顯示:

這邊可以看到平滑法的響應值是:

(5+6+2+3+208+3+1+4+2)/ 9

= 234 / 9

= 26

所以右半邊的結果中間是 26。

而中值濾波器的作法則是將 Mask 遮到的數據先做由小到大的排序:

1, 2, 2, 3, 3, 4, 5, 6, 208

接著直接對此數列取中值(Median)再取代中間數據,所以左半邊的結果中間是 3。

透過這樣並列比較,可以直觀地看到數值差異過大時,中值濾波的效果比平滑法還要好。接下來就透過實際圖片來呈現視覺上的效果。

中值濾波器(Medium filter)實作

透過 python 的 OpenCV 可以用 medianBlur function 直接指定原始影像與 Mask 的大小,很快就能實作出結果:

如果原圖是一般影像感覺不太出來 Median filter 的效果,為了凸顯Median filter的功能,我先把原圖隨機撒上40000個白色像素:

再用相同大小的 Mask 同時做 Median filter 和 Smoothing method ,結果差異如下:

結論

平滑法因為是取 Mask 範圍內的平均值覆蓋中間像素,所以會把那些白噪融入了整張影像,因此整體變亮了,但因為灰階值差異大,處理過後仍隱約看得出白點的存在。

所以如果是處理點狀雜訊且數值差異大的情況,採用 Median filter 降噪的效果會比較好。

Source code:

--

--

Ken Huang
電腦視覺

在網路上自學的過程中,體會到開放式資源的美好,希望藉由撰寫文章記錄研究所的學習過程,同時作為回饋網路世界的一種方式。Email : kenhuang2019iii@gmail.com ,如果有任何問題都歡迎與我聯繫。