均值模糊
dst = cv.blur(image,(5,5)) # (5,5)卷積核大小
用途:適用於隨機噪聲
中值模糊
dst = cv.medianBlur(image,5)
用途:適用於椒鹽噪聲
自定義模糊
kernel = np.ones([5,5],np.float32)/25 # 除以25防止數值超過255,溢出
dst = cv.filter2D(image,-1,kernel=kernel)
用途:用戶根據需要,自定義,靈活性好
自定義模糊操作實現圖像銳化
kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32) #使用了圖像的銳化算子
dst = cv.filter2D(image,-1,kernel=kernel)
cv.imshow('sharp_demo',dst)
用途:用於圖像增強,突出邊框特徵
下面是代碼演示
import cv2 as cv
import numpy as np
# 均值模糊,可以去燥,對隨機噪聲效果好
def blur_demo(image):
dst = cv.blur(image,(5,5)) # (5,5)卷積核大小
cv.imshow('blur',dst)
# 中值模糊,對椒鹽噪聲效果好
def median_blur_demo(image):
dst = cv.medianBlur(image,5)
cv.imshow("median_blue",dst)
# 自定義
def custom_blur_demo(image):
kernel = np.ones([5,5],np.float32)/25 # 除以25防止數值超過255,溢出
dst = cv.filter2D(image,-1,kernel=kernel)
cv.imshow('custom_blur',dst)
# 利用自定義模糊,實現圖像的銳化
def sharp_demo(image):
kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32)
dst = cv.filter2D(image,-1,kernel=kernel)
cv.imshow('sharp_demo',dst)
src = cv.imread('D:/images/lenanoise.png')
cv.imshow('input image',src)
blur_demo(src)
median_blur_demo(src)
custom_blur_demo(src)
sharp_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
運行效果
高斯模糊
帶有權重的均值模糊,是均值模糊的一種擴展。去噪的效果更好。
高斯模糊對高斯噪聲有明顯的抑制作用
看下面的代碼
import cv2 as cv
import numpy as np
# 方式溢出
def clamp(pv):
if pv>255:
return 255
if pv<0:
return 0
else:
return pv
def gaussian_noise(image):
h,w,c = image.shape
for row in range(h):
for col in range(w):
s = np.random.normal(0,20,3)
b = image[row,col,0]
g = image[row,col,1]
r = image[row,col,2]
image[row,col,0] = clamp(b + s[0])
image[row,col,1] = clamp(g + s[1])
image[row,col,2] = clamp(r + s[2])
cv.imshow('guassian_nosie_image',image)
src = cv.imread('D:/images/demo.png')
cv.imshow('input image',src)
dst = cv.GaussianBlur(src,(0,0),15)
cv.imshow('Gaussian_blur',dst)
# 加入高斯噪聲
t1 = cv.getTickCount()
gaussian_noise(src)
t2 = cv.getTickCount()
print('time consume:%.2fs'%((t2-t1)/cv.getTickFrequency()))
# 對加入高斯噪聲後的圖像進行高斯模糊
cv.imshow('Gaussian_blur_after_GaussNoise',cv.GaussianBlur(src,(5,5),0))
cv.waitKey(0)
cv.destroyAllWindows()
運行結果
time consume:2.49s
時間消耗的挺長的