1. 程式人生 > >opencv for python (13) 影象卷積及影象平滑(平均、高斯模糊、中值模糊、雙邊濾波)

opencv for python (13) 影象卷積及影象平滑(平均、高斯模糊、中值模糊、雙邊濾波)

影象卷積

卷積函式 cv2.filter2D(img,-1,kernel)
第一個引數是原影象
第二個引數目標影象的所需深度。如果是負數,則與原影象深度相同
第三個引數是卷積核心

import cv2   
import numpy as np   
from matplotlib import pyplot as plt 

img = cv2.imread('nine.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()

影象平滑
平均函式cv2.blur(img,(5,5))
第一個引數是源影象
第二個引數是平滑核心大小,意義如 np.ones((3,3),np.float32)/9一樣

高斯模糊函式cv2.GaussianBlur(img,(5,5),0)
高斯模糊函式卷積模板的推導推導連結
高斯濾波可以有效的從影象中去除高斯噪音。高斯核心是符合高斯分佈的,方框中心的值最大,其餘方框根據距離中心元素的距離遞減,構成一個高斯小山包
第一個引數是源影象
第二個引數是高斯核心的大小
第三個引數是高斯函式沿 X,Y 方向的標準差。如果我們只指定了 X 方向的的標準差,Y 方向· 也會取相同值。如果兩個標準差都是 0,那麼函式會根據核函式的大小自己計算

中值模糊函式cv2.medianBlur(img,5)
中值模糊是用中心畫素周圍(也可以使他本身)的值來取代他
第一個引數是源影象
第二個引數是可選擇的孔徑尺寸

雙邊濾波函式cv2.bilateralFilter(img,9,75,75)
雙邊濾波在同時使用空間高斯權重和灰度值相似性高斯權重。空間高斯函
數確保只有鄰近區域的畫素對中心點有影響,灰度值相似性高斯函式確保只有
與中心畫素灰度值相近的才會被用來做模糊運算。所以這種方法會確保邊界不
會被模糊掉,因為邊界處的灰度值變化比較大。
第一個引數源影象
第二個引數濾波期間使用的每個畫素鄰域的直徑
第三、四個引數是空間高斯函式標準差和灰度值相似性高斯函式標準差(如果它們很小(<10),過濾器將不會有太多的效果,而如果它們很大(> 150),將會產生非常強烈的效果,使得影象顯得“卡通”。)

import cv2   
import numpy as np   
from matplotlib import pyplot as plt 

img = cv2.imread('nine.jpg')
#blur = cv2.blur(img,(5,5))
#blur = cv2.GaussianBlur(img,(5,5),0)
#median = cv2.medianBlur(img,5)
blur = cv2.bilateralFilter(img,9,75,75)

plt.subplot(121),plt.imshow(img)
plt.title('Original'),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(blur)
plt.title('Averaging'),plt.xticks([]),plt.yticks([])
plt.show()