说明:同态滤波是频域滤波的一种,但是相比之下同态滤波有自己的优势,
频域滤波可以灵活地解决加性噪声问题,但无法消减乘性或卷积性噪声。
同态滤波是一种在频域中同时将图像亮度范围进行压缩和将图像对比度进行增强的方法,是基于图像成像模型进行的。
一幅图f(x,y)可以表示成照度分量i(x,y)与反射分量r(x,y)的乘积,同态滤波基本思想:
为了分离加性组合的信号,常采用线性滤波的方法,而非加性信号组合常用同态滤波的技术将非线性问题转化成线性问题处理,即先对非线性(乘性或者卷积性)混杂信号作某种数学运算,变换成加性的。然后用线性滤波方法处理,最后作反变换运算,恢复处理后图像。
同态滤波流程图
(1)两边取对数
(2)两边取付氏变换
(3)用一频域函数 H(u, v)处理F(u, v),H(u,v)是同态滤波函数
(4)反变换到空域
(5)两边取指数
可见,增强后的图像是由分别对应照度分量与反射分量的两部分叠加而成。因为一般照度分量是在空间缓慢变化的,而反射分量在不同物体的交界处是急剧变化的。所以,图像对数傅里叶变换中的低频部分主要对应照度分量,而高频部分主要对应反射分量。
我们可以设计1个对傅里叶变换的高频分量和低频分量影响不同的滤波函数H(u,v)。
图 同态滤波器的剖面图
如果选取 HL<1, HH>1,滤波器函数将减弱低频部分,扩大高频部分,最后的结果将同时压缩了图像的动态范围,又增加了图像各部分之间的对比度。
特点:能消除乘性噪声,能同时压缩图像的整体动态范围,并增加图像中相邻区域间的对比度。
注意到,同态滤波器的函数图象跟高通巴特沃斯或者高通高斯滤波器很像,所以为了实现同态滤波器,实际上只需要对上述滤波器稍加改动即可以用高通滤波器的转移函数来逼近同态滤波函数,设高通滤波器的转移函数为Hhigh(u,v),同态滤波函数用Hhomo(u,v)表示
,则由Hhigh(u,v)到Hhomo(u,v)的映射为:
Hhomo(u,v)=(HH-HL)*Hhigh(u,v)+HL
下面张贴一段用MATLAB实现同态滤波的代码:
clear;
close all;
[name,path] = uigetfile(‘lena.bmp‘);
file = strcat(path,name);
[X,map]=imread(file);
X=double(X);
I=rgb2hsv(X);
H=I(:,:,1);
S=I(:,:,2);
V=I(:,:,3);
%if size(X,3)==3
% X= rgb2gray(X);
%end
% 装载图片
% 显示这个图片
figure,imshow(‘lena.bmp‘);
title(‘原始图像‘);
% 构造一个高斯滤波器
f_high = 1.0;
f_low = 0.8;
% 得到一个高斯低通滤波器
gauss_low_filter = fspecial(‘gaussian‘, [7 7], 1.414);
matsize = size(gauss_low_filter);
% 由于同态滤波是要滤出高频部分,
% 所以得把这个低通滤波器转换成一个高通滤波器.
% f_high 和 f_low 是控制这个高通滤波器形态的参数.
gauss_high_filter = zeros(matsize);
gauss_high_filter(ceil(matsize(1,1)/2) , ceil(matsize(1,2)/2)) = 1.0;
gauss_high_filter = f_high*gauss_high_filter - (f_high-f_low)*gauss_low_filter;
% 利用对数变换将入射光和反射光部分分开
log_img = log(double(V)+eps);
% 将高斯高通滤波器与对数转换后的图象卷积
high_log_part = imfilter(log_img, gauss_high_filter, ‘symmetric‘, ‘conv‘);
% 由于被处理的图象是经过对数变换的,再用幂变换将图象恢复过来
high_part = exp(high_log_part);
minv = min(min(high_part));
maxv = max(max(high_part));
% 得到的结果图象
temp=(high_part-minv)/(maxv-minv);
S=adapthisteq(S)*2.1;
HSV3(:,:,1)=H; %保留H不变,开始合成
HSV3(:,:,2)=S;
HSV3(:,:,3)=temp;
rgb2=hsv2rgb(HSV3); %转换回RGB空间
figure;
imshow(rgb2);
title(‘同态滤波图像‘);