【Emgu CV教程】7.8、图像锐化(增强)之同态滤波

文章目录

  • 一、同态滤波大体原理
  • 二、代码
  • 三、效果举例


一、同态滤波大体原理

之前介绍的几个锐化、增强方法,包括更早之前介绍的图像模糊方法,都是基于空间域进行处理,也就是直接对目标点周边像素值进行各种数学运算。而这篇文章提到的同态滤波,就要更厉害了,是基于频率域的,要用到Dft()傅里叶变换函数。

高等数学比较好的读者可能很好理解,我看了半天也没明白是什么意思,下面都是我自己的理解,可能有错的啊。傅里叶变换是一个非常厉害的操作,图像的原始表达方式是 m * n个像素点组合,这个叫空间域,空间域大小就是m * n,转成频率域呢,用处就大了,因为高频的就是噪声或者物体边缘,低频的就是图像内比较平缓的部位,比如蓝天、纯色背景、雪地等等。因为有了高低频,就可以提取出边缘、噪声来,进一步就可以对边缘、噪声进行有针对性的处理。

通过傅里叶转换,在频率域内对图像进行处理,也是很重要、很有效的一种办法,属于比较高级的应用,很值得用一大章来仔细讲解,可惜我不会,就免了吧。

二、代码

网上有很对专家利用OpenCV 实现同态滤波,原理也讲了不少,读者们可以去找找。我这里也是根据他们的原始代码,转换成Emgu CV + C#的形式来实现,代码如下:

Mat dstMat = new Mat();

// 1、log变换,将源图像转为float类型  然后进行log变换
Mat gray = srcMat.Clone();

// CvInvoke.Resize(gray, gray, new System.Drawing.Size(1280, 720), 0, 0, Inter.Linear);
CvInvoke.CvtColor(gray, gray, ColorConversion.Bgr2Gray);
Mat f = new Mat();
gray.ConvertTo(f, DepthType.Cv32F, 1 / 255.0);
f += 0.1;
CvInvoke.Log(f, f);

// 2、傅里叶变换
Mat fourierMat = new Mat();
CvInvoke.Dft(f, fourierMat, DxtType.Forward, 0);

// 3、构造一个高斯频域高通滤波器
Mat filter = new Mat(fourierMat.Rows, fourierMat.Cols, DepthType.Cv32F, 1);
filter.SetTo(new MCvScalar(0, 0, 0));
Image<Gray, double> filterImage = filter.ToImage<Gray, double>();
for (int y = 0; y < filter.Rows; y++)
{
    for (int x = 0; x < filter.Cols; x++)
    {
        int xx = x > filter.Cols / 2 ? x - filter.Cols : x;
        int yy = y > filter.Rows / 2 ? y - filter.Rows : y;

        double duv = Math.Sqrt((xx * xx) + (yy * yy));
        double d0 = 3;

        double huv = ((1.0 - 0.4) * (1 - Math.Pow(2.71828, -1 * (duv * duv / (d0 * d0))))) + 0.4;
        filterImage.Data[y, x, 0] = huv;
    }
}

filter = filterImage.Mat;
filter.ConvertTo(filter, DepthType.Cv32F);

// 4、滤波,将傅里叶变换过后的图像与滤波器相乘:
CvInvoke.Multiply(fourierMat, filter, fourierMat, 1); // 相乘后,最大值255,最小值0

// 5、傅里叶逆变换,指数变换(图像还原)
CvInvoke.Dft(fourierMat, dstMat, DxtType.InvScale, 0);
CvInvoke.Exp(dstMat, dstMat);
dstMat -= 0.1;

// 6、显示
CvInvoke.Imshow("Destination image,methord 2,  " + dstMat.Size.ToString(), dstMat);

不要问为什么,因为我也看不懂,对于频率域操作,代码能跑起来就是万幸了。

三、效果举例

原始素材定义为srcMat,如下:
在这里插入图片描述
还是这张夜晚天桥的照片,执行上述代码,同态滤波增强后的图像如下:
注意哈,它是锐化的作用,因此最终输出的图像,明暗对比没有被增强,但是仔细看,最下方地砖的纹理和树叶的边缘,是不是更清晰了????

同态滤波就是灰度增强,使图形明亮更均匀,而且明亮处的纹理保留的很好。代码执行起来速度很快,效果也很好,值得有兴趣的同学们去研究研究。再举个例子加深印象,如下:
在这里插入图片描述


原创不易,请勿抄袭。共同进步,相互学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/418471.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

百度SEO工具,自动更新网站的工具

在网站SEO的过程中&#xff0c;不断更新网站内容是提升排名和吸引流量的关键之一。而对于大多数网站管理员来说&#xff0c;频繁手动更新文章并进行SEO优化可能会是一项繁琐且耗时的任务。针对这一问题&#xff0c;百度自动更新文章SEO工具应运而生&#xff0c;它能够帮助网站管…

[云原生] k8s中kubectl陈述式资源管理

一、管理k8s核心资源的两种基本方法 陈述式资源管理方法 --主要依赖命令行工具kubectl进行管理 优点 可以满足90%以上的使用场景 对资源的增、删、查操作比较容易 缺点 命令冗长&#xff0c;复杂&#xff0c;难以记忆 特定场景下&#xff0c;无法实现管理需求 对资源的修改…

2024年四川媒体新闻发布渠道,媒体邀约资源表

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 四川有哪些媒体新闻发布渠道&#xff0c;媒体邀约资源表&#xff1f; 2024年四川媒体新闻发布渠道&#xff0c;媒体邀约资源表 四川本地媒体&#xff1a;如四川日报、华西都市报、成都商…

仿真科普|CAE技术赋能无人机 低空经济蓄势起飞

喝一杯无人机送来的现磨热咖啡&#xff1b;在拥堵的早高峰打个“空中的士”上班&#xff1b;乘坐水陆两栖飞机来一场“陆海空”立体式观光……曾经只出现在科幻片里的5D城市魔幻场景&#xff0c;正逐渐走进现实。而推动上述场景实现的&#xff0c;就是近年来越来越热的“低空经…

docker mysql主从复制

新建主服务器容器实例3301 mysql 主 3301 docker run -p 3301:3306 --name mysql-master \ -v /mydata/mysql-master/log:/var/log/mysql \ -v /mydata/mysql-master/data:/var/lib/mysql \ -v /mydata/mysql-master/conf:/etc/mysql \ -v /home/mysql/mysql-files:/var/lib/…

基于Matlab/Simulink光伏储能交直流微电网中虚拟同步机控制仿真

很久没有更新虚拟同步机控制方向的内容了&#xff0c;因为这部分内容主要是我在硕士期间的研究内容&#xff0c;不过近期很多同学加我&#xff0c;和我讨论虚拟同步机相关的附加控制和应用场景&#xff0c;对于vsg主要研究方向&#xff0c;大家还是可以看我前面写的内容。 今天…

SpringBoot 手写 Starter

spring-boot-starter 模块 1.介绍 SpringBoot中的starter是一种非常重要的机制&#xff0c;能够抛弃以前繁杂的配置&#xff0c;将其统一集成进starter&#xff0c;应用者只需要在maven中引入starter依赖&#xff0c;SpringBoot就能自动扫描到要加载的信息并启动相应的默认配…

果园预售系统|基于Springboot的果园预售系统设计与实现(源码+数据库+文档)

果园预售系统目录 目录 基于Springboot的果园预售系统设计与实现 一、前言 二、系统功能设计 三、系统功能设计 1 、果园管理 2、水果管理 3、果树管理 4、公告管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获…

C++ 原子变量

概述 C中原子变量&#xff08;atomic&#xff09;是一种多线程编程同步机制&#xff0c;它能够确保对共享变量的操作在执行时不会被其他线程的操作干扰&#xff0c;atomic是提供一种生成原子操作数的一种机制&#xff0c;避免竞态条件(race condition)和死锁(deadlock)等问题。…

css5定位

css 一.定位1.概念&#xff08;定位定位模式边位移&#xff09;2.静态位移static&#xff08;不常用&#xff09;3.相对定位relative&#xff08;不脱标&#xff09;&#xff08;占位置&#xff09;4.绝对定位absolute&#xff08;脱标&#xff09;&#xff08;不占位置&#x…

『Linux从入门到精通』第 ㉒ 期 - 动静态库

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f427;什么是库&#xff1f;&#x1f427;为什么要有库&#xff1f;&#x1f427;写一个自己的库&#x1f426;方法一&#x1f426;方法二 静态库&#x1f426;标准化&#x1f426;方法三 动态库&#x1f426;配置动…

Python根据3个点确定两个向量之间的夹角-180度到180方向进行矫正

import cv2 import numpy as np # 读取图片 image cv2.imread(rD:\dmp\cat.jpg) height, width image.shape[:2] # 定义三个定位点&#xff08;这里假设是图片上的坐标&#xff09;&#xff0c;分别表示原点&#xff0c;向量1终点&#xff0c;向量2终点&#xff0c;下…

动画原理:表面形变算法的思考与总结

前言&#xff1a; 之前我的文章 Mesh形变算法_mesh算法-CSDN博客就有大致的讨论过&#xff0c;介绍的也比较粗略&#xff01;现在主要是想在Triangulated Surface Mesh Deformation方向上更深入的讨论一下&#xff01;结合今年我对这一块的学习谈谈我的理解~ 下面要介绍大致几…

学校机房Dev c++解决中文乱码问题

工具->编译选项->勾选 编译时加入以下命令 -fexec-charsetGBK -finput-charsetUTF-8 显示中文&#xff1a;工具->编辑器选项->去掉第一个的勾勾。

WebFlux的探索与实战 - r2dbc的分页查询

自从上次立下这系列的FLAG之后就再也不想碰了。今天难得早起出门面试&#xff0c;回家之后突发奇想打算再写点儿什么敷衍一下&#xff0c;于是便有了这篇文章。 前言 虽然响应式API更加适合流式列表的查询&#xff0c;但是分页这东西可是很常见的。 也没什么前言可说&#xf…

opencv中的rgb转gray的计算方法

转换原理 在opencv中&#xff0c;可以使用cv2.cvtColor函数将rgb图像转换为gray图像。示例代码如下&#xff0c; import cv2img_path "image.jpg" image cv2.imread(img_path) gray_image cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) mean gray_image.mean() pri…

在实训云平台上配置云主机

文章目录 零、学习目标一、实训云升级二、实训云登录&#xff08;一&#xff09;登录实训云&#xff08;二&#xff09;切换界面语言&#xff08;三&#xff09;规划云主机实例 三、创建网络三、创建路由器2024-2-29更新到此四、添加接口五、创建端口六、添加安全组规则七、创建…

公网IP怎么获取?

公网IP是网络中设备的唯一标识符&#xff0c;用于在Internet上进行通信和定位。对于普通用户来说&#xff0c;了解如何获取自己的公网IP是很有必要的&#xff0c;本文将介绍几种获取公网IP的方法。 方法一&#xff1a;通过路由器查询 大多数家庭和办公室使用的路由器都会有一个…

生成式AI设计模式:综合指南

原文地址&#xff1a;Generative AI Design Patterns: A Comprehensive Guide 使用大型语言模型 (LLM) 的参考架构模式和心理模型 2024 年 2 月 14 日 对人工智能模式的需求 我们在构建新事物时&#xff0c;都会依赖一些经过验证的方法、途径和模式。对于软件工程师来说&am…

Maven【3】( 依赖的范围,传递性和依赖的排除)(命令行操作)

文章目录 【1】依赖的范围结论验证①验证 compile 范围对 main 目录有效②验证test范围对main目录无效③验证test和provided范围不参与服务器部署 【2】依赖的传递性①compile 范围&#xff1a;可以传递②test 或 provided 范围&#xff1a;不能传递 【3】依赖的排除 【1】依赖…