图像频域增强:带通带阻滤波器

带通滤波器

    带通滤波器是允许一定频率范围内的信号通过而阻止其他频率范围内的信号通过的滤波器。在实际应用中,允许以频率原点为中心的圆环带内信号通过的带通滤波器是放射对称的。

带阻滤波器

    带阻滤波器是阻止一定频率范围内的信号通过而允许其他频率范围内的信号通过的滤波器。对带通滤波器的转移函数取反就可以得到带阻滤波器。

理想带通、带阻滤波器

理想带通滤波器的转移函数为:

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)= 0D(u,v)<D02W1,D02W<=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)= 1D(u,v)<D02W0,D02W<=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)2D02]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)2D02]2N+[D(u,v)W]2N[D(u,v)2D02]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越大,巴特沃斯滤波越接近理想滤波器。

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值