作者:小郭学数据
源自:快学python
学习视频可参见python+opencv3.3视频教学 基础入门
今天写的是滤波
outline
原图与加了高斯噪声后的图片
均值滤波是低通滤波,线性滤波器,其输出为邻域模板内像素的平均值,用于图像的模糊和降噪。
均值滤波器使用滤波器窗口内的像素的平均灰度值代替图像中的像素值,这样的结果就是降低图像中的“尖锐”变化。这就造成,均值滤波器可以降低噪声的同时,也会模糊图像的边缘。
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。
中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。
def memedianBlur(image):
dst = cv.medianBlur(image, 5) # 中值模糊,对椒盐噪声去噪较好
cv.imshow("medianBlur",dst)
去除椒盐噪声较好。
中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。这些优良特性是线性滤波方法所不具有的
def custom_blur_demo(image):
#自定义滤波器
kernel = np.ones([5, 5], np.float32) / 25 # 卷积核核大小
# filter2D(src, ddepth(图像深度,-1表示默认和src一样深度), kernel, dst=None, anchor=None(锚点,卷积核中心), delta=None, borderType=None)
dst=cv.filter2D(image, -1, kernel=kernel) # 二维滤波器
cv.imshow("blur_demo", dst)
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32) # 锐化算子
kernel = np.array([[0,1,2], [-1, 0,1], [-2, -1,0]], np.float32) # 锐化算子
高斯分布(正态分布)
高斯滤波是最常用的图像去噪方法之一,它能很好地滤除掉图像中随机出现的高斯噪声
对原图加高斯噪声
#0-255范围
def clamp(pv):
if pv > 255:
return 255
elif 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) # normal(loc=0.0, scale=1.0, size=None),均值,标准差,大小
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("gaussian_noise", image)
运用高斯滤波处理图像:
# GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
# ksize表示卷积核大小,sigmaX,Y表示x,y方向上的标准差,这两者只需一个即可,并且ksize为大于0的奇数
dst = cv.GaussianBlur(src, (5, 5), 0) # 高斯模糊,sigmaX与ksize一个为0
cv.imshow("Gaussian blur", dst)