文章目录
一:理想低通滤波
二:巴特沃斯低通滤波
三:指数低通滤波
四:梯形低通滤波
频域平滑滤波 :是数字图像处理中常用的一种滤波方法,它的主要思想是在频域 中对图像进行滤波处理。其步骤如下
对原始图像进行傅里叶变换 ,得到频域图像 对频域图像进行滤波操作 ,可以选择常用的低通滤波器,例如高斯低通滤波器、均值滤波器等 对滤波后的频域图像进行傅里叶逆变换 ,得到平滑后的图像
频域低通滤波的核心关键为设计合适的低通滤波器
H
(
u
,
v
)
H(u,v)
H ( u , v )
G
(
u
,
v
)
=
H
(
u
,
v
)
F
(
u
,
v
)
G(u,v)=H(u,v)F(u,v)
G ( u , v ) = H ( u , v ) F ( u , v )
频域平滑滤波有以下几类
一:理想低通滤波
(1)概述
理想低通滤波 :是一种在频域中将高频信号滤除,保留低频信号的滤波器。其数学表达式为
H
(
u
,
v
)
=
{
1
D
(
u
,
v
)
≤
D
0
0
D
(
u
,
v
)
>
D
0
H(u, v)=\left\{\begin{array}{ll}1 & D(u, v) \leq D_{0} \\0 & D(u, v)>D_{0}\end{array}\right.
H ( u , v ) = { 1 0 D ( u , v ) ≤ D 0 D ( u , v ) > D 0
其中,
H
(
u
,
v
H(u, v
H ( u , v )表示频域滤波器在
(
u
,
v
)
(u,v)
( u , v ) 处的值,
D
(
u
,
v
)
=
u
2
+
v
2
D(u,v)=\sqrt{ u^{2}+v^{2} }
D ( u , v ) = u 2 + v 2
表示频域中点
(
u
,
v
)
(u,v)
( u , v ) 到中心点的距离,
D
0
D_{0}
D 0 为截止频率,即在此频率以下的信号通过,此频率以上的信号被滤除
具体来说,可以通过对图像进行傅里叶变换,将图像转换到频域中。然后,将理想低通滤波器与频域图像做乘积,得到滤波后的频域图像。最后,对滤波后的频域图像进行反傅里叶变换,得到空域中的滤波结果
理想低通滤波器具有截止频率清晰、滤波效果好等优点,但由于其截止频率突变,会导致滤波结果出现“振铃”现象,同时也不适用于实际应用中,因为实际信号中的高频分量很难完全截止
“振铃”现象 :
H
(
u
,
v
)
H(u,v)
H ( u , v ) 在
D
9
D_{9}
D 9 处由1突变到0,其对应的冲激响应
h
(
x
,
y
)
h(x,y)
h ( x , y ) 在空域中表现为同心环形式;同心环半径与
D
0
D_{0}
D 0 成反比;
D
0
D_{0}
D 0 越小,同心环半径越大,模糊越厉害
如下图为“振铃”现象
(2)程序
实现如下效果:截断频率不同的理想低通滤波器
matlab实现 :
Image= imread ( 'lena.bmp' ) ;
imshow ( Image) ;
FImage= fftshift ( fft2 ( double ( Image) ) ) ;
[ N M] = size ( FImage) ;
g= zeros ( N, M) ;
r1= floor ( M/ 2 ) ; r2= floor ( N/ 2 ) ;
figure;
imshow ( log ( abs ( FImage) + 1 ) , [ ] ) , title ( '傅里叶频谱' ) ;
hold on
circle ( r1, r2, 5 )
circle ( r1, r2, 11 )
circle ( r1, r2, 45 )
circle ( r1, r2, 68 )
d0= [ 5 11 45 68 ] ;
for i = 1 : 4
for x= 1 : M
for y= 1 : N
d= sqrt ( ( x- r1) ^ 2 + ( y- r2) ^ 2 ) ;
if d<= d0 ( i )
h= 1 ;
else
h= 0 ;
end
g ( y, x) = h* FImage ( y, x) ;
end
end
g= real ( ifft2 ( ifftshift ( g) ) ) ;
figure, imshow ( uint8 ( g) ) , title ( [ '理想低通滤波D0=' , num2str ( d0 ( i ) ) ] ) ;
end
import cv2
import numpy as np
import matplotlib. pyplot as plt
Image = cv2. imread( 'lena.bmp' , cv2. IMREAD_GRAYSCALE)
plt. imshow( Image, cmap= 'gray' )
plt. show( )
FImage = np. fft. fftshift( np. fft. fft2( Image. astype( float ) ) )
N, M = FImage. shape
g = np. zeros( ( N, M) )
r1 = int ( M/ 2 )
r2 = int ( N/ 2 )
plt. imshow( np. log( np. abs ( FImage) + 1 ) , cmap= 'gray' )
plt. title( '傅里叶频谱' )
plt. hold( True )
circle1 = plt. Circle( ( r1, r2) , 5 , color= 'r' , fill= False )
circle2 = plt. Circle( ( r1, r2) , 11 , color= 'r' , fill= False )
circle3 = plt. Circle( ( r1, r2) , 45 , color= 'r' , fill= False )
circle4 = plt. Circle( ( r1, r2) , 68 , color= 'r' , fill= False )
plt. gca( ) . add_artist( circle1)
plt. gca( ) . add_artist( circle2)
plt. gca( ) . add_artist( circle3)
plt. gca( ) . add_artist( circle4)
plt. show( )
d0 = [ 5 , 11 , 45 , 68 ]
for i in range ( 4 ) :
for x in range ( M) :
for y in range ( N) :
d = np. sqrt( ( x- r1) ** 2 + ( y- r2) ** 2 )
if d <= d0[ i] :
h = 1
else :
h = 0
g[ y, x] = h * FImage[ y, x]
g = np. real( np. fft. ifft2( np. fft. ifftshift( g) ) )
plt. imshow( g. astype( np. uint8) , cmap= 'gray' )
plt. title( '理想低通滤波D0=' + str ( d0[ i] ) )
plt. show( )
二:巴特沃斯低通滤波
(1)概述
巴特沃斯低通滤波 :是一种用于去除图像中高频噪声的数字滤波方法。它是一种优化了幅频特性的滤波器,能够保留图像中更多的低频信息。该滤波器是基于巴特沃斯函数 设计的,巴特沃斯函数是一种理想的低通滤波器,其频率响应具有非常陡峭的截止特性,但在实际应用中会出现一些缺陷。因此,巴特沃斯低通滤波器是基于巴特沃斯函数的特点,通过添加一些适当的补偿来消除其缺陷的一种优化滤波器
{
H
(
u
,
v
)
=
1
1
+
[
D
(
u
,
v
)
/
D
0
]
2
n
H
(
u
,
v
)
=
1
1
+
(
2
−
1
)
[
D
(
u
,
v
)
/
D
0
]
2
n
\left\{\begin{array}{l}H(u, v)=\frac{1}{1+\left[D(u, v) / D_{0}\right]^{2 n}} \\H(u, v)=\frac{1}{1+(\sqrt{2}-1)\left[D(u, v) / D_{0}\right]^{2 n}}\end{array}\right.
{ H ( u , v ) = 1 + [ D ( u , v ) / D 0 ] 2 n 1 H ( u , v ) = 1 + ( 2
− 1 ) [ D ( u , v ) / D 0 ] 2 n 1
当
D
(
u
,
v
)
=
D
0
D(u,v)=D_{0}
D ( u , v ) = D 0 时,
H
(
u
,
v
)
H(u,v)
H ( u , v ) 降为最大值的
1
2
\frac{1}{2}
2 1 或
1
2
\frac{1}{\sqrt{ 2 }}
2
1
与其他低通滤波器相比,巴特沃斯低通滤波器有以下特点 :
具有更陡峭的截止特性,可以更好地去除高频噪声 可以通过调整阶数和截止频率来灵活地控制滤波器的性能 在频域中的实现相对简单,通常使用二阶滤波器级联实现
如下图所示,随着阶数
n
n
n 的增加,图像振铃效应越来越明显
(2)程序
实现如下效果:阶数不同的巴特沃斯低通滤波器
matlab实现 :
Image= imread ( 'lena.bmp' ) ;
Image= imnoise ( Image, 'gaussian' ) ;
imshow ( Image) ;
FImage= fftshift ( fft2 ( double ( Image) ) ) ;
[ N M] = size ( FImage) ;
g= zeros ( N, M) ;
r1= floor ( M/ 2 ) ; r2= floor ( N/ 2 ) ;
figure;
imshow ( log ( abs ( FImage) + 1 ) , [ ] ) , title ( '傅里叶频谱' ) ;
hold on
circle ( r1, r2, 30 )
d0= 30 ;
n= [ 1 2 3 4 ] ;
for i = 1 : 4
for x= 1 : M
for y= 1 : N
d= sqrt ( ( x- r1) ^ 2 + ( y- r2) ^ 2 ) ;
h= 1 / ( 1 + ( d/ d0) ^ ( 2 * n ( i ) ) ) ;
g ( y, x) = h* FImage ( y, x) ;
end
end
g= ifftshift ( g) ;
g= real ( ifft2 ( g) ) ;
figure, imshow ( uint8 ( g) ) , title ( [ 'Butterworth低通滤波n=' , num2str ( n ( i ) ) ] ) ;
end
Python实现 :
import cv2
import numpy as np
import matplotlib. pyplot as plt
Image = cv2. imread( 'lena.bmp' , 0 )
Image = cv2. GaussianBlur( Image, ( 5 , 5 ) , 0 )
Image = Image. astype( np. float32)
Image += np. random. normal( 0 , 20 , Image. shape)
Image = np. uint8( np. clip( Image, 0 , 255 ) )
plt. imshow( Image, cmap= 'gray' )
plt. title( '加噪声的图像' )
plt. show( )
FImage = np. fft. fftshift( np. fft. fft2( Image) )
N, M = FImage. shape
g = np. zeros( ( N, M) )
r1 = M // 2
r2 = N // 2
plt. imshow( np. log( np. abs ( FImage) + 1 ) , cmap= 'gray' )
plt. title( '傅里叶频谱' )
plt. plot( r1, r2, 'wo' , markerfacecolor= 'none' , markersize= 60 )
plt. show( )
d0 = 30
n = [ 1 , 2 , 3 , 4 ]
for i in range ( 4 ) :
for x in range ( M) :
for y in range ( N) :
d = np. sqrt( ( x - r1) ** 2 + ( y - r2) ** 2 )
h = 1 / ( 1 + ( d / d0) ** ( 2 * n[ i] ) )
g[ y, x] = h * FImage[ y, x]
g = np. real( np. fft. ifft2( np. fft. ifftshift( g) ) )
plt. imshow( np. uint8( g) , cmap= 'gray' )
plt. title( 'Butterworth低通滤波 n=' + str ( n[ i] ) )
plt. show( )
三:指数低通滤波
(1)概述
指数低通滤波 :是一种在频域中对图像进行滤波的方法,主要用于去除高频噪声。该滤波器的核心思想是将频域中高频分量的值进行衰减,从而达到降低图像的高频部分,保留图像的低频部分的效果
H
(
u
,
v
)
=
e
−
D
2
(
u
,
v
)
2
D
0
2
H(u, v)=e^{-\frac{D^{2}(u, v)}{2 D_{0}^{2}}}
H ( u , v ) = e − 2 D 0 2 D 2 ( u , v )
其中,
D
(
u
,
v
)
D(u,v)
D ( u , v ) 是频域中像素点
(
u
,
v
)
(u,v)
( u , v ) 到中心点的距离,
D
0
D_0
D 0 是滤波器的截止频率,也就是滤波器开始起作用的频率。
H
(
u
,
v
)
H(u,v)
H ( u , v ) 是滤波器在频域的值,它与原始图像在频域中的傅里叶变换进行卷积,即可得到滤波后的图像。当
D
(
u
,
v
)
=
D
0
D(u,v)=D_{0}
D ( u , v ) = D 0 时,
H
(
u
,
v
)
H(u,v)
H ( u , v ) 降为最大值的0.607处
如下图所示,随着截止频率
D
0
D_{0}
D 0 的增加,图像振铃效应越来越不明显
(2)程序
实现如下效果:截止频率不同的指数低通滤波器
matlab实现 :
Image= imread ( 'lena.bmp' ) ;
Image= imnoise ( Image, 'gaussian' ) ;
imshow ( Image) ;
FImage= fftshift ( fft2 ( double ( Image) ) ) ;
[ N M] = size ( FImage) ;
g= zeros ( N, M) ;
r1= floor ( M/ 2 ) ; r2= floor ( N/ 2 ) ;
figure;
imshow ( log ( abs ( FImage) + 1 ) , [ ] ) , title ( '傅里叶频谱' ) ;
d0= [ 20 40 ] ;
n= 2 ;
for i = 1 : 2
for x= 1 : M
for y= 1 : N
d= sqrt ( ( x- r1) ^ 2 + ( y- r2) ^ 2 ) ;
h= exp ( - 0.5 * ( d/ d0 ( i ) ) ^ n) ;
g ( y, x) = h* FImage ( y, x) ;
end
end
g= ifftshift ( g) ;
g= real ( ifft2 ( g) ) ;
figure, imshow ( uint8 ( g) ) , title ( [ '指数低通滤波D0=' , num2str ( d0 ( i ) ) ] ) ;
end
Python实现 :
import cv2
import numpy as np
import matplotlib. pyplot as plt
Image = cv2. imread( 'lena.bmp' , cv2. IMREAD_GRAYSCALE)
Image = cv2. GaussianBlur( Image, ( 3 , 3 ) , 0 )
Image = Image + np. uint8( np. random. normal( 0 , 20 , size= Image. shape) )
plt. imshow( Image, cmap= 'gray' )
plt. show( )
FImage = np. fft. fftshift( np. fft. fft2( np. double( Image) ) )
N, M = FImage. shape
g = np. zeros( ( N, M) )
r1, r2 = M // 2 , N // 2
plt. imshow( np. log( np. abs ( FImage) + 1 ) , cmap= 'gray' )
plt. title( '傅里叶频谱' )
plt. show( )
d0 = [ 20 , 40 ]
n = 2
for i in range ( 2 ) :
for x in range ( M) :
for y in range ( N) :
d = np. sqrt( ( x - r1) ** 2 + ( y - r2) ** 2 )
h = np. exp( - 0.5 * ( d / d0[ i] ) ** n)
g[ y, x] = h * FImage[ y, x]
g = np. fft. ifftshift( g)
g = np. real( np. fft. ifft2( g) )
plt. imshow( np. uint8( g) , cmap= 'gray' )
plt. title( '指数低通滤波D0=' + str ( d0[ i] ) )
plt. show( )
四:梯形低通滤波
(1)概述
梯形低通滤波 :是一种可以在一定程度上同时平衡频率响应的振铃和带宽 的低通滤波器。它的频率响应类似于一个梯形,因此得名。梯形低通滤波器可以用于图像处理中的频域滤波,通过控制梯形上下两条边界的斜率和距离,可以调整其截止频率和带宽。梯形低通滤波器相比于其他低通滤波器,可以提供更平滑的过渡区域和更宽的过渡带宽,从而减少了图像的失真和信息的丢失
H
(
u
,
v
)
=
{
1
,
D
(
u
,
v
)
≤
D
0
D
(
u
,
v
)
−
D
1
D
0
−
D
1
,
D
0
<
D
(
u
,
v
)
≤
D
1
0
D
(
u
,
v
)
>
D
1
H(u, v)=\left\{\begin{array}{cc}1, & D(u, v) \leq D_{0} \\\frac{D(u, v)-D_{1}}{D_{0}-D_{1}}, & D_{0}<D(u, v) \leq D_{1} \\0 & D(u, v)>D_{1}\end{array}\right.
H ( u , v ) = ⎩
⎨
⎧ 1 , D 0 − D 1 D ( u , v ) − D 1 , 0 D ( u , v ) ≤ D 0 D 0 < D ( u , v ) ≤ D 1 D ( u , v ) > D 1
其中
D
0
D_{0}
D 0 为截止频率,
D
0
、
D
1
D_{0}、D_{1}
D 0 、 D 1 需要满足:
D
0
<
D
1
D_{0}<D_{1}
D 0 < D 1
如下图所示
(2)程序
实现如下效果截止频率不同的梯度低通滤波器
matlab实现 :
Image= imread ( 'lena.bmp' ) ;
Image= imnoise ( Image, 'gaussian' ) ;
imshow ( Image) ;
FImage= fftshift ( fft2 ( double ( Image) ) ) ;
[ N M] = size ( FImage) ;
g= zeros ( N, M) ;
r1= floor ( M/ 2 ) ; r2= floor ( N/ 2 ) ;
d0= [ 5 30 ] ;
d1= [ 45 70 ] ;
for i = 1 : 2
for x= 1 : M
for y= 1 : N
d= sqrt ( ( x- r1) ^ 2 + ( y- r2) ^ 2 ) ;
if d> d1
h= 0 ;
else
if d> d0
h= ( d- d1) / ( d0- d1) ;
else
h= 1 ;
end
end
g ( y, x) = h* FImage ( y, x) ;
end
end
g= ifftshift ( g) ;
g= real ( ifft2 ( g) ) ;
figure, imshow ( uint8 ( g) ) , title ( [ '梯度低通滤波D0=' , num2str ( d0 ( i ) ) , ',D1=' , num2str ( d1 ( i ) ) ] ) ;
end
Python实现 :
import cv2
import numpy as np
import matplotlib. pyplot as plt
Image = cv2. imread( 'lena.bmp' , cv2. IMREAD_GRAYSCALE)
Image = cv2. GaussianBlur( Image, ( 5 , 5 ) , 0 )
Image = cv2. addWeighted( Image, 1.5 , np. zeros( Image. shape, Image. dtype) , 0 , - 0.5 )
plt. imshow( Image, cmap= 'gray' )
plt. title( 'Original Image' )
plt. show( )
FImage = np. fft. fftshift( np. fft. fft2( Image. astype( np. float64) ) )
N, M = FImage. shape
g = np. zeros( ( N, M) , dtype= np. complex64)
r1 = int ( M / 2 )
r2 = int ( N / 2 )
d0 = [ 5 , 30 ]
d1 = [ 45 , 70 ]
for i in range ( 2 ) :
for x in range ( M) :
for y in range ( N) :
d = np. sqrt( ( x - r1) ** 2 + ( y - r2) ** 2 )
if d > d1[ i] :
h = 0
else :
if d > d0[ i] :
h = ( d - d1[ i] ) / ( d0[ i] - d1[ i] )
else :
h = 1
g[ y, x] = h * FImage[ y, x]
g = np. fft. ifftshift( g)
g = np. real( np. fft. ifft2( g) )
plt. imshow( g, cmap= 'gray' )
plt. title( f'梯度低通滤波D0= { d0[ i] } ,D1= { d1[ i] } ' )
plt. show( )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)