天天看點

圖像處理之圖像模糊與平滑等操作

圖像模糊與平滑

使用低通濾波器可以達到圖像模糊的目的。這對與去除噪音很有幫助。其

實就是去除圖像中的高頻成分(比如:噪音,邊界)。是以邊界也會被模糊一

點。(當然,也有一些模糊技術不會模糊掉邊界)。OpenCV 提供了四種模糊技

術。

1.平均

這是由一個歸一化卷積框完成的。他隻是用卷積框覆寫區域所有像素的平

均值來代替中心元素。可以使用函數 cv2.blur() 和 cv2.boxFilter() 來完

這個任務。

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('opencv_logo.png')
blur = cv2.blur(img,(5,5))
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()      
圖像處理之圖像模糊與平滑等操作

2.高斯模糊

現在把卷積核換成高斯核(簡單來說,方框不變,将原來每個方框的值是

相等的,現在裡面的值是符合高斯分布的,方框中心的值最大,其餘方框根據

距離中心元素的距離遞減,構成一個高斯小山包。原來的求平均數現在變成求

權重平均數,全就是方框裡的值)。實作的函數是 cv2.GaussianBlur()。我

們需要指定高斯核的寬和高(必須是奇數)。以及高斯函數沿 X,Y 方向的标準

差。如果我們隻指定了 X 方向的的标準差,Y 方向也會取相同值。如果兩個标

準差都是 0,那麼函數會根據核函數的大小自己計算。高斯濾波可以有效的從

圖像中去除高斯噪音。

#0 是指根據視窗大小( 5,5 )來計算高斯函數标準差
blur = cv2.GaussianBlur(img,(5,5),0)      
圖像處理之圖像模糊與平滑等操作

3.中值模糊

顧名思義就是用與卷積框對應像素的中值來替代中心像素的值。這個濾波

器經常用來去除椒鹽噪聲。前面的濾波器都是用計算得到的一個新值來取代中

心像素的值,而中值濾波是用中心像素周圍(也可以使他本身)的值來取代他。

他能有效的去除噪聲。卷積核的大小也應該是一個奇數。

在這個例子中,我們給原始圖像加上 50% 的噪聲然後再使用中值模糊。

median = cv2.medianBlur(img,5)      
圖像處理之圖像模糊與平滑等操作

4.雙邊濾波

函數 cv2.bilateralFilter() 能在保持邊界清晰的情況下有效的去除噪

音。但是這種操作與其他濾波器相比會比較慢。我們已經知道高斯濾波器是求

中心點鄰近區域像素的高斯權重平均值。這種高斯濾波器隻考慮像素之間的空

間關系,而不會考慮像素值之間的關系(像素的相似度)。是以這種方法不會考

慮一個像素是否位于邊界。是以邊界也會别模糊掉,而這不是我們想要的。

雙邊濾波在同時使用空間高斯權重和灰階值相似性高斯權重。空間高斯函

數確定隻有鄰近區域的像素對中心點有影響,灰階值相似性高斯函數確定隻有

與中心像素灰階值相近的才會被用來做模糊運算。是以這種方法會確定邊界不

會被模糊掉,因為邊界處的灰階值變化比較大。

#cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
#d – Diameter of each pixel neighborhood that is used during filtering.
# If it is non-positive, it is computed from sigmaSpace
#9 鄰域直徑,兩個 75 分别是空間高斯函數标準差,灰階值相似性高斯函數标準差
blur = cv2.bilateralFilter(img,9,75,75)      

5. 邊緣增強

kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)  # 定義一個核
    dst = cv2.filter2D(img2.copy(), -1, kernel=kernel)      

繼續閱讀