影像雜訊去除 — 中值濾波器(Median filter)
若雜訊的數值大於周遭像素非常多,平滑法的效果會變得很差,因為數值差距太大,取均值降噪後仍會被視為雜訊。這時改取中值(Median)代替,則可改善雜訊數據過於唐突的影響。
前言
關於影像雜訊的議題,先前文章提到過「平滑法(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: