圖像模糊與平滑
使用低通濾波器可以達到圖像模糊的目的。這對與去除噪音很有幫助。其
實就是去除圖像中的高頻成分(比如:噪音,邊界)。是以邊界也會被模糊一
點。(當然,也有一些模糊技術不會模糊掉邊界)。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()
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQDOxEzX3xCZlhXam9VbsUmepNXZy9CXwJWZ3xCdh1mcvZ2Lc1zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwIzX39GZhh2csATMflHLwEzX4xSZz91ZsAzMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xiNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL4EDN1MmMllDN5cjZ0kjYyYzXzMDNzQTM3IzLcZDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
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)