冈萨雷斯-笔记(三)-同态滤波器

原创文章,转载请留言,注明出处

照射-反射模型

我们用二维函数f(x,y)表示一张图像,当一幅图像从物理过程产生时,它的值正比于物理源的辐射能量,f(x,y)可由两个分量来表征:1. 入射到观察场景的光源总量 2. 场景中物体反射光的总量。分别称之为入射分量和反射分量,表示为i(x,y)和r(x,y).两个函数合并形成f(x,y)

f(x,y) = i(x,y)r(x,y)

其中:

0 < i(x,y) < ∞
0 < r(x,y) <1        %反射分量限制在0(全吸收)和1(全反射)之间

i(x,y)的性质取决于照射源,而r(x,y)取决于成像物体的特性。下面给出r(x,y)的某些典型值:

  • 黑天鹅绒:0.01
  • 不锈钢:0.65
  • 白色墙:0.80
  • 镀银金属:0.90
  • 雪:0.93

同态滤波器

图像照射分量通常以空间慢变化为特征,而反射分量往往引起突变,特别是在不同物体的连接部分,利用照射-反射模型这一特点,可以对图像的这两部分分量做不同的处理,通过频域特性将照射分量和反射分量加以区分并作不同滤波操作,再进行傅里叶反变换得到空间域的经过增强的图像,这种在频域中将二者分别处理的函数叫做同态滤波函数。

下面给出得到同态滤波器的数学推导:

令 z(x,y) = lnf(x,y)
          = lni(x,y) + lnr(x,y)

用F{}表示傅里叶变换,F[]表示傅里叶反变换
F{z(x,y)} = F{lni(x,y) + lnr(x,y)}
          = F{lni(x,y)} + F{lnr(x,y)}
令Fi(u,v) = F{lni(x,y)    Fr(u,v) = F{lnr(x,y)}    Z(u,v) = F{z(x,y)}
Z(u,v) = Fi(u,v) + Fr(u,v)
接着使用滤波函数H(u,v)处理Z(u,v),用S(u,v)表示处理后的频域表达式
S(u,v) = H(u,v)Z(u,v)
       = H(u,v)Fi(u,v) + H(u,v)Fr(u,v)
对S(u,v)进行反变换得到s(x,y)
s(x,y) = F[H(u,v)Fi(u,v)] + F[H(u,v)Fr(u,v)]
令i1(x,y) = F[H(u,v)Fi(u,v)] r1(x,y) = F[H(u,v)Fr(u,v)]
则    s(x,y) = i1(x,y) + r1(x,y)
因为z(x,y)是原始图像f(x,y)取对数得到的,所以要对结果进行取指数操作,结果用g(x,y)表示
g(x,y) = e^s(x,y) = e^i1(x,y)*e^r1(x,y)
       = i0(x,y)*r0(x,y)        其中    i0(x,y)=e^i1(x,y)    r0(x,y)=e^r1(x,y)

以上的推导过程只是一个理论上的方法,在实际的图像处理中,很难真正把图像的函数分解成两个分量的乘积(当然,如果非要做的话也可以把图片中所有物体的反射分量查阅出,或者计算出每个部分的光照),但是通过照射和反射的性质可以知道,照射分量在频域中的体现是低频部分,而反射分量往往在高频部分,虽然这种联系是大体上的近似,但在应用中确实可以起到一定的效果。这样能够在实现灰度范围的压缩的同时,增强对比度,从而改进一幅图像的外观。

因此,我们需要构造一个可以有区分度地处理低频和高频部分的 H(u,v)

其中 D(u,v)=sqrt[(u-M/2)^2+(v-N/2)^2], c用于控制滤波器函数上升的速度,yH>1 yL<1 。下面给出同态滤波的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function [ output ] = fft_img( input, yH, yL, c)
%同态滤波器对图像处理,yH为大于1的实数,yL为小于1的实数,c为正数
%yL取值在0.5左右,yH取值在1.5-2.0左右,c取值在2000以上效果较好,参数选取因图像而异
[x,y] = size(input);
if int32(x)/2*2 ~= x
x = x-1;
end
if int32(y)/2*2 ~= y
y = y-1;
end
input = double(input);
input = input+1;
for i=1:x
for j=1:y
input(i,j) = log(input(i,j));
end
end
f_img = fft2(input);
f_img = fftshift(f_img);
e = exp(1);
D = (x^2 + y^2)/4;
for i=1:x
for j=1:y
temp = (i - x/2)^2 + (j - y/2)^2;
f_img(i,j) = f_img(i,j)*((yH - yL)*(1 - e^(-c*temp/D))) + yL;
end
end
f_img = fftshift(f_img);
output = ifft2(f_img);
for i=1:x
for j=1:y
output(i,j) = abs(exp(output(i,j)));
end
end
end

对函数进行测试,按照原图,处理后图像的顺序展示,参数选择为yH=1.5 yL=0.5 c=50000:

原图像

同态滤波处理后的图片

可以明显的观察到整个图像中的亮度的动态范围变小了,同时对比度得到了增强,图像边界更加清晰,零件的细节分辨地更加清楚。

Thank you for every coin~