三种常见的平滑滤波方法

三种常见的平滑滤波方法

一、概述

平滑滤波,顾名思义就是对信号进行处理使之整体显得更加平滑,降低噪声影响,提高信号质量,它常见于数学信号处理和图像处理,一般意义上的数字信号多体现于一维数据,图像信号多体现于二维数据。 均值滤波、中值滤波、高斯滤波是三种常见的平滑滤波方法,其中均值滤波和高斯滤波是线性技术,中值滤波是非线性技术。它们实现的基本原理是基本一致的,指定一个滑动窗口,计算其中的均值、中值、卷积值输出到当前位置。 均值滤波、高斯滤波对高斯噪声表现较好,但对椒盐噪声表现较差;中值滤波则对椒盐噪声表现较好,对高斯噪声表现较差。

二、基本原理

均值滤波、中值滤波、高斯滤波的基本原理都是以一个滑动窗口,以指定的计算方式得到其中的值,将它输出到信号的当前位置, 均值滤波计算均值,中值滤波计算中值,高斯滤波计算卷积值。窗口大小L的设定一般为2k+1,每次计算窗口中心位置的值。 该种策略下,在边缘区域窗口输出的位置是无法覆盖到的,因此需要特定的方式进行处理。处理的方式通常有四种:不作处理、只计算窗口包含区域、外周填充0、外周填充邻近元素值或指定值。

1.均值滤波

(1)一维 对于信号(a1,a2,…,an),定义一个大小为L的窗口,计算窗口中元素的均值

v

m

e

a

n

=

1

L

i

=

1

L

x

i

vmean=\frac{1}{L}\sum_{i=1}^{L}{x_i}

vmean=L1​i=1∑L​xi​ 作为对应窗口

L

+

1

2

\frac{L+1}{2}

2L+1​位置处的输出值。 (2)二维 对于一幅灰度图像 KaTeX parse error: No such environment: equation* at position 9: A=\begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix… 定义一个大小为L*L的窗口,计算窗口中元素的均值

v

m

e

a

n

=

1

L

2

i

=

1

L

j

=

1

L

p

i

j

vmean=\frac{1}{L^{2}}\sum_{i=1}^{L}{\sum_{j=1}^{L}{p_{ij}}}

vmean=L21​i=1∑L​j=1∑L​pij​ 作为对应窗口

(

L

+

1

2

,

L

+

1

2

)

\left( \frac{L+1}{2},\frac{L+1}{2} \right)

(2L+1​,2L+1​) 位置处的输出值。

2.中值滤波

(1)一维 对于信号(a1,a2,…,an),定义大小为L的窗口,计算窗口中元素的中值。

升序(降序)排列为(r1,r2,…,rL),取中间

L

+

1

2

\frac{L+1}{2}

2L+1​处的值,作为对应窗口

L

+

1

2

\frac{L+1}{2}

2L+1​ 位置处的输出值。

(2)二维 对于一幅灰度图像 KaTeX parse error: No such environment: equation* at position 9: A=\begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix… 定义大小为L*L的窗口,计算窗口中元素的中值。

升序(降序)排列为(r1,r2,…,rL2),取中间

L

2

+

1

2

\frac{L^2+1}{2}

2L2+1​处的值,作为对应窗口

(

L

+

1

2

,

L

+

1

2

)

\left( \frac{L+1}{2}, \frac{L+1}{2}\right)

(2L+1​,2L+1​)位置处的输出值。

3.高斯滤波

高斯滤波类似于均值滤波和中值滤波,形式上和均值滤波是统一的。均值滤波计算的是元素的均值,也就是均数1/n的加权和。高斯滤波同样定义一个滑动窗口,这个窗口中对应于每个元素定义了一个权重参数,窗口的输出就是数据元素和这些权重参数的加权和,因为这个运算是形式化的卷积运算,因此这个窗口叫做卷积核。 (1)一维 对于信号(a1,a2,…,an),定义一个大小为L的卷积核

(

w

1

,

w

2

,

.

.

.

,

w

L

)

\left( w_1,w_2,...,w_L \right)

(w1​,w2​,...,wL​) 与数据元素做卷积运算,得到值

v

g

a

u

s

=

i

=

1

L

w

i

x

i

vgaus=\sum_{i=1}^{L}{w_i\cdot x_i}

vgaus=i=1∑L​wi​⋅xi​ 作为对应窗口

L

+

1

2

\frac{L+1}{2}

2L+1​位置处的输出值。 (2)二维 对于一幅灰度图像 KaTeX parse error: No such environment: equation* at position 9: A=\begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix… 定义一个大小为L*L的卷积核 KaTeX parse error: No such environment: equation* at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix… 与数据元素做卷积运算,得到值

v

g

a

u

s

=

i

=

1

L

j

=

1

L

w

i

j

x

i

j

vgaus=\sum_{i=1}^{L}{\sum_{j=1}^{L}{w_{ij}\cdot x_{ij}}}

vgaus=i=1∑L​j=1∑L​wij​⋅xij​ 作为对应窗口

(

L

+

1

2

,

L

+

1

2

)

\left( \frac{L+1}{2}, \frac{L+1}{2}\right)

(2L+1​,2L+1​)位置处的输出值。

4.边缘处理

滤波窗口处在数据边缘区域时,对于最外周的

L

1

2

\frac{L-1}{2}

2L−1​宽度的那些元素,窗口输出的位置无法涵盖到它们,因此需要以一定的策略对该区域进行处理。常见的处理策略有以下几种: (1)不作处理 对于边缘区域不作处理,计算时直接略过。 (2)只计算窗口包含区域 照常由窗口的中心点进行覆盖,计算时不计外周缺失的部分,只计算窗口包含的区域。 (3)外周填充0 照常由窗口的中心点进行覆盖,外周缺失的部分填充0。 (4)外周填充邻近元素值或其他指定值 照常由窗口的中心点进行覆盖,外周缺失的部分填充邻近元素值或其他指定的值。

三、示例

1.均值滤波

一维: 有信号段S=[3, 2, 4, 5, 13, 7, 9, 10, 1, 6],定义长度为3的窗口,进行均值滤波的平滑处理,边缘区域以填充0的方式操作。 首位置窗口的三个元素为[0,3,2],输出均值

0

+

3

+

2

3

1.67

\frac{0+3+2}{3}\approx1.67

30+3+2​≈1.67 ; 窗口滑至下一位置,三个元素为[3,2,4],输出均值

3

+

2

+

4

3

=

3

\frac{3+2+4}{3}=3

33+2+4​=3; 窗口滑至下一位置,三个元素为[2,4,5],输出均值

2

+

4

+

5

3

3.67

\frac{2+4+5}{3}\approx3.67

32+4+5​≈3.67 ; 同样地,窗口依次输出值7.33、8.33、9.67、8.67、6.67、5.67,在最后一个窗口位置,三个元素为[1,6,0],输出均值2.33。 因此,输出的信号段为O=[1.67, 3, 3.67, 7.33, 8.33, 9.67, 8.67, 6.67, 5.67, 2.33]。

python实现:

import numpy as np

from scipy import signal

S = np.array([3, 2, 4, 5, 13, 7, 9, 10, 1, 6])

slid_wind_L = 3 # 滑动窗口长度

filter_kernal = np.ones(slid_wind_L) / float(slid_wind_L) # 滤波核

Out = signal.convolve(S, filter_kernal,'same') # 滤波计算

Out = np.round(Out,2) # 保留两位小数

print('Out:\n',Out)

二维: 有图像矩阵 KaTeX parse error: No such environment: equation* at position 9: I=\begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix… 定义长度为3*3的窗口,进行均值滤波的平滑处理,边缘区域以填充0的方式操作。 首位置窗口内容为 KaTeX parse error: No such environment: equation* at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix…,输出均值

1

9

(

0

+

0

+

0

+

0

+

0

+

4

+

3

+

2

+

5

)

1.56

\frac{1}{9}\left( 0+0+0+0+0+4+3+2+5 \right)\approx1.56

91​(0+0+0+0+0+4+3+2+5)≈1.56 ; 窗口滑至下一位置,内容为 KaTeX parse error: No such environment: equation* at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix…,输出均值2.44; 窗口滑至下一位置,内容为 KaTeX parse error: No such environment: equation* at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix…,输出均值2.56; 窗口滑至下一位置,内容为 KaTeX parse error: No such environment: equation* at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix… ,输出均值1.67; 同样地,窗口依次输出值1.78、3.33、4.33、3.44、2.11、4.11、5.11、4.22、1.33、2.56、3.67、3.33。 因此,输出的图像矩阵为 KaTeX parse error: No such environment: equation* at position 9: O=\begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix…。

python实现:

I = np.array([[4,3,1,6],[2,5,7,1],[2,0,6,10],[7,3,5,9]])

slid_wind_L = 3 # 滑动窗口长度

filter_kernal = np.ones((slid_wind_L,slid_wind_L)) / float(slid_wind_L*slid_wind_L) # 滤波核

Out = signal.convolve2d(I, filter_kernal, mode='same') # 滤波计算

Out = np.round(Out,2) # 保留两位小数

print('Out:\n',Out)

2.中值滤波

一维: 有信号段S=[3, 2, 4, 5, 13, 7, 9, 10, 1, 6],定义长度为3的窗口,进行中值滤波的平滑处理,边缘区域以填充0的方式操作。 首位置窗口的三个元素为[0,3,2],输出中值2; 窗口滑至下一位置,三个元素为[3,2,4],输出中值3; 窗口滑至下一位置,三个元素为[2,4,5],输出中值4; 同样地,窗口依次输出值5、7、9、9、9、6、1。 因此,输出的信号段为O=[2, 3, 4, 5, 7, 9, 9, 9, 6, 1]。

python实现:

S = np.array([3, 2, 4, 5, 13, 7, 9, 10, 1, 6])

Out = signal.medfilt(S,3) # 滤波计算

Out = np.round(Out,2) # 保留两位小数

print('Out:\n',Out)

二维: 有图像矩阵 KaTeX parse error: No such environment: equation* at position 9: I=\begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix… 定义长度为3*3的窗口,进行中值滤波的平滑处理,边缘区域以填充0的方式操作。 首位置窗口内容为KaTeX parse error: No such environment: equation* at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix… ,输出中值0; 窗口滑至下一位置,内容为 KaTeX parse error: No such environment: equation* at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix… ,输出中值2; 窗口滑至下一位置,内容为 KaTeX parse error: No such environment: equation* at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix… ,输出中值1; 窗口滑至下一位置,内容为 KaTeX parse error: No such environment: equation* at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix… ,输出中值0; 同样地,窗口依次输出值2、3、5、1、2、5、5、5、0、2、3、0。 因此,输出的图像矩阵为 KaTeX parse error: No such environment: equation* at position 9: O=\begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix…。

python实现:

I = np.array([[4,3,1,6],[2,5,7,1],[2,0,6,10],[7,3,5,9]])

Out = signal.medfilt2d(I,[3,3]) # 滤波计算

Out = np.round(Out,2) # 保留两位小数

print('Out:\n',Out)

3.高斯滤波

一维: 有信号段S=[3, 2, 4, 5, 13, 7, 9, 10, 1, 6],定义长度为3的卷积核[1, 0, 1],进行高斯滤波的平滑处理,边缘区域以填充0的方式操作。 首位置窗口的三个元素为[0,3,2],输出卷积值2; 窗口滑至下一位置,三个元素为[3,2,4],输出卷积值7; 窗口滑至下一位置,三个元素为[2,4,5],输出卷积值7; 同样地,窗口依次输出值17、12、22、17、10、16、1。 因此,输出的信号段为O=[2, 7, 7, 17, 12, 22, 17, 10, 16, 1]。

python实现:

S = np.array([3, 2, 4, 5, 13, 7, 9, 10, 1, 6])

filter_kernal = np.array([1,0,1]) # 滤波核

filter_kernal = np.flip(filter_kernal) # 旋转180度

Out = signal.convolve(S, filter_kernal,'same') # 滤波计算

Out = np.round(Out,2) # 保留两位小数

print('Out:\n',Out)

二维: 有图像矩阵 KaTeX parse error: No such environment: equation* at position 9: I=\begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix… 定义长度为3*3的卷积核 KaTeX parse error: No such environment: equation* at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix…,进行高斯滤波的平滑处理,边缘区域以填充0的方式操作。 首位置窗口内容为 KaTeX parse error: No such environment: equation* at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix… ,输出卷积值5; 窗口滑至下一位置,内容为 KaTeX parse error: No such environment: equation* at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix… ,输出卷积值9; 窗口滑至下一位置,内容为 KaTeX parse error: No such environment: equation* at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix… ,输出卷积值6; 窗口滑至下一位置,内容为 KaTeX parse error: No such environment: equation* at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix…,输出卷积值7; 同样地,窗口依次输出值3、13、19、7、8、21、18、12、0、8、10、6。 因此,输出的图像矩阵为 KaTeX parse error: No such environment: equation* at position 9: O=\begin{̲e̲q̲u̲a̲t̲i̲o̲n̲*̲}̲ \begin{bmatrix…。

python实现:

I = np.array([[4,3,1,6],[2,5,7,1],[2,0,6,10],[7,3,5,9]])

filter_kernal = np.array([[1,0,1],[0,0,0],[1,0,1]]) # 滤波核

filter_kernal = np.flip(filter_kernal) # 旋转180度

Out = signal.convolve2d(I,filter_kernal,'same') # 滤波计算

Out = np.round(Out,2) # 保留两位小数

print('Out:\n',Out)

pdf下载: https://download.csdn.net/download/Albert201605/88191979?spm=1001.2014.3001.5503

End.

参考: https://blog.csdn.net/cjsh_123456/article/details/79261271

相关推荐

365bet亚洲投注 穆勒世界杯决赛经典进球回顾与传奇时刻再探究
365bet亚洲投注 初五迎来返程高峰,进出西双版纳这样走→
365bet-体育投注 麤豪的意思

麤豪的意思

📅 07-05 👁️ 9405