1.? 2D卷積??cv.filter2D()
對于一維信號,還可以使用各種低通濾波器( LPF )、高通濾波器( HPF )等對圖像進(jìn)行濾波。LPF有助于消除噪聲或模糊圖像。HPF濾鏡有助于在圖像中查找邊緣。OpenCV提供了一個函數(shù)cv2.filter2d ( ),用于將內(nèi)核與圖像進(jìn)行卷積。例如,我們將嘗試對圖像進(jìn)行平均濾波。5x 5平均濾波器內(nèi)核定義如下

操作如下:將核放在圖像的一個像素 A 上,求與核對應(yīng)的圖像上 25(5x5)個像素的和,在取平均數(shù),用這個平均數(shù)替代像素 A 的值。重復(fù)以上操作直到將圖像的每一個像素值都更新一邊。
img = cv2.imread('opencv_logo.jpg')
kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img,-1,kernel)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(dst),plt.title('Averaging')
plt.xticks([]), plt.yticks([])
plt.show()

2.? ?圖像模糊(圖像平滑)
使用低通濾波器可以達(dá)到圖像模糊的目的。這對與去除噪音很有幫助。其實就是去除圖像中的高頻成分(比如:噪音,邊界)。所以邊界也會被模糊一點。(當(dāng)然,也有一些模糊技術(shù)不會模糊掉邊界)。OpenCV 提供了四種模糊技術(shù)。
2.1 平均? ?cv2.blur()? ?cv2.boxFilter()
這是由一個歸一化卷積框完成的。他只是用卷積框覆蓋區(qū)域所有像素的平均值來代替中心元素。可以使用函數(shù) cv2.blur() 和 cv2.boxFilter() 來完這個任務(wù)??梢酝床榭次臋n了解更多卷積框的細(xì)節(jié)。我們需要設(shè)定卷積框的寬和高。下面是一個 3x3 的歸一化卷積框:

PS:如果不想使用歸一化卷積框,應(yīng)該使用 cv2.boxFilter(),這時要傳入?yún)?shù) normalize=False。
blur = cv2.blur(img,(5,5))
2.2??高斯模糊? ?cv2.GaussianBlur()
現(xiàn)在把卷積核換成高斯核(簡單來說,方框不變,將原來每個方框的值是相等的,現(xiàn)在里面的值是符合高斯分布的,方框中心的值最大,其余方框根據(jù)距離中心元素的距離遞減,構(gòu)成一個高斯小山包。原來的求平均數(shù)現(xiàn)在變成求加權(quán)平均數(shù),全就是方框里的值)。實現(xiàn)的函數(shù)是 cv2.GaussianBlur()。我們需要指定高斯核的寬和高(必須是奇數(shù))。以及高斯函數(shù)沿 X,Y 方向的標(biāo)準(zhǔn)差。如果我們只指定了 X 方向的的標(biāo)準(zhǔn)差,Y 方向也會取相同值。如果兩個標(biāo)準(zhǔn)差都是 0,那么函數(shù)會根據(jù)核函數(shù)的大小自己計算。高斯濾波可以有效的從圖像中去除高斯噪音。如果你愿意的話,你也可以使用函數(shù) cv2.getGaussianKernel() 自己構(gòu)建一個高斯核。
如果要使用高斯模糊的話,上邊的代碼應(yīng)該寫成:
blur = cv2.GaussianBlur(img,(5,5),0)
2.3? 中值模糊?cv2.medianBlur()
顧名思義就是用與卷積框?qū)?yīng)像素的中值來替代中心像素的值。這個濾波器經(jīng)常用來去除椒鹽噪聲。前面的濾波器都是用計算得到的一個新值來取代中心像素的值,而中值濾波是用中心像素周圍(也可以使他本身)的值來取代它。它能有效的去除噪聲。卷積核的大小也應(yīng)該是一個奇數(shù)。
median = cv2.medianBlur(img,5)
2.4??雙邊濾波??cv2.bilateralFilter()
函數(shù) cv2.bilateralFilter() 能在保持邊界清晰的情況下有效的去除噪音。但是這種操作與其他濾波器相比會比較慢。我們已經(jīng)知道高斯濾波器是求中心點鄰近區(qū)域像素的高斯加權(quán)平均值。這種高斯濾波器只考慮像素之間的空間關(guān)系,而不會考慮像素值之間的關(guān)系(像素的相似度)。所以這種方法不會考慮一個像素是否位于邊界。因此邊界也會別模糊掉,而這正不是我們想要。雙邊濾波在同時使用空間高斯權(quán)重和灰度值相似性高斯權(quán)重??臻g高斯函數(shù)確保只有鄰近區(qū)域的像素對中心點有影響,灰度值相似性高斯函數(shù)確保只有與中心像素灰度值相近的才會被用來做模糊運(yùn)算。所以這種方法會確保邊界不會被模糊掉,因為邊界處的灰度值變化比較大。
blur = cv2.bilateralFilter(img,9,75,75)? ?#9 鄰域直徑,兩個 75 分別是空間高斯函數(shù)標(biāo)準(zhǔn)差,灰度值相似性高斯函數(shù)標(biāo)準(zhǔn)差