赞
踩
低通滤波器的功能是削弱或消除高频分量而保留低频分量。
理想低通滤波器,模拟上容易实现,物理上无法实现。
转移函数定义:
H
(
u
,
v
)
=
{
1
,
D
(
u
,
v
)
<
=
D
0
0
,
D
(
u
,
v
)
>
D
0
H(u, v) = \left\{
巴特沃斯低通滤波器是物理上可实现的,高低频之间的过渡比较平滑。
转移函数定义为:
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
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)=e2D02−D(u,v)2
import cv2 as cv
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
img = cv.imread('./images/kxxx.png')
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
img_gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
测试用例(美剧杀出个黎明):
傅里叶变换:
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) # 幅值对数变换
H
(
u
,
v
)
=
{
1
,
D
(
u
,
v
)
<
=
D
0
0
,
D
(
u
,
v
)
>
D
0
H(u, v) = \left\{
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
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]) # 还原图像
理想转移函数
滤波效果:
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
巴特沃斯转移函数
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)=e2D02−D(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
高斯转移函数
从测试的结果可以看出,在屏蔽部分高频分量后,图像开始变得有些模糊。以及在相同的带通半径下,巴特沃斯滤波器最接近理想低通滤波器。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。