使用傅里叶变换进行图像边缘检测
使用傅里叶变换进行图像边缘检测
今天我们介绍通过傅里叶变换求得图像的边缘
什么是傅立叶变换?
简单来说,傅里叶变换是将输入的信号分解成指定样式的构造块。例如,首先通过叠加具有不同频率的两个或更多个正弦函数而生成信号f(x),之后,仅查看f(x)的图像缺无法了解使用哪种或多少原始函数来生成f(x)。
这就是傅立叶变换最神奇的地方。将f(x)函数通过一个傅立叶变换器,我们就可以得到一个新的函数F(x)。F(x)的是最初生成f(x)函数的频率图。因此,通过查看F(x)我们就可以得到用于生成f(x)函数的原始频率。实际上,傅立叶变换可以揭示信号的重要特征,即其频率分量。
例如下图,该图中有f(x)函数合成时的两个不同频率的原函数和对应的傅里叶变换结果F(x)。
生成该图片的代码如下:
Fs = 150.0; #采样率
Ts = 1.0 / Fs; #采样间隔
t = np.arange(0,1,Ts)#时间向量
ff1 = 5; #信号频率1
ff2 = 10; #信号2的频率
y = np.sin(2 * np.pi * ff1 * t)+ np.sin(3 * np.pi * ff2 * t)
从图中可以看出,由于原始函数是由两个不同频率的输入函数组成的,因此经过傅立叶变换后的相应频率图显示了两个不同频率的尖峰。
这是对傅立叶变换的比较简单的解释。它是一个非常复杂但非常有用的功能,在数学,物理和计算机视觉中得到了广泛的应用。
图像处理中的傅立叶变换
现在我们知道了傅里叶变换对信号处理的作用。它将输入信号从时域转换到频域。
但是它在图像处理中有什么用?它将输入图像从空间域转换为频域。换句话说,如果要在进行傅立叶变换后绘制图像,我们将看到的只是高频和低频的频谱图。高频偏向图像中心,而低频偏向周围。具体形式如下图所示。
上面对图像进行傅里叶变换的结果可以通过如下代码实现:
import numpy as np
import cv2 from matplotlib
import pyplot as plt
img = cv2.imread('scenery.jpg', 0)
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft) magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('After FFT'), plt.xticks([]), plt.yticks([])
现在我们可以对图像进行FFT(快速傅里叶变换)变换了,并且可以使用转换后的结果进行多种操作:
-
边缘检测—使用高通滤波器或带通滤波器
-
降噪—使用低通滤波器
-
图像模糊-使用低通滤镜
-
特征提取(在某些情况下)-过滤器和其他一些openCV工具的混合搭配
HPF滤波器
如前所述,在经过FFT变换的图像中,在中心处发现低频,而在周围散布了高频,我们可以创建一个掩码数组,该掩码数组的中心是一个圆,其余全部为零。当将此掩码数组作用于原始图像时,所得图像将仅具有低频。由于高频对应于空间域中的边缘,这样就可以实现图像中的边缘检测。这个掩码数组就时HPF滤波器。
我们可以通过如下代码生成HPF滤波器
mask = np.ones((rows, cols, 2), np.uint8)
r = 80 center = [crow, ccol]
x, y = np.ogrid[:rows, :cols]
mask_area = (x - center[0]) ** 2 + (y - center[1]) ** 2 <= r*r
尽管可以选择使用多种类型的过滤器,但是主要使用三种类型的过滤器:
-
高通滤波器(HPF)
-
低通滤波器(LPF)
-
带通滤波器(BPF)
使用openCV和NumPy的高通滤波器进行边缘检测
在计算机视觉领域中,检测图像边缘非常有用。一旦我们可以提取图像中的边缘,就可以将该知识用于特征提取或模式检测。
图像中的边缘通常由高频组成。因此,在对图像进行FFT(快速傅立叶变换)后,我们需要对FFT变换后的图像应用高通滤波器。该滤波器会阻止所有低频,仅允许高频通过。最后,我们对经过了滤波器的图像进行逆FFT,就会得到原始图像中一些明显的边缘特征。
接下来,我们使用汽车的图像进行此实验,这个过程的代码如下所示:
rows, cols = img.shape
crow, ccol = int(rows / 2), int(cols / 2) # center
# Circular HPF mask, center circle is 0, remaining all ones
mask = np.ones((rows, cols, 2), np.uint8)
r = 80 center = [crow, ccol]
x, y = np.ogrid[:rows, :cols]
mask_area = (x - center[0]) ** 2 + (y - center[1]) ** 2 <= r*r
# apply mask and inverse DFT
fshift = dft_shift * mask
fshift_mask_mag = 2000 * np.log(cv2.magnitude(fshift[:, :, 0], fshift[:, :, 1]))
f_ishift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])
plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(magnitude_spectrum, cmap='gray') plt.title('After FFT'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 3), plt.imshow(fshift_mask_mag, cmap='gray') plt.title('FFT + Mask'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(img_back, cmap='gray') plt.title('After FFT Inverse'), plt.xticks([]), plt.yticks([])
plt.show()
程序运行结果如下图所示:
可以看出,高通滤波器阻止了所有的低频信号,并且仅允许高频通过。由于边缘通常是由高频信号构成的,因此可以在最后的图像中找到原图像的边缘信息。
如果对傅里叶变换感兴趣,可以观看如下两个视频:
https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw
https://www.youtube.com/watch?time_continue=1&v=r18Gi8lSkfM
相关文章:

使用傅里叶变换进行图像边缘检测
使用傅里叶变换进行图像边缘检测 今天我们介绍通过傅里叶变换求得图像的边缘 什么是傅立叶变换? 简单来说,傅里叶变换是将输入的信号分解成指定样式的构造块。例如,首先通过叠加具有不同频率的两个或更多个正弦函数而生成信号f(x…...

DDD FAQs梳理
术语 领域:一种专门活动的范围、部类。 子域:一个领域细分出的多个子领域。 核心域:具备核心竞争力的子域。 通用域:同时被多个子域使用的通用功能子域,比如认证、权限。 支撑域:一些辅助性或后台功能组成…...

新星杯-ESP32智能硬件开发--SoC基础
本博文内容导读 1、当前嵌入式系统的发展情况,分析SoC作为物联网开发的重要技术,是未来物联网发展重要方向。 2、介绍SoC系统的组成和系统特点,了解SoC打下SoC基础。 3、介绍基于ESP32的SoC系列开发板,ESP32开发的系统功能进行总…...

WDM_OTN_基础知识_波分系统的网络位置
波分系统简介和OTU 在这节课的内容中,我们主要介绍,波分系统在整个通信网络中的位置,波分系统的构成和它的架构,波分设备的构成和信号图,以及OUT的功能和分类及波分系统的应用场景。 波分系统在整个通信网络中&#x…...

计算机网络 (46)简单网络管理协议SNMP
前言 简单网络管理协议(SNMP,Simple Network Management Protocol)是一种用于在计算机网络中管理网络节点的标准协议。 一、概述 SNMP是基于TCP/IP五层协议中的应用层协议,它使网络管理员能够管理网络效能,发现并解决网…...

Excel重新踩坑6:工作实战总结之根据筛选条件求平均成绩
一、前言: 这个博客的实战场景:给了一组学生数据,这些数据中,有全市20个社区,1-9年级的学生各科成绩。要求按照各社区统计1-9年级的所有学生各科平均值。下面首先介绍会用到的一些函数,然后再简单说明实战…...

使用 Java 和 FreeMarker 实现自动生成供货清单,动态生成 Word 文档,简化文档处理流程。
在上一篇博客中主要是使用SpringBootApache POI实现了BOM物料清单Excel表格导出,详见以下博客: Spring Boot Apache POI 实现 Exc()el 导出:BOM物料清单生成器(支持中文文件名、样式美化、数据合并&#…...

20250118拿掉荣品pro-rk3566开发板上Android13下在uboot和kernel启动阶段的Rockchip这个LOGO标识
20250118拿掉荣品pro-rk3566开发板上Android13下在uboot和kernel启动阶段的Rockchip这个LOGO标识 2025/1/18 15:12 缘起:做飞凌OK3588-C开发板/核心板【Linux R4】的时候,测试/生产要求没有开机LOGO【飞凌/Rockchip】 要求:黑屏或者中性界面。…...

《Hands_On_LLM》8.3: 检索增强生成-RAG技术概论
3.检索增强生成 (Retrieval-Augmented Generation (RAG)) LLM 的大规模应用很快导致人们向它们提问,并期望得到符合实际的答案。虽然这些模型可以正确回答一些问题,但它们也自信地回答了许多错误的问题。为了纠正这种行为,业界转而采用的主要…...

CSS中样式继承+优先级
继承属性和非继承属性 一、定义及分类 1、继承属性是指在父元素上设置了这些属性后,子元素会自动继承这些属性的值,除非子元素显式地设置了不同的值。 常见的继承属性: 字体 font 系列文本text-align text-ident line-height letter-spacing颜色 col…...
Vue进阶之旅:核心技术与页面应用实战(路由进阶)
文章目录 一、路由模块封装二、声明式导航(一)导航链接与高亮(二)声明式导航传参1. 查询参数传参2. 动态路由传参 三、路由重定向、404 与模式设置(一)路由重定向(二)路由 404&#…...

单片机存储器和C程序编译过程
1、 单片机存储器 只读存储器不是并列关系,是从ROM发展到FLASH的过程 RAM ROM 随机存储器 只读存储器 CPU直接存储和访问 只读可访问不可写 临时存数据,存的是CPU正在使用的数据 永久存数据,存的是操作系统启动程序或指令 断电易失 …...
Vue.js 动态设置表格最大高度的实现
概述 在现代 Web 开发中,响应式设计至关重要,尤其是在处理复杂的布局和数据表格时。表格通常会受到多种因素的影响,如分页、合计行或动态内容,这可能导致表格高度的变化。本文将介绍一个基于 Vue.js 的方法 setMaxHeight…...

Java测试开发平台搭建(九)前端
1. 搭建前端vue环境 Vue3 安装 | 菜鸟教程 2. 创建项目 1.进入ui vue ui 2. create项目 3. 成功之后添加插件: cli-plugin-router vue-cli-plugin-vuetify 4. 添加依赖 axios 5. 点击任务开始运行 如果报错: 修改vue.config.jsconst { defineConfig }…...
MySQL多表查询练习
1.找出销售部门中年纪最大的员工的姓名 mysql> select name,age from dept a ,emp_new b where a.dept1b.dept2 and dept_name销售order by age desc limit 1; ------------ | name | age | ------------ | 荣七 | 64 | ------------ 1 row in set (0.00 sec) 2.求财务…...

低代码运维与管理服务
文章目录 前言一、服务内容二、服务范围三、服务流程四、服务交付件五、责任矩阵六、验收标准 前言 随着云计算技术的发展,数字化转型是企业的必然选择,企业需要实现广泛的连接并走向开放,传统集成工具无法满足当前企业面临的数字化转型诉求…...
【机器学习:三十二、强化学习:理论与应用】
1. 强化学习概述 **强化学习(Reinforcement Learning, RL)**是一种机器学习方法,旨在通过试验与反馈的交互,使智能体(Agent)在动态环境中学习决策策略,以最大化累积奖励(Cumulative…...

解决wordpress媒体文件无法被搜索的问题
最近,我在wordpress上遇到了一个令人困扰的问题:我再也无法在 WordPress 的媒体库中搜索媒体文件了。之前,搜索媒体非常方便,但现在无论是图片还是其他文件,似乎都无法通过名称搜索到。对于我这样需要频繁使用图片的博主来说,这简直是个大麻烦。 问题源头 一开始,我怀…...

【2024年华为OD机试】(B卷,100分)- 增强的strstr (Java JS PythonC/C++)
一、问题描述 题目描述 C 语言有一个库函数 char *strstr(const char *haystack, const char *needle),用于在字符串 haystack 中查找第一次出现字符串 needle 的位置,如果未找到则返回 null。 现要求实现一个 strstr 的增强函数,可以使用…...

【前端】CSS学习笔记
目录 CSS的简介CSS的概念语法 CSS的引入方式内联样式(行内样式)内部样式外部样式(推荐) 选择器全局选择器元素选择器类选择器ID选择器合并选择器后代选择器子选择器相邻兄弟选择器通用兄弟选择器伪类选择器:link:visited:hover:ac…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...