图像的同态滤波原理及实现

图像的同态滤波原理及实现

同态滤波(Homomorphic filter)是信号与图像处理中的一种常用技术,它采用了一种线性滤波在不同域中的非线性映射。这一技术是上世纪60年代由麻省理工学院(MIT)的Thomas Stockham,Alan V. Oppenheim和 Ronald W. Schafer 等几位学者提出。

如果您对原理部分不感兴趣,可直接跳至双虚线以下的关键代码实现部分。

首先,介绍两个概念。

同态系统:是将非线性问题,转化为线性问题处理。即对非线性(乘性)混杂信号,通过某种数学运算(如对数变换),变成加性模型,而后采用线性滤波方法进行处理。

同态滤波:是把频率滤波和空域灰度变换结合起来的一种图像处理方法,它根据图像的照度/反射率模型作为频域处理的基础,利用压缩亮度范围和增强对比度来改善图像的质量。

下面介绍关于同态滤波的基本原理。

一幅图像可看成由两部分组成,即


其中,fi代表随空间位置不同的光强(Illumination)分量,其特点是缓慢变化,集中在图像的低频部分。fr代表景物反射到人眼的反射(Reflectance)分量。其特点包含了景物各种信息,高频成分丰富。

同态滤波过程,分为以下5个基本步骤:

① 原图做对数变换,得到如下两个加性分量,即


② 对数图像做傅里叶变换,得到其对应的频域表示为:


③ 设计一个频域滤波器H(u,v),进行对数图像的频域滤波。

④ 傅里叶反变换,返回空域对数图像。

⑤ 取指数,得空域滤波结果。

综上,同态滤波的基本步骤如图1所示。


图1 同态滤波的基本步骤

可以看出,同态滤波的关键在于滤波器H的设计。对于一幅光照不均匀的图像,同态滤波可同时实现亮度调整和对比度提升,从而改善图像质量。为了压制低频的亮度分量,增强高频的反射分量,滤波器H应是一个高通滤波器,但又不能完全cut off 低频分量,仅作适当压制。

因此,同态滤波器一般采用如下形式,即

其中,gL< 1, gH >1,控制滤波器幅度的范围。Hhp通常为高通滤波器,如高斯(Gaussian)高通滤波器、巴特沃兹(Butterworth)高通滤波器、Laplacian滤波器等。

如果Hhp采用Gaussian高通滤波器,则有:

其中,c为一个常数,控制滤波器的形态,即从低频到高频过渡段的陡度(斜率),其值越大,斜坡带越陡峭,见图2。


图2 同态滤波器幅频曲线

================================================================================

同态滤波的原理就这么简单,不过写代码实现起来,具体问题就来了。你不妨百度一下,网上一些论坛里,贴有大量可参考的代码,让您看了像雾像雨又像云,很可能会误导你。那么,只有吃透了原理,或自己动手测试一下,方能做出正确判断。

实现对一幅输入图像同态滤波的关键(MATLAB)代码如下:

① 输入图像取对数,一般取自然对数,即

                           f = log(1+I);                          % log transformation

这里图像I做对数变换前,需要转化为double型。针对灰度范围[0~255]的图像数据,log(I+1)是为了满足真数大于0,以防计算无意义。特别提醒,如果是归一化图像数据,则建议log(I+0.01)

② 对f做FFT,此步涉及后续的频域滤波。因此,FFT前数据f一般需零填充至本身的2倍尺寸。

                           Fp = fft2(f,P,Q);                   % FFT with zeros padding

这里,P = 2M,  Q = 2N,  M, N为数据f的阵列大小。

③ 滤波器H设计,滤波器尺寸同样应为P、Q。

                          [v, u] = meshgrid(1:Q, 1:P);  % [y, x] = size(I),y为行数,x为列数。与习惯顺序[x, y]有点反,易混淆!

                          u = u - floor(P/2);                  % u方向 centralization

                          v = v - floor(Q/2);                  % v方向 centralization

                          D = u.^2 + v.^2;                      % compute the distances

                          H = 1-exp(-c*(D./D0^2));    % gaussian high-pass filter

                          H = (rH - rL)*H + rL;           % homomorphic filter

这里,D0为gaussian滤波器的截止频域。因产生的为中心化滤波器,下一步滤波f的傅里叶变换也需要中心化处理;否则,H反中心化。

④ 频域滤波。

                           H   = ifftshift(H);          % H反中心化,因Fp未中心化!

                           Gp = Fp.*H;                   % filtering in frequency domain

⑤ 傅里叶反变换,返回空域的对数图像。

                           gp  = real(ifft2(Gp));    % IFFT取实部。网上有些代码直接取abs,计算误差会引起虚部不为零。No!  

                           g    = gp(1:M,1:N);        % 截取有效数据

⑥ 取指数,得空域滤波结果。

                           g = exp(g)-1;                % 先前取对数时,为log(1+I)。 有代码先在频域做exp(Gp),再反变换。No!

⑦ 显示g时,适当做数据的映射处理,以适合人眼观察。

以下为利用以上原理和关键代码实现的两个场景下的同态滤波实验。H参数的设置为:D0=80,  rL =0.25,  rH=2.2, c=2.0。其幅频曲线如图3所示。


图3 设置参数下的同态滤波器幅频图


图4 同态滤波结果,PET扫描图(上),隧洞口场景(下)

注:以上代码实现中,未考虑边界问题。关于边界处理问题,请参考前述博文:如何保持空域与频域滤波结果的一致性(续)

读者如需完整代码,可直接联系本人。

推荐参考:

[1]https://en.wikipedia.org/wiki/Homomorphic_filtering

[2]http://blogs.mathworks.com/steve/2013/06/25/homomorphic-filtering-part-1/

[3]http://blogs.mathworks.com/steve/2013/07/10/homomorphic-filtering-part-2/

[4]http://bbs.sjtu.edu.cn/bbstcon?board=DSP&reid=1316225259


《教学后记》序列博文:

[1] 频域Laplacian图像锐化原理与实现

[2] 如何保持空域与频域滤波结果的一致性(续)

[3] 傅里叶变换的波形分辨率与频率分辨率

[4] 如何保持空域与频域滤波结果的一致性



  • 27
    点赞
  • 179
    收藏
    觉得还不错? 一键收藏
  • 36
    评论
同态滤波是一种常见的图像处理方法,它可以在保持图像边缘信息的前提下,对图像进行滤波去噪。与传统的线性滤波方法不同,同态滤波是一种非线性的滤波方法,它可以通过调整滤波器的参数来实现不同的效果。同态滤波的主要思想是通过对图像进行频域变换,将图像分解成不同的频率分量,然后对每个频率分量进行滤波处理,最后再将滤波后的频率分量合成为一张图像同态滤波可以用于去除图像中的噪声、增强图像的对比度、调整图像的亮度等。 下面我们来介绍一下如何使用Matlab实现双边滤波同态滤波。 1. 双边滤波 双边滤波是一种常见的图像去噪方法,它可以在保护图像边缘信息的同时,去除图像中的噪声。双边滤波的主要思想是通过在空间域和灰度域两个方向上进行加权平均,来消除图像中的噪声。在Matlab中,我们可以使用“bfilter2”函数来实现双边滤波。 具体实现步骤如下: (1)读入待处理的图像 I = imread('lena.jpg'); (2)对图像进行双边滤波处理 J = bfilter2(I, [3 3], 5); (3)显示滤波后的图像 imshow(J); 其中,[3 3]表示滤波器的大小,5表示滤波器的强度。 2. 同态滤波 同态滤波是一种常见的图像增强方法,它可以在保持图像边缘信息的前提下,增强图像的对比度和亮度。同态滤波的主要思想是通过对图像进行频域变换,将图像分解成低频和高频分量,然后对低频分量进行滤波处理,对高频分量进行增强处理,最后再将滤波后的低频分量和增强后的高频分量合成为一张图像。在Matlab中,我们可以使用“imadjust”函数和“homfilt2”函数来实现同态滤波。 具体实现步骤如下: (1)读入待处理的图像 I = imread('lena.jpg'); (2)对图像进行同态滤波处理 H = fspecial('gaussian', [3 3], 1); Ih = imfilter(double(I), H, 'symmetric'); J = homfilt2(Ih); (3)显示滤波后的图像 imshow(J); 其中,[3 3]表示高斯滤波器的大小,1表示高斯滤波器的标准差,symmetric表示在边缘处进行对称填充。 通过以上步骤,我们可以实现双边滤波同态滤波的功能。需要注意的是,滤波器的大小和强度可以根据实际情况进行调整,以达到最佳的滤波效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值