一、均值模糊
均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。
def blur_demo(image): #均值模糊 去随机噪声有很好的去燥效果
dst = cv.blur(image, (1, 15)) #(1, 15)垂直方向模糊,(15, 1)水平方向模糊
cv.imshow("blur_demo", dst)
二、中值模糊
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。
def median_blur_demo(image): # 中值模糊 对椒盐噪声有很好的去燥效果
dst = cv.medianBlur(image, 5)
cv.imshow("median_blur_demo", dst)
三、自定义模糊
def custom_blur_demo(image): # 用户自定义模糊
kernel = np.ones([5, 5], np.float32)/25 #除以25是防止数值溢出
dst = cv.filter2D(image, -1, kernel=kernel)
cv.imshow("custom_blur_demo", dst)
四、锐化
def rui_blur_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("rui_blur_demo", dst)
五、高斯模糊
1.高斯模糊实质上就是一种均值模糊,只是高斯模糊是按照加权平均的,距离越近的点权重越大,距离越远的点权重越小。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
2.高斯分布的一维和二维原理如下:
3、高斯模糊比均值模糊去噪效果好
高斯模糊轮廓还在,保留图像的主要特征
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] #blue
g = image[row, col, 1] #green
r = image[row, col, 2] #red
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("noise image", image)
dst = cv.GaussianBlur(image, (15, 15), 0) # 高斯模糊
cv.imshow("Gaussian", dst)
src = cv.imread('E:\imageload\lena.jpg')
cv.imshow('input_image', src)
gaussian_noise(src)
dst = cv.GaussianBlur(src, (15,15), 0) #高斯模糊
cv.imshow("Gaussian Blur", dst)
cv.waitKey(0)
cv.destroyAllWindows()
六、边缘保留滤波EPF
进行边缘保留滤波通常用到两个方法:高斯双边滤波和均值迁移滤波。
#边缘保留滤波(EPF) 高斯双边、均值迁移
import cv2 as cv
import numpy as np
def bi_demo(image): #双边滤波
dst = cv.bilateralFilter(image, 0, 100, 15)
cv.namedWindow("bi_demo", cv.WINDOW_NORMAL)
cv.imshow("bi_demo", dst)
def shift_demo(image): #均值迁移
dst = cv.pyrMeanShiftFiltering(image, 10, 50)
cv.namedWindow("shift_demo", cv.WINDOW_NORMAL)
cv.imshow("shift_demo", dst)
src = cv.imread('E:/imageload/example.png')
cv.namedWindow('input_image', cv.WINDOW_NORMAL)
cv.imshow('input_image', src)
bi_demo(src)
shift_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
运行结果: