為什麼用加權平均來降噪
前面提到,我們想到了用平均操作來降低噪聲。降低噪聲的意義是顯而易見的,當我們需要影象增強,以提升影象的質量時,必須降低甚至消除噪聲。
用平均操作來降低噪聲是一種好方法,其基於的原理是:每個畫素點的值與其周邊畫素點的值比較接近。
但是,我們進一步分析,如果一個畫素點的值沒有被噪聲汙染,那麼用這種操作就改變了畫素點的真實值,帶來了副作用。同時,在畫素點的8領域周邊畫素中,其水平和垂直方向的4領域畫素與中心畫素的距離是1,而對角畫素與中心畫素的距離是根號2,距離中心畫素更近的畫素的值是不是與中心畫素的值更接近呢,重要程度更高呢。同樣,中心畫素的值本身是不是有更大的可能性接近原始值呢,它本身的重要程度是不是也更高呢。
於是,我們很自然的就想到是不是不用絕對平均,而是用加權平均,重要程度高的賦予更高的權重,重要程度低的賦予較低的權重。例如下圖所示:
中心點象素的權重是0.25,水平和垂直方向畫素的權重是0.125,對角方向畫素的權重是0.0625,當然,這些權重的和必須等於1。
我們用加權平均來看一看效果。下圖是帶有鹽噪聲的影象。
import cv2 import numpy as np salt = cv2.imread("salt_lena.bmp", 0) row, column = salt.shape reduce = salt[:] for x in range(1, row - 1): for y in range(1, column - 1): reduce[x, y] = 0.0625 * salt[x - 1, y - 1] + 0.125 * salt[x - 1, y] + 0.0625 * salt[x - 1, y + 1] + \ 0.125 * salt[x, y - 1] + 0.25 * salt[x, y] + 0.125 * salt[x, y + 1] + \ 0.0625 * salt[x + 1, y - 1] + 0.125 * salt[x + 1, y] + 0.0625 * salt[x + 1, y + 1]
cv2.imshow("reduce", reduce.astype("uint8")) cv2.waitKey()
輸出結果: