带通滤波器
带通滤波器是允许一定频率范围内的信号通过而阻止其他频率范围内的信号通过的滤波器。在实际应用中,允许以频率原点为中心的圆环带内信号通过的带通滤波器是放射对称的。
带阻滤波器
带阻滤波器是阻止一定频率范围内的信号通过而允许其他频率范围内的信号通过的滤波器。对带通滤波器的转移函数取反就可以得到带阻滤波器。
理想带通、带阻滤波器
理想带通滤波器的转移函数为:
H ( u , v ) = { 0 , D ( u , v ) < D 0 − W 2 1 , D 0 − W 2 < = D ( u , v ) < = D 0 + w 2 0 , D ( u , v ) > D 0 + W 2 H(u, v) = \left\{\begin{aligned}& 0,D(u, v) < D_0 - \frac{W}{2} \\ & 1, D_0 - \frac{W}{2} <= D(u, v) <= D_0 + \frac{w}{2} \\ & 0, D(u, v) > D_0 + \frac{W}{2} \end{aligned}\right. H(u,v)=⎩ ⎨ ⎧0,D(u,v)<D0−2W1,D0−2W<=D(u,v)<=D0+2w0,D(u,v)>D0+2W
- W W W : 圆环带的宽度
- D 0 D_0 D0 : 圆环带的中心频率
- D ( u , v ) D(u, v) D(u,v) : (u,v)到频谱中心的欧氏距离
理想带阻滤波器的转移函数为:
H ( u , v ) = { 1 , D ( u , v ) < D 0 − W 2 0 , D 0 − W 2 < = D ( u , v ) < = D 0 + w 2 1 , D ( u , v ) > D 0 + W 2 H(u, v) = \left\{\begin{aligned}& 1,D(u, v) < D_0 - \frac{W}{2} \\ & 0, D_0 - \frac{W}{2} <= D(u, v) <= D_0 + \frac{w}{2} \\ & 1, D(u, v) > D_0 + \frac{W}{2} \end{aligned}\right. H(u,v)=⎩ ⎨ ⎧1,D(u,v)<D0−2W0,D0−2W<=D(u,v)<=D0+2w1,D(u,v)>D0+2W
巴特沃斯带通、带阻滤波器
带通滤波转移函数为:
H ( u , v ) = [ D ( u , v ) W ] 2 N [ D ( u , v ) 2 − D 0 2 ] 2 N + [ D ( u , v ) W ] 2 N H(u, v) = \frac{[D(u, v)W]^{2N}}{[{D(u, v)}^2 - D_0^2]^{2N} + [D(u, v)W]^{2N}} H(u,v)=[D(u,v)2−D02]2N+[D(u,v)W]2N[D(u,v)W]2N
带阻滤波转移函数为:
H ( u , v ) = [ D ( u , v ) 2 − D 0 2 ] 2 N [ D ( u , v ) 2 − D 0 2 ] 2 N + [ D ( u , v ) W ] 2 N H(u, v) = \frac{[{D(u, v)}^2 - {D_0}^2]^{2N}}{[{D(u, v)}^2 - D_0^2]^{2N} + [D(u, v)W]^{2N}} H(u,v)=[D(u,v)2−D02]2N+[D(u,v)W]2N[D(u,v)2−D02]2N
Numpy实现带通滤波
import cv2 as cv
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
img = cv.imread('./images/xXX2.png')
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
img_gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
测试用例(逃学威龙1):
傅里叶变换:
dft = cv.dft(img_gray.astype('float32'),flags = cv.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum = cv.magnitude(dft_shift[:,:,0], dft_shift[:,:,1])
log_magnitude_spectrum = 20*np.log(magnitude_spectrum) # 幅值对数变换
理想带通、带阻滤波
def band_filter(img_gray, d0=100, w=50, ftype='pass'):
dft = cv.dft(img_gray.astype('float32'),flags = cv.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
m, n, _ = dft_shift.shape
center = (m//2, n//2)
mask = np.zeros_like(dft_shift)
x_arr = np.concatenate([np.arange(m).reshape(m, 1)], axis=1)
y_arr = np.concatenate([np.arange(n).reshape(1, n)], axis=0)
dist = np.sqrt((x_arr - center[0])**2 + (y_arr - center[1])**2)
mask[np.logical_and(dist >= (d0 - w/2), dist <= (d0 + w/2))] = 1
if ftype != 'pass':
mask = 1 - mask
bpf_dft_shift = dft_shift * mask
magnitude_spectrum = cv.magnitude(bpf_dft_shift[:,:,0], bpf_dft_shift[:,:,1])
log_magnitude_spectrum = 20*np.log(magnitude_spectrum+1)
bpf_dft = np.fft.ifftshift(bpf_dft_shift)
img_ = cv.idft(bpf_dft)
img_bpf = cv.magnitude (img_[:,:,0],img_[:,:,1])
return img_bpf, log_magnitude_spectrum
img_bpf1, log_ms1 = band_filter(img_gray, d0 = 75, w=60)
img_bsf2, log_ms2 = band_filter(img_gray, d0 = 75, w=60, ftype='stop')
巴特沃斯带通、带阻滤波器
def bwband_filter(img_gray, d0=100, w=50, N= 1, ftype='pass'):
dft = cv.dft(img_gray.astype('float32'),flags = cv.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
m, n, _ = dft_shift.shape
center = (m//2, n//2)
x_arr = np.concatenate([np.arange(m).reshape(m, 1)], axis=1)
y_arr = np.concatenate([np.arange(n).reshape(1, n)], axis=0)
dist = np.sqrt((x_arr - center[0])**2 + (y_arr - center[1])**2)
if ftype == 'pass':
a = (dist * w)**(2*N)
b = (dist**2 - d0**2)**(2*N) + (dist*w)**(2*N)
mask = a/b
else:
a = (dist**2 - d0**2)**(2*N)
b = (dist**2 - d0**2)**(2*N) + (dist*w)**(2*N)
mask = a/b
bsf_dft_shift = dft_shift * mask.reshape(m, n, 1)
magnitude_spectrum = cv.magnitude(bsf_dft_shift[:,:,0], bsf_dft_shift[:,:,1])
log_magnitude_spectrum = 20*np.log(magnitude_spectrum+1)
bsf_dft = np.fft.ifftshift(bsf_dft_shift)
img_ = cv.idft(bsf_dft)
img_bsf = cv.magnitude (img_[:,:,0],img_[:,:,1])
return img_bsf, log_magnitude_spectrum
N = 1 N=1 N=1
img_bsf1, log_ms1 = bwband_filter(img_gray, d0=75, w=60, N=1, ftype='pass')
img_bsf2, log_ms2 = bwband_filter(img_gray, d0=75, w=60, N=1, ftype='stop')
N
=
2
N=2
N=2
img_bsf3, log_ms3 = bwband_filter(img_gray, d0=75, w=60, N=2, ftype='pass')
img_bsf4, log_ms4 = bwband_filter(img_gray, d0=75, w=60, N=2, ftype='stop')
N = 4 N=4 N=4
img_bsf5, log_ms5 = bwband_filter(img_gray, d0=75, w=60, N=4, ftype='pass')
img_bsf6, log_ms6 = bwband_filter(img_gray, d0=75, w=60, N=4, ftype='stop')
N = 8 N=8 N=8
img_bsf7, log_ms7 = bwband_filter(img_gray, d0=75, w=60, N=8, ftype='pass')
img_bsf8, log_ms8 = bwband_filter(img_gray, d0=75, w=60, N=8, ftype='stop')
N N N越大,巴特沃斯滤波越接近理想滤波器。