在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. python - django (母版与组件)

    # 把多个页面通用的部分提取出来 放在一个母版中 # 其它的页面只需要继承 母版就可以 # 使用步骤:( 继承的语句要放在第一行 ) """ 1. 把公用的 HTML 部 ...

  2. linux系统常用软件

    输入法---搜狗输入法 音乐播放器---网易云音乐 邮箱---

  3. [Angular] Lazy Load CSS at runtime with the Angular CLI

    Ever had the need for multiple "app themes", or even to completely dynamically load CSS ba ...

  4. How To Install Docker On Ubuntu 18.04

    Docker is an increasingly popular software package that creates a container for application developm ...

  5. 洛谷 P1309 瑞士轮 题解

    每日一题 day4 打卡 Analysis 暴力+快排(其实是归并排序) 一开始天真的以为sort能过,结果光荣TLE,由于每次只更改相邻的元素,于是善于处理随机数的快排就会浪费很多时间.于是就想到归 ...

  6. react页面跳转 window.location.href和window.open的几种用法和区别

    https://www.cnblogs.com/Qian123/p/5345298.html

  7. 系列属性(offset、scroll、client)

    一.offset系列属性 <div id="dv"></div> <!-- 已在style标签里设置div宽高各100px --> <sc ...

  8. unity Assetboundle 工具

    Unity Asset Bundle Browser tool https://github.com/Unity-Technologies/AssetBundles-Browser assetboun ...

  9. C++11多线程std::thread创建方式

    //#include <cstdlib> //#include <cstdio> //#include <cstring> #include <string& ...

  10. 为什么会选择redis数据库?

    因为redis支持主从同步,而且数据都是缓存在内存中,所以基于redis的分布式爬虫,对请求和数据的高频读取效率非常高