zl程序教程

您现在的位置是:首页 >  其它

当前栏目

空间滤波-高斯低通滤波器

空间 滤波 高斯
2023-09-11 14:15:38 时间

目录

1. 介绍

2. 代码实现

3. other


1. 介绍

邻域均值滤波器在平滑图像的时候虽然会降低了噪声,但是同样模糊了图像,这点是我们不希望的。而加权平均滤波器的效果就比邻域均值滤波器好一点,因为它考虑了权重的大小。

我们在模糊图像的时候应该考虑一点的就是距离中心像素的的权重应该大一点,远离中心像素点的影响要弱一些。满足这一特性的话,最好的滤波器是高斯核。

高斯函数的公式:

函数函数的图像:

 

由公式可知,σ 越小的话,图像应该就越瘦高,所以越靠近中心像素的权重就越大,模糊程度就越弱

2. 代码实现

  • src 代表原图
  • ksize 代表滤波核的大小,如(3,3)
  • sigmaX 水平方向标准差 ,sigmaY 垂直方向标准差 
  • borderType 在处理的时候暂时不用考虑

这里需要注意的是,sigmaY没有的时候,默认sigmaY = sigmaX 。如果sigmaX ,sigmaY 都为0或者负值的时候,会根据滤波核的大小自动计算

sigma = 0.3 * [ (ksize - 1) * 0.5 - 1] + 0.8

实现效果为:

 

3. other

书上有个定理,就是说滤波器的 kernel 为6倍σ 的最小奇整数的时候,那么再使用任意大的高斯核得到的结果都是一样的

例如σ = 7,那么kernel 最大的size是 43,在大的size都和43的效果一样

代码为:

import cv2
import numpy as np

img  = cv2.imread('./flower.jpg',0)
dst1 = cv2.GaussianBlur(img,(19,19),sigmaX=3)  # 3*6 + 1 = 19 最大的size核
dst2 = cv2.GaussianBlur(img,(35,35),sigmaX=3)  
diff = cv2.subtract(dst1,dst2)  # 得到的差值,不能用减号

cv2.imshow('img',np.hstack((img,dst1,dst2,diff)))
cv2.waitKey()
cv2.destroyAllWindows()

 可以验证结论的正确性