大家好,欢迎来到IT知识分享网。
对图像进行频域滤波的几种常用低通滤波器,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 D0为滤波器半径。
理想低通滤波器:
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)={
10D(u,v)≤D0D(u,v)>D0
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+(D0D(u,v))2n1
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−21⋅(D0D(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
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/14014.html