前言
一、同态滤波原理
1.处理原理
(1)认为图像f(x,y)由两部分组成:照射分量i(x,y),反射分量r(x,y):
f
(
x
,
y
)
=
i
(
x
,
y
)
∗
r
(
x
,
y
)
f(x,y)=i(x,y)*r(x,y)
f(x,y)=i(x,y)∗r(x,y)
(2)但上式不能直接用于对两个分量在频率域进行处理,因为乘积的傅里叶变换不等于变换的乘积,因此,定义:
z
(
x
,
y
)
=
l
n
f
(
x
,
y
)
=
l
n
i
(
x
,
y
)
+
l
n
r
(
x
,
y
)
z(x,y)=lnf(x,y)=lni(x,y)+lnr(x,y)
z(x,y)=lnf(x,y)=lni(x,y)+lnr(x,y)
(3)经过上面变换后可以进行傅里叶变换,有:
Z
(
u
,
v
)
=
F
i
(
u
,
v
)
+
F
r
(
u
,
v
)
Z(u,v)=F_i(u,v)+F_r(u,v)
Z(u,v)=Fi(u,v)+Fr(u,v)
(4)然后可以设置一个滤波器H(u,v),对Z(u,v)进行滤波:
S
(
u
,
v
)
=
H
(
u
,
v
)
∗
Z
(
u
,
v
)
=
H
(
u
,
v
)
∗
F
i
(
u
,
v
)
+
H
(
u
,
v
)
∗
F
r
(
u
,
v
)
S(u,v)=H(u,v)*Z(u,v)=H(u,v)*F_i(u,v)+H(u,v)*F_r(u,v)
S(u,v)=H(u,v)∗Z(u,v)=H(u,v)∗Fi(u,v)+H(u,v)∗Fr(u,v)
(5)对S(u,v)使用傅里叶逆变换得到s(x,y),则滤波后的图像g(x,y):
g
(
x
,
y
)
=
e
s
(
x
,
y
)
g(x,y)=e^{s(x,y)}
g(x,y)=es(x,y)
在图像中,认为低频成分与照射分量相相联系,高频成分与反射分量相联系。同态滤波就是设置一个滤波器H(x,y),使用不同的可控方法来影响低频分量和高频分量对图像的影响。
二、同态滤波器模板及MATLAB代码
1.同态滤波器
(1)高斯高通滤波的函数如下:
H
(
u
,
v
)
=
1
−
e
−
D
2
(
u
,
v
)
/
2
D
0
2
H(u,v)=1-e^{-D^2(u,v)/2D_0^2}
H(u,v)=1−e−D2(u,v)/2D02
高斯高通滤波器剖面图如上,使低频分量处为0,高频分量处保持不变
(2)以高斯高通滤波器为模板改造的同态滤波器
H ( u , v ) = ( γ H − γ L ) [ 1 − e − C [ D 2 ( u , v ) / 2 D 0 2 ] ] + γ L H(u,v)=(γ_H-γ_L)[1-e^{-C[D^2(u,v)/2D_0^2]}]+γ_L H(u,v)=(γH−γL)[1−e−C[D2(u,v)/2D02]]+γL
当 γ H > 1 γ_H>1 γH>1, γ L < 1 γ_L<1 γL<1时,对应剖面图为:
可以看出这个滤波器减少了低频分量的影响,增加了高频分量的影响。
2.MATLAB代码
代码如下:
im1 = imread("D:\work\c++\Imageprocessing1\\1043.jpg");
im1=rgb2gray(im1);
figure,imshow(im1)
I=double(im1);
[M,N]=size(I);
rL=0.25; rH=2; %参数可调
c=2; d0=10;
I=log(I+1);%取对数
FI=fft2(I);%傅里叶变换
n1=floor(M/2);
n2=floor(N/2);
for i=1:M
for j=1:N
D(i,j)=((i-n1).^2+(j-n2).^2);
H(i,j)=(rH-rL).*(exp(c*(-D(i,j)./(d0^2))))+rL;%高斯同态滤波
end
end
I2=ifft2(H.*FI);%傅里叶逆变换
I2=real(exp(I2));
figure,imshow(I2,[]);title('同态滤波增强后');
结果(
γ
H
=
2
γ_H=2
γH=2,
γ
L
=
0.25
γ_L=0.25
γL=0.25):
三、改变参数
上面的同态滤波用于增强图像,若当 γ H < 1 γ_H<1 γH<1, γ L > 1 γ_L>1 γL>1时,结果如何呢:
设置 γ H = 0.5 γ_H=0.5 γH=0.5, γ L = 1.5 γ_L=1.5 γL=1.5,c=1
结果: