对图像进行频域滤波的几种常用低通滤波器,
python-opencv
实现:
低通滤波器(Low-pass filter)容许低频信号通过,但减弱频率高于截止频率的信号的通过。对于不同滤波器而言,每个频率的信号的减弱程度不同。当使用在音频应用时,它有时被称为高频剪切滤波器,或高音消除滤波器。
设
H
(
u
,
v
)
H(u, v)
H
(
u
,
v
)
为滤波器,
D
(
u
,
v
)
D(u, v)
D
(
u
,
v
)
为像素点到参考点的距离,
D
0
D_0
D
0
为滤波器半径。
理想低通滤波器
:
H
(
u
,
v
)
=
{
1
D
(
u
,
v
)
≤
D
0
0
D
(
u
,
v
)
>
D
0
H(u, v) = \left\{ \begin{array}{ccc} 1 & D(u, v) \le D_0\\ 0 & D(u, v) > D_0\end{array} \right.
H
(
u
,
v
)
=
{
1
0
D
(
u
,
v
)
≤
D
0
D
(
u
,
v
)
>
D
0
import cv2 as cv
import numpy as np
def ILPF(shape, radius):
mask = np.zeros(shape[:2], dtype=np.uint8)
cv.circle(mask, (int(w / 2), int(h / 2)), radius, (255, 255, 255), -1)
return mask
# 示意图
cv.imshow('ilpf', ILPF((900, 900), 30))
示意图:
butterworth巴特沃斯滤波器
:
巴特沃斯滤波器
的特点是通频带(passband)内的频率响应曲线最大限度平坦,没有涟波,而在阻频带则逐渐下降为零。
一阶巴特沃斯滤波器的衰减率为每倍频6 dB,每十倍频20 dB(所有一阶低通滤波器具有相同的归一化频率响应)。二阶巴特沃斯滤波器的衰减率为每倍频12 dB、 三阶巴特沃斯滤波器的衰减率为每倍频18 dB、如此类推。巴特沃斯滤波器的振幅是 ω 的一个单调函数,并且也是唯一的无论阶数,振幅对角频率曲线都保持同样的形状的滤波器。只不过滤波器阶数越高,在阻频带振幅衰减速度越快。其他滤波器高阶的振幅对角频率图和低级数的振幅对角频率有不同的形状。
H
(
u
,
v
)
=
1
1
+
(
D
(
u
,
v
)
D
0
)
2
n
H(u, v) = \frac{1}{1 + (\frac{D(u, v)}{D_0})^{2n}}
H
(
u
,
v
)
=
1
+
(
D
0
D
(
u
,
v
)
)
2
n
1
def butterworth_filter(shape, rank, radius):
""" butterworth filter genreator
H(u, v) = 1 / (1 + (D(u, v) / radius)^(2 * rank))
Args:
shape: 滤波器的形状
rank: 滤波器阶数
radius: 滤波器半径
"""
# 中心位置
h, w = shape[:2]
cx, cy = int(w / 2), int(h / 2)
# 计算以中心为原点坐标分量
u = np.array([[x - cx for x in range(w)] for i in range(h)], dtype=np.float32)
v = np.array([[y - cy for y in range(h)] for i in range(w)], dtype=np.float32).T
# 每个点到中心的距离
dis = np.sqrt(u * u + v * v)
filt = 1 / (1 + np.power(dis / radius, 2 * rank))
return filt
一、二阶滤波器
高斯滤波器
:
高斯滤波器的过度特性非常平坦,不会产生振铃现象(二维高斯分布)
H
(
u
,
v
)
=
e
−
1
2
⋅
(
D
(
u
,
v
)
D
0
)
2
H(u, v) = e^{-\frac{1}{2}\cdot (\frac{D(u, v)}{D_0})^2}
H
(
u
,
v
)
=
e
−
2
1
⋅
(
D
0
D
(
u
,
v
)
)
2
def gaussian_filter(shape, sigma):
""" Gaussian Low Pass filter
Args:
shape: 滤波器形状
sigma: sigma值(半径)
H(u, v) = e^(-(u^2 + v^2) / (2 * sigma^2))
"""
h, w = shape[: 2]
cx, cy = int(w / 2), int(h / 2)
u = np.array([[x - cx for x in range(w)] for i in range(h)], dtype=np.float32)
v = np.array([[y - cy for y in range(h)] for i in range(w)], dtype=np.float32).T
dis2 = u * u + v * v
p = -dis2 / (2 * sigma**2)
#filt = 1 / (2 * pi * sigma**2) * np.exp(p)
filt = np.exp(p)
return filt