当前位置:   article > 正文

图像频域增强:低通滤波器_频率平面原点到(u,v)的距离是什么

频率平面原点到(u,v)的距离是什么

频域低通滤波

低通滤波器的功能是削弱或消除高频分量而保留低频分量。

理想低通滤波器

理想低通滤波器,模拟上容易实现,物理上无法实现。

转移函数定义:
H ( u , v ) = { 1 , D ( u , v ) < = D 0 0 , D ( u , v ) > D 0 H(u, v) = \left\{

1D(u,v)<=D00D(u,v)>D0
\right. H(u,v)={1D(u,v)<=D00D(u,v)>D0

  • D ( u , v ) D(u, v) D(u,v) : 是点(u, v)到频率平面原点的距离,也就是点(u,v)到频谱中心的欧氏距离。
  • D 0 D_0 D0 : 带通半径。
巴特沃斯低通滤波器

巴特沃斯低通滤波器是物理上可实现的,高低频之间的过渡比较平滑。

转移函数定义为:

H ( u , v ) = 1 1 + [ D ( u , v ) D 0 ] 2 n H(u, v) = \frac{1}{1 + \Big[\frac{D(u, v)}{D_0}\Big]^{2n}} H(u,v)=1+[D0D(u,v)]2n1

  • D 0 D_0 D0 : 常用的截断频率为: D m a x ( u , v ) × 1 2 D_{max}(u, v) \times \frac{1}{\sqrt{2}} Dmax(u,v)×2 1
高斯低通滤波器

H ( u , v ) = e − D ( u , v ) 2 2 D 0 2 H(u, v) = e^{\frac{-{D(u, v)}^2}{2{D_0}^2}} H(u,v)=e2D02D(u,v)2

Opencv+Numpy实现低通滤波
import cv2 as cv
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
  • 1
  • 2
  • 3
  • 4
img = cv.imread('./images/kxxx.png')
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
img_gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
  • 1
  • 2
  • 3

测试用例(美剧杀出个黎明):
在这里插入图片描述

傅里叶变换:

dft = cv.dft(img_gray.astype('float32'),flags = cv.DFT_COMPLEX_OUTPUT)           # 傅里叶变换(Opencv是用深度为2数组表示复数)
dft_shift = np.fft.fftshift(dft)                                                 # 移动零频分量
magnitude_spectrum = cv.magnitude(dft_shift[:,:,0], dft_shift[:,:,1])
log_magnitude_spectrum = 20*np.log(magnitude_spectrum)  # 幅值对数变换
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

理想LPF

H ( u , v ) = { 1 , D ( u , v ) < = D 0 0 , D ( u , v ) > D 0 H(u, v) = \left\{

1D(u,v)<=D00D(u,v)>D0
\right. H(u,v)={1D(u,v)<=D00D(u,v)>D0

def lpf(dft_shift, r=100):
    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[dist <= r] = 1
    return mask
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
huv = lpf(dft_shift)                        # 转移函数(算子/模)
lpf_dft_shift = dft_shift * huv             # 低通滤波
lpf_magnitude_spectrum = cv.magnitude(lpf_dft_shift[:,:,0], lpf_dft_shift[:,:,1])
log_lpf_magnitude_spectrum = 20*np.log(lpf_magnitude_spectrum+1) # 幅值对数变换
lpf_dft = np.fft.ifftshift(lpf_dft_shift)         # 还原频谱图
img_ = cv.idft(lpf_dft)                           # 逆傅里叶变换
img_lpf = cv.magnitude (img_[:,:,0],img_[:,:,1])  # 还原图像
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

理想转移函数
在这里插入图片描述
滤波效果:

在这里插入图片描述

巴特沃斯低通滤波

H ( u , v ) = 1 1 + [ D ( u , v ) D 0 ] 2 n H(u, v) = \frac{1}{1 + \Big[\frac{D(u, v)}{D_0}\Big]^{2n}} H(u,v)=1+[D0D(u,v)]2n1

def bw_lpf(dft_shift, r=100, N=1):
    m, n, _ = dft_shift.shape
    center = (m//2, n//2)
    mask = np.ones_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).reshape(m, n, 1)
    mask = 1/(1+(dist/r)**(2*N))
    return mask
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

巴特沃斯转移函数

在这里插入图片描述
在这里插入图片描述

高斯低通滤波

H ( u , v ) = e − D ( u , v ) 2 2 D 0 2 H(u, v) = e^{\frac{-{D(u, v)}^2}{2{D_0}^2}} H(u,v)=e2D02D(u,v)2

def gaussian_lpf(dft_shift, r=100):
    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_square = np.sqrt((x_arr - center[0])**2 + (y_arr - center[1])**2).reshape(m, n, 1)
    mask = np.exp(-1*dist_square/(2*r*r))
    return mask
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

高斯转移函数
在这里插入图片描述
在这里插入图片描述

从测试的结果可以看出,在屏蔽部分高频分量后,图像开始变得有些模糊。以及在相同的带通半径下,巴特沃斯滤波器最接近理想低通滤波器。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/78338
推荐阅读
相关标签
  

闽ICP备14008679号