同态滤波是属于图像增强的一个小算法,其原理和代码实现在众多博客中均有提及,再此,只对学习中一些自认为有用的知识点进行总结。

实现和学习过程中的一些总结:

  • 同态滤波类似于灰度变换,都是对灰度级进行动态范围压缩和对比度增强来改善图像的外观。
  • 图像f(x,y)f(x,y)f(x,y)可以表示为其照射分量i(x,y)i(x,y)i(x,y)和反射分量r(x,y)r(x,y)r(x,y)的乘积,即:f(x,y)=i(x,y)r(x,y)f(x,y)=i(x,y)r(x,y)f(x,y)=i(x,y)r(x,y)
  • 照射分量对应图像中的低频部分,在光源中来说对应漫反射光,反射分量对应图像中高频部分,在光源中对于镜面反射光。
  • 在算法开始,先要对图像进行对数处理,若f(x,y)f(x,y)f(x,y)中有任何零值,则必须将图像加1,以避免In(0)In(0)In(0)的出现,然后从最终结果中减去1。

一些未出现的工具函数可以参考我之前的博客:图像基础频率域滤波


代码实现如下:

//func:      创建滤波传递函数
//size:     扩展后图像的大小
//gamma_L:  控制低频下限
//gamma_H:  控制高频上限
//c,D0:     控制滤波函数剖面的偏斜度
cv::Mat calc_Homomorphic(cv::Size size, double gamma_L, double gamma_H, double c, double D0)
{cv::Mat result(size, CV_64FC1);int cx = size.width / 2;int cy = size.height / 2;for (int i = 0; i < result.rows; ++i){double* p = result.ptr<double>(i);for (int j = 0; j < result.cols; ++j){double d_2 = std::pow(i - cy, 2) + std::pow(j - cx, 2);//同态滤波传递函数p[j] = (gamma_H - gamma_L) * (1 - std::exp(-c * d_2 / (D0 * D0))) + gamma_L;}}//创建双通道图像,便于与复数图像相乘cv::Mat planes[] = { result.clone(), result.clone() };cv::Mat Homomorphic;merge(planes, 2, Homomorphic);return Homomorphic;
}//************************main入口*************************//int main()
{std::string path = "PET_image.tif";cv::Mat src = cv::imread(path, cv::IMREAD_GRAYSCALE);if (!src.data) {std::cout << "Could not open or find the image" << std::endl;return -1;}//源图像转化为对数形式cv::Mat srclogMat;src.convertTo(srclogMat, CV_64FC1);srclogMat = srclogMat + cv::Scalar::all(1);cv::log(srclogMat, srclogMat);//扩展图像,扩展部分使用零填充cv::Mat paddedMat;int m = cv::getOptimalDFTSize(src.rows);int n = cv::getOptimalDFTSize(src.cols);//on the border add zero valuescv::copyMakeBorder(srclogMat, paddedMat, 0, m - src.rows, 0, n - src.cols, cv::BORDER_CONSTANT, cv::Scalar::all(0));cv::Mat paddedMatdouble;paddedMat.convertTo(paddedMatdouble, CV_64FC1);//使傅里叶变换中心化Dftshift(paddedMatdouble, paddedMatdouble);//创建一个复数图像F(u, v)cv::Mat complexF;cv::dft(paddedMatdouble, complexF, cv::DFT_COMPLEX_OUTPUT);//创建同态滤波传递函数double gamma_L = 0.25, gamma_H = 2.0;double c = 1.0, D0 = 160;cv::Mat Homomorphic = calc_Homomorphic(paddedMat.size(), gamma_L, gamma_H, c, D0);cv::Mat complexFH;cv::Mat iDft;//采用对应像素相乘G(u, v) = H(u, v) * F(u, v)cv::multiply(complexF, Homomorphic, complexFH);cv::idft(complexFH, iDft, cv::DFT_REAL_OUTPUT | cv::DFT_SCALE);//最后不要忘了再完成一次移动Dftshift(iDft, iDft);//之前进行了对数变换,现在要变换回来cv::exp(iDft, iDft);iDft = iDft - cv::Scalar::all(1);cv::Mat result = iDft(cv::Rect(0, 0, src.cols, src.rows)).clone();//截断负值,归一化并转换为ucharMinusToZero(result, result);normalize(result, result, 0, 1, cv::NORM_MINMAX);result.convertTo(result, CV_8UC1, 255);cv::imwrite("ascend_ET.png", result);cv::waitKey(0);return 0;
}

测试结果:

OpenCV实现同态滤波相关推荐

  1. MATLAB图像处理_同态滤波1

    原 MATLAB图像处理_同态滤波 2015年01月20日 09:54:25 风雨也无晴 阅读数:14234 <span class="tags-box artic-tag-box&q ...

  2. OpenCV —— 频率域滤波(傅里叶变换,低通和高通滤波,带通和带阻滤波,同态滤波)

    频率域滤波 基本概念 傅里叶变换 二维离散的傅里叶变换 快速傅里叶变换 傅里叶幅度谱与相位谱 谱残差显著性检测 卷积与傅里叶变换的 频率域滤波 低通滤波和高通滤波 带通和带阻滤波 同态滤波 基本概念 ...

  3. 经典的同态滤波算法的优化及其应用参数配置。

    同态滤波,网络上有很多文章提到过这个算法,我们摘取百度的一段文字简要的说明了该算法的核心: 同态滤波是一种减少低频增加高频,从而减少光照变化并锐化边缘或细节的图像滤波方法. 关于该算法,网络上已经有很 ...

  4. 图像同态滤波的Butterworth方程(Butterworth equations for homomorphic Filtering of images)

    论文实现代码见本人github MyHomomorphicFilter MyHomomorphicFilter 中文翻译 题目图像同态滤波的Butterworth方程Butterworth equat ...

  5. Python+OpenCV图像处理(一篇全)

    参考:1.网易云课堂 Python+OpenCV图像处理 - 网易云课堂 2.[在水一方xym的博客]业精于勤荒于嬉,行成于思毁于随 - CSDN博客 https://blog.csdn.net/za ...

  6. opencv回顾之Core module

    该篇围绕Core Functionality模块进行展开 该模块的主要作用是成为构建opencv更多高级功能的基础核心层. Mat基础图像存储数据结构 将Mat对象赋值给其他Mat变量将会共享一个地址 ...

  7. opencv python书籍_OpenCV算法精解:基于Python与C++

    目录 1 OpenCV入门 1.1 初识OpenCV 1.1.1 OpenCV的模块简介 1.1.2 OpenCV 2.4.13与3.2版本的区别 1.2 部署OpenCV 1.2.1 在Visual ...

  8. Python 计算机视觉(八)—— OpenCV 进行图像增强

    参考的一些文章以及论文我都会给大家分享出来 -- 文章链接就贴在原文,论文我上传到资源中去,大家可以免费下载学习,如果当天资源区找不到论文,那就等等,可能正在审核,审核完后就可以下载了.大家一起学习, ...

  9. C++(ALL) STL ATL Opencv 视觉图像实践进展记录

    目录 检索文件夹中的图片名--可用于批量读取图片 C++ 创建文件夹并检测指定文件的个数 C++ 检测指定文件的个数 C++ 多线程 C++ 常见错误解决 "Error: "con ...

  10. 图像增强之一种改进的同态滤波增强算法-221211工作总结

    目录 一.参考 二.背景 三.步骤 四.加权分布的自适应伽马校正(AGCWD) 1.背景 2.原理 3.函数补充 1. cv2.calcHist()函数 2. img.convert() 五.单参数同 ...

最新文章

  1. 最新最全大数据图谱,请拿走不谢!
  2. 发力大陆移动VR,HTC刚刚发布ViveWave开放平台和ViveFocus一体机
  3. 如何向学妹解释在地址栏中输入网址后发生了什么?
  4. linux 手动释放内存
  5. Angularjs与weui的握手
  6. JavaScript 中 obj.hasOwnProperty(prop) 方法
  7. 乐高创意机器人moc_乐高MOC佳作欣赏丨机械之美机器人乐高作品集1
  8. 已免押1000亿!芝麻信用:靠信用出去浪
  9. javascript比较日期
  10. 极简darknet环境搭建记录
  11. [转]C#操作Excel开发报表系列整理
  12. LIO-SAM探秘第三章之代码解析(三) --- mapOptmization.cpp (1)
  13. MYSQL5.5.48编译安装
  14. linux 启动 pycharm程序的命令(pycharm已安装好)
  15. 简述MAC地址与IP地址的关系
  16. CE 自带Tutorial -第9关
  17. 神经网络是模型还是算法,神经网络模型的优势
  18. 构造常数函数解决抽象函数导数小题
  19. Pycharm Traceback (most recent call last):
  20. “点亮心灯祝福世界·清明” 活动暨“生与死的艺术沙龙清明特场”启动

热门文章

  1. linux系统点歌机 ntfs分区,嵌入式点歌机说明
  2. 选股公式 成功率测试 软件,通达信股票软件选股公式,99%的成功率,你还等什么?...
  3. 从头开始vue创建项目_从头开始创建Windows 7主题包
  4. git log根据特定条件查询日志并统计修改的代码行数
  5. Win10如何彻底删除360的办法
  6. 2012年1月份第3周51Aspx源码发布详情
  7. Flash Timer的用法 计时器
  8. 计算机控制技术课程解释与问题答疑
  9. 用Python实现基于Tkinter和sqlite3的加密日记本程序
  10. Flak框架 Flask从入门到精通