高斯滤波gaussian_filter()

参考:https://blog.csdn.net/zhangfuliang123/article/details/76100973

高斯滤波是一种线性平滑滤波,可以去除高斯噪声,其效果是降低图像灰度的尖锐变化,也就是图像模糊了。高斯滤波对于抑制服从正态分布的噪声效果非常好,其代价是使图像变得模糊。当然,有时对图像进行平滑滤波的目的就是让图像变模糊。

所谓模糊,可以理解成每一个像素都去周边像素的平均值。显然,计算平均值时,取值范围越大,模糊效果越强烈。接下来的问题就是,既然每个点都要取周边像素的平均值,那么应该如何分配权重呢?如果使用简单平均,显然不是很合理,因为图像都是连续的,越靠近的点关系越密切,越远离的点关系越疏远,因此,加权平均更合理,距离越近的点权重越大,距离越远的点权重越小。

高斯模糊

比较常见的图像模糊算法为”高斯模糊“,所谓模糊,可以理解为每一个像素都取周边像素的平均值

 

上图中,2是中间点,周边点都是1,中间点取周围点的平均值,就会变成1,在数值上,这是一种平滑化,在图形上,就相当于产生模糊效果,中间点失去细节。

接下来的问题及时,既然每个点都要取周边像素的平均值,那么应该如何分配权重呢?

如果使用简单平均,显然不是很合理,因为图像都是连续的,越靠近的点关系越密切,越远离的点关系越疏远,因此,加权平均更合理,距离越近的点权重越大,距离越远的点权重越小。正态分布(高斯滤波)显然是一种可取的权重分配方式。

高斯滤波的模板使用高斯公式计算出来的,下面是一维和二维高斯分布函数及其函数图像:

一维高斯分布函数:

G(x)=\frac{1}{\sqrt{2\pi}\sigma }e^{-\frac{x^2}{2\sigma ^2}}

二维高斯分布函数:

G(x,y)=\frac{1}{2\pi \sigma^2 }e^{-\frac{x^2+y^2}{2\sigma ^2}}

具体操作是:利用二维高斯分布函数,生成高斯模板,然后用模板取扫描图像中的每一个像素,用模板确定的领域内像素的加权平均值作为新图像中模板中心位置的像素值。

图像分别为

高斯滤波gaussian_filter()_第1张图片

计算平均值的时候,我们只需要将中心点作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。

权重矩阵

假定中心点的坐标是(0,0),那么距离它最近的8个点的坐标如下:

高斯滤波gaussian_filter()_第2张图片

更远的点以此类推。为了计算权重矩阵,需要设定\sigma的值,假设其=1.5,则模糊半径=1(就是周边的具体范围,周边相邻=1的点)的权重矩阵如下:

例如:(0,0)上的权值为:

高斯滤波gaussian_filter()_第3张图片

(-1,1)上的权值为:

高斯滤波gaussian_filter()_第4张图片

其他位置上的权重以此类推,这9个点的权重总和等于0.4787147,如果只计算这9个点的加权平均,还必须让他们的权重之和=1,因此上面9个值还要分别除以0.4787147,得到最终的权重矩阵

例如:(0,0)和(-1,1)上的权值为:

w_{0,0}=\frac{0.0707355}{0.4787147}=0.14776129

w_{-1,1}=\frac{0.04535423}{0.4787147}=0.9474167

计算高斯模糊

有了权重矩阵,就可以计算高斯模糊的值了,假设现有9个像素点,灰度值(0-255):

每个点乘以自己的权重值

高斯滤波gaussian_filter()_第5张图片

得到

将这9个值加起来,就是中心点的高斯模糊值。

在python中,有多维高斯滤波器的实现

def gaussian_filter(input, sigma, order=0, output=None,
                    mode="reflect", cval=0.0, truncate=4.0):

输入参数:

input: 输入到函数的是矩阵

sigma:标量或标量序列,就是高斯函数里面的\sigma,这个值越大,滤波之后的图像越模糊

返回值:

返回值是和输入形状一样的矩阵

from scipy.ndimage import gaussian_filter
import cv2
import matplotlib.pyplot as plt
a =cv2.imread('./test_images/33.jpeg')
result = gaussian_filter(a, sigma=5)
plt.subplot(1,2,1)
plt.imshow(a)
plt.subplot(1,2,2)
plt.imshow(result)
plt.show()

 

 

你可能感兴趣的:(高斯滤波gaussian_filter())