opencv 圖像平滑
圖像模糊(圖像平滑)
- 使用低通濾波器可以達到圖像模糊的目的。這對與去除噪音很有幫助。
- 其實就是去除圖像中的高頻成分(比如:噪音,邊界)。
- 所以邊界也會被模糊一點。(當然,也有一些模糊技術不會模糊掉邊界)。OpenCV 提供了四種模糊技術
高斯模糊
- 值是符合高斯分佈的,方框中心的值最大,其餘方框根據距離中心元素的距離遞減,構成一個高斯小山包。
- 指定高斯核的寬和高(必須是奇數)
- 以及高斯函數沿 X,Y 方向的標準差。
- 如果我們只指定了 X 方向的的標準差,Y 方向也會取相同值。
- 如果兩個標準差都是 0,那麼函數會根據核函數的大小自己計算。
- 高斯濾波可以有效的從圖像中去除高斯噪音。
gaussianBlur = cv2.GaussianBlur(img,(5,5),0)
中值模糊
顧名思義就是用與卷積框對應像素的中值來替代中心像素的值。
- 這個濾波器經常用來去除椒鹽噪聲。
- 前面的濾波器都是用計算得到的一個新值來取代中心像素的值,而中值濾波是用中心像素周圍(也可以使他本身)的值來取代他。
- 他能有效的去除噪聲。
median = cv2.medianBlur(img,5)
雙邊濾波
-
函數 cv2.bilateralFilter() 能在保持邊界清晰的情況下有效的去除噪音。
-
雙邊濾波在同時使用空間高斯權重和灰度值相似性高斯權重。
-
空間高斯函數確保只有鄰近區域的像素對中心點有影響,
-
灰度值相似性高斯函數確保只有與中心像素灰度值相近的纔會被用來做模糊運算。
-
所以這種方法會確保邊界不會被模糊掉,因爲邊界處的灰度值變化比較大。
-
9 鄰域直徑,兩個 75 分別是空間高斯函數標準差,灰度值相似性高斯函數標準差
blur = cv2.bilateralFilter(img,9,75,75)
import cv2
import numpy as np
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(16, 9))
img = cv2.imread('opencv-logo-white.png')
# blur卷積核爲 5 * 5
#【1, 1, 1, 1, 1】
#【1, 1, 1, 1, 1】
#【1, 1, 1, 1, 1】
#【1, 1, 1, 1, 1】
#【1, 1, 1, 1, 1】
blurred = cv2.blur(img,(5,5))
gaussianBlur = cv2.GaussianBlur(img,(5,5),0)
median = cv2.medianBlur(img,5)
bilateralFilter = cv2.bilateralFilter(img,9,75,75)
plt.subplot(231),plt.imshow(img),plt.title('Original', fontsize = 15)
plt.xticks([]), plt.yticks([])
plt.subplot(233),plt.imshow(blurred),plt.title('Blurred', fontsize = 15)
plt.xticks([]), plt.yticks([])
plt.subplot(234),plt.imshow(gaussianBlur),plt.title('gaussianBlur', fontsize = 15)
plt.xticks([]), plt.yticks([])
plt.subplot(235),plt.imshow(median),plt.title('median', fontsize = 15)
plt.xticks([]), plt.yticks([])
plt.subplot(236),plt.imshow(bilateralFilter),plt.title('bilateralFilter', fontsize = 15)
plt.xticks([]), plt.yticks([])
plt.show()