Gaussian Filtering

高斯平滑

高斯平滑又叫高斯滤波,是一种数据平滑技术, 常用在图像模糊(Blur)中去除噪声和细节。

1.高斯函数

高斯函数就是我们常说的高斯分布(Gaussian Distribution),一维中,高斯函数如下:

上式中标准差为σ,平均值μ为0。

如图所示,高斯分布是对称的钟形,上图为均值为0,标准差为1的高斯分布也即正态分布,高斯函数的标准差在其滤波中起着重要作用。位于±σ之间的值占集合的68%,而位于±2σ之间的值占集合的95%,±3σ占99.7%,这在设计固定长度的高斯核时非常重要。

其他性质:

  • 高斯函数在实数域的积分x∈(-∞,+∞)为1,从概率学的角度看表示所有事件集合;
  • 高斯函数的值不为零;
  • 高斯函数是对称函数,对称轴为均值。

高斯分布的特点是在均值μ两边的概率都很大,离之越远的概率越小,所以高斯函数用在滤波上体现的思想就是:离某个点越近的点对其产生的影响越大,所以让其权重大,越远的产生的影响越小,让其权重越小。高斯滤波的关键是生成高斯核(Gaussian Kernel)。

2.高斯核(Gaussian Kernel)

数字滤波领域信号一般都是离散的,如一维数字信号用f(nT)进行描述,其中T为采样周期,n为时间序列。f(nT)表示第n个采样时刻的信号值。

所谓高斯滤波操作,其实就是用高斯函数对原始信号做卷积计算。理论上,高斯分布在所有定义域上都有非负值,这就需要一个无限大的卷积核。实际上,仅需要取均值周围3倍标准差(即3σ )内的值,以外部份直接去掉即可。
而高斯函数是连续函数,所以我们要从连续高斯函数中采样生成离散的权重系数,即Gaussian Kernel。 高斯核是对连续高斯函数的离散近似,通常对高斯函数进行离散采样和归一化得出,这里,归一化指的是卷积核所有元素(权重系数)之和为1。下面分别为为一维和二维高斯核的例子:

计算高斯核中,有两个重要参数:σ、 。σ为高斯函数的标准差; 为核大小。不同的σ和 会有不同的滤波结果。

高斯核可以看成是与中心距离负相关的权重。平滑时,调整σ实际是在调整周围像素对当前像素的影响程度,调大σ即提高了远处像素对中心像素的影响程度,滤波结果也就越平滑。高斯曲线随σ变化的曲线如下:

高斯核是对连续高斯的离散近似,窗口越大自然近似越好,但高斯函数是钟形曲线,距离中心越远数值越小,足够远处可以忽略不计,钟型曲线在区间(μ−σ,μ+σ)(μ−σ,μ+σ)范围内的面积占曲线下总面积的68%,(μ−2σ,μ+2σ)范围占95%,(μ−3σ,μ+3σ)范围占99.7%,一般3σ外的数值已接近于0,可忽略,半径为3σ即窗口大小为6σ×6σ即可,通常取最近的奇数。

3.一维高斯滤波例子

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# -*- coding: utf-8 -*-
"""
Created on Thu Dec 9 22:22:11 2021

@author: W-H
"""
import matplotlib.pyplot as plt
import numpy as np
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题


def gauss_kernel(r, sigma, *args, **kwargs):
""" 生成一维高斯滤波高斯核
---
参数
r:float
核大小,通常为基数
sigma: float
标准差
---
输出
gauss_weight:array
高斯核
"""
gauss_weight = np.zeros(2*r+1)
for i in range(1, 2*(r+1), 1):
gauss_weight[i-1] = np.exp(-1*pow((i-r), 2) /
(2*pow(sigma, 2))) / (sigma*np.sqrt(2*np.pi))
return gauss_weight


def gaussian_filtering_1(data, kernel_cof, r):
""" 一维高斯滤波
---
参数
data: array
原始数据
kernel_cof: array
高斯核
r: float
核大小,通常为基数
---
输出
data_f: array
滤波后数据
说明
高斯滤波是对原始数据进行核卷积运算,滤波中边界不进行处理
data = [1,2,3,4,5]
kernel_cof = [a1,a0,a1]
data_f[0] = 1 # 保留原始数据
data_f[1] = a1*data[1-1] + a0*data[1] + a1*data[1+1]
.
.
.
data[4] = 5
"""
#
data_y = np.zeros(data.size)
data_len = data.size
for k in range(data_len):
if k < r or k > data_len-r-1:
data_y[k] = data[k]
else:
temp = np.dot(data[k-r:k+r+1], kernel_cof)
data_y[k] = temp
return data_y


def test_1():
# 生成测试数据
data = np.random.rand(100)
r = 2
sigma = 5
gauss_cof = gauss_kernel(r, sigma)
data_y1 = gaussian_filtering_1(data, gauss_cof, r)
r = 2
sigma = 20
gauss_cof = gauss_kernel(r, sigma)
data_y2 = gaussian_filtering_1(data, gauss_cof, r)
plt.plot(data, 'o-',alpha=0.8)
plt.plot(data_y1, 'o-',alpha=0.8)
plt.plot(data_y2, 'o-',alpha=0.8)
plt.xlabel('采样周期T')
plt.ylabel('y')
plt.grid(axis='x', color='0.95')
plt.legend(['原始信号', 'sigma:5,r:2高斯滤波', 'sigma:20,r:2高斯滤波'])
plt.show()


if __name__ == "__main__":
test_1()

从上图可以看到,σ值越大,相比较于原始随机信号,滤波结果越平滑。从频域角度描述就是高频信号分量越少。

3.二维高斯滤波例子

二维高斯滤波是一维高斯滤波的扩展,从原理上来说没有区别。相比较于一维高斯滤波,不同点在于:

  • 原始信号维度;
  • 高斯核;

二维高斯函数:

高纬高斯函数:

下面是使用scipy的一个简单例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
from scipy import misc
import matplotlib.pyplot as plt
from scipy.ndimage import gaussian_filter
#
fig = plt.figure()
plt.gray() # show the filtered result in grayscale
ax1 = fig.add_subplot(121) # left side
ax2 = fig.add_subplot(122) # right side
ascent = misc.ascent()
result = gaussian_filter(ascent, sigma=5)
ax1.imshow(ascent)
ax2.imshow(result)
plt.show()

关于二维高斯滤波具体原理参考Microsoft PowerPoint - Image Filtering-6.ppt Compatibility Mode (auckland.ac.nz)

Reference

  1. scipy.ndimage.gaussian_filter — SciPy v1.7.1 Manual
  2. Microsoft PowerPoint - Image Filtering-6.ppt Compatibility Mode (auckland.ac.nz)
  3. 03 The Gaussian kernel.pdf (utah.edu)
  4. 高斯模糊的算法 - 阮一峰的网络日志 (ruanyifeng.com)
  5. 如何确定高斯滤波的标准差和窗口大小 - shine-lee - 博客园 (cnblogs.com)
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2023 Wh
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信