在4.0.1节中,我们已经介绍了一个简单的图像形成模型,即照射-反射模型。这个模型可以开发一种频率处理程序,该程序可以同时压缩灰度范围和增强对比度来改善一幅图像的表现。图像形成的照射-反射模型的表达式如下:

f(x,y)=i(x,y)r(x,y)                                         6.4- 16

上式不能直接用于对照射和反射的频率分量进行操作,因为两个分量的傅里叶变换之积,不等于原图像的傅里叶变换:

6.4- 17

但是,我们可以定义如下变换关系:

                    6.4- 18

然后再对上式两边做傅里叶变换:

       6.4- 19

得到下面的傅里叶变换域的等式:

6.4- 20

其中, 分别是 的傅里叶变换。

我们可以用一个滤波器 对 滤波,故有:

         6.4- 21

在空间域中,滤波后的图像为:

    6.4- 22

我们可以将上式改写成简略形式:

                                    6.4- 23

其中,

                           6.4- 24

                                 6.4- 25

最后,因为 是通过取输入图像的自然对数形成的,我们可通过取滤波后的结果的指数这一反处理来形成输出图像:

                6.4- 26

                        6.4- 27

                                            6.4- 28

经滤波处理后的照射和反射分量。

以上推到的滤波方法流程图,如图6. 26所示。该滤波方法是针对特定成像系统,在此称为同态系统。在这种特殊应用中,方法的关键在于照射分量和反射分量的分离,其实现形式(6.4-20)所示。然后,如式(6.4-21)那样,用同态滤波器 对这些分量进行滤波操作。

图像的照射分量通常由慢的空间变化来表征,而反射分量往往引起突变,特别是在不同物体的连接部分。这些特性导致图像取对数后的傅里叶变换的低频成分与照射分量相联系,而高频成分与反射分量相联系。虽然这些联系只是粗略的近似,但它们用在图像滤波中是有益的。

图6. 27所示的函数形状可用高通滤波器的基本形式来近似。例如,采用形式稍微变化一下的高斯高通滤波器可得到函数:使用同态滤波器可更好地控制照射分量和反射分量。这种控制需要指定一个滤波器函数 ,它可用不同的可控方法影响傅里叶变换的低频和高频分量。图6. 27显示了这种滤波器的剖面图。如果 和 选定, 且 ,那么图6. 27所示滤波器函数趋向于衰减低频(照射)的贡献。

                                                                        6.4- 29

其中 由式(6.3-2)定义,常数c控制函数坡度的锐利度,它在 和 之间过渡。这个滤波器类似于前面6.4.3节讨论的高频强调滤波器。

例6. 10 使用同态滤波增强图像

图6. 28(a)显示了一幅大小为1162×746像素的全身PET扫描图像。图像稍微有些模糊,并且由于主导显示动态范围的高灰度“热点”使得其许多低灰度特征很朦胧(这些“热点”是由脑部的肿瘤和肺部的肿瘤导致的)。

图6. 28(b)是图6. 28(a)经同态滤波湖得到的结果,使用式(6.4-8)中的滤波器, 。改滤波器的剖面看上去正好像图6. 27,只是坡度有点陡峭。

 SHAPE  \* MERGEFORMAT

下面是主程序:Mat homoMorphicFilter(const Mat& src,double D0,
double gammaH,double gammaL,double c)
{
int rows=src.rows,cols=src.cols,channels=src.channels();
Mat srcLog,src64d;
src.convertTo(src64d,CV_64FC1);
cv::log(src64d+,srcLog);
Mat srcLogFft=fft(srcLog);
dftshift(srcLogFft); //创建同态滤波器
Mat Huv(rows,cols,CV_64FC2,Scalar::all());//频域滤波器
int cx=cols/,cy=rows/;
double D2=D0*D0;
for(int i=;i<rows;i++)
{
Vec2d* p=Huv.ptr<Vec2d>(i);
for(int j=;j<cols;j++)
{
double x=j-cx,y=i-cy;
p[j][]=(gammaH-gammaL)*(-c*exp(-(x*x+y*y)/D2))+gammaL;
p[j][]=p[j][];
}
}
Huv /=(rows*cols); //频域滤波,在频域与Huv逐点相乘
Mat ftProduct=srcLogFft.mul(Huv);
//逆傅里叶变换
Mat ftInv=fft(ftProduct,DFT_INVERSE);
//计算逆傅里叶变换的幅值
Mat mag= myMagnitude(ftInv);
Mat edst;
cv::exp(mag,edst);
normalize(edst,edst,,,NORM_MINMAX);
edst.convertTo(edst,CV_8UC1);
return edst;
}
int main()
{
Mat img=imread("D:/CodeWork/MyImage/Fig0462a.tif",);
imshow("rogin img",img);
Mat imgHomo=homoMorphicFilter(img,,,0.25,.);
imshow("homoMorphic filter",(imgHomo+img)/);
waitKey();
return ;
}

下面左图是经过同态滤波后的结果,右图是原图像:

   

例6.9中的胸部透视图像的同态滤波:

int main()
{
Mat img=imread("D:/CodeWork/MyImage/Fig0459a.tif",);
imshow("rogin img",img);
Mat imgHomo=homoMorphicFilter(img,,,0.25,.);
imgHomo =imgHomo*0.5+img*0.5;
equalizeHist(imgHomo,imgHomo);
imshow("homoMorphic filter",imgHomo);
waitKey();
return ;
}

下面是胸部透视图像,左边是原图,右边是同态滤波的结果:

基于OpenCV的同态滤波的更多相关文章

  1. [转载]卡尔曼滤波器及其基于opencv的实现

    卡尔曼滤波器及其基于opencv的实现 源地址:http://hi.baidu.com/superkiki1989/item/029f65013a128cd91ff0461b 这个是维基百科中的链接, ...

  2. 基于Opencv和Mfc的图像处理增强库GOCVHelper(索引)

    GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的 ...

  3. 基于OpenCv的人脸检测、识别系统学习制作笔记之一

    基于OpenCv从视频文件到摄像头的人脸检测 在OpenCv中读取视频文件和读取摄像头的的视频流然后在放在一个窗口中显示结果其实是类似的一个实现过程. 先创建一个指向CvCapture结构的指针 Cv ...

  4. 基于opencv网络摄像头在ubuntu下的视频获取

     基于opencv网络摄像头在ubuntu下的视频获取 1  工具 原料 平台 :UBUNTU12.04 安装库  Opencv-2.3 2  安装编译运行步骤 安装编译opencv-2.3  参 ...

  5. 基于opencv的小波变换

    基于opencv的小波变换 提供函数DWT()和IDWT(),前者完成任意层次的小波变换,后者完成任意层次的小波逆变换.输入图像要求必须是单通道浮点图像,对图像大小也有要求(1层变换:w,h必须是2的 ...

  6. 基于opencv在摄像头ubuntu根据视频获取

     基于opencv在摄像头ubuntu根据视频获取 1  工具 原料 平台 :UBUNTU12.04 安装库  Opencv-2.3 2  安装编译执行步骤 安装编译opencv-2.3  參考h ...

  7. OpenCV2学习笔记(十四):基于OpenCV卡通图片处理

    得知OpenCV有一段时间.除了研究的各种算法的内容.除了从备用,据导游书籍和资料,尝试结合链接的图像处理算法和日常生活,第一桌面上(随着摄像头)完成了一系列的视频流处理功能.开发平台Qt5.3.2+ ...

  8. Android上掌纹识别第一步:基于OpenCV的6种肤色分割 源码和效果图

    Android上掌纹识别第一步:基于OpenCV的6种肤色分割 源码和效果图 分类: OpenCV图像处理2013-02-21 21:35 6459人阅读 评论(8) 收藏 举报   原文链接  ht ...

  9. 每日一练之自适应中值滤波器(基于OpenCV实现)

    本文主要介绍了自适应的中值滤波器,并基于OpenCV实现了该滤波器,并且将自适应的中值滤波器和常规的中值滤波器对不同概率的椒盐噪声的过滤效果进行了对比.最后,对中值滤波器的优缺点了进行了总结. 空间滤 ...

随机推荐

  1. CF277B Set of Points——构造题

    题意 构造 $n$ 个点使其凸度(顶点数最多的凸多边形的顶点数)恰好为 $m$,且任意三点不能共线. (题意有点绕,建议看英文原文 分析 首先,题目并不是求凸包上的顶点数,而是求能形成的凸多边形的最大 ...

  2. springboot整合springsecurity遇到的问题

    在整合springsecurity时遇到好几个问题,自动配置登录,下线,注销用户的操作,数据基于mybatis,模版引擎用的thymeleaf+bootstrap. 一.认证时密码的加密(passwo ...

  3. Linux 理解 %iowait (%wio)

    理解 %iowait (%wio) 2016/02/25 %iowait 是 “sar -u” 等工具检查CPU使用率时显示的一个指标,在Linux上显示为 %iowait,在有的Unix版本上显示为 ...

  4. vue 组件的通信方式(完整版)

    几种通信方式无外乎以下几种: Prop(常用) $emit (组件封装用的较多) .sync语法糖 (较少) $attrs & $listeners (组件封装用的较多) provide &a ...

  5. 51nod 1434

    首先可以得出一个性质:LCM(1,2,3,4,...,N-1,N) 中质因子k的出现的次数为t,则有k^t<=n 根据这个性质我们先筛出素数,然后枚举每个质数,求出对应的k和t,然后找出倍数j( ...

  6. P2401 不等数列

    题目描述 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”.问在所有排列中,有多少个排列恰好有k个“<”.答案对2015取模. 注:1~n的排列指的是1 ...

  7. AWS API Gateway Swagger定义

    导出Swagger接口定义文件 在AWS API Gateway界面上,可以导出swagger接口定义文件. 而后利用Node js swagger-ui 依赖,生成swagger接口地址 Cloud ...

  8. CSPS2019谢幕记

    留坑待填. 开始填坑. Day -1 最后一场模拟题.T1花2h切掉,T2啥都不会,T3看出部分解法然后写了暴搜,教练没放子任务,得了45,然后就$rk3$了. 晚上疯狂写板子,1.5h写了8份板子. ...

  9. [Android] i2c-toos 在 Android 上使用

    CPU:RK3399 系统:Android 7.1 i2c-tools 是一款免费开源的工具,可以检测 i2c 总线上的设备,可以读写寄存器等等 可以从下面路径下载需要的版本: https://www ...

  10. Python 自学笔记(八)

    import math def A(a,b): print("第一个参数的值为"+str(a)) print("第一个参数的值为"+str(b)) a = 1 ...