当前位置: 首页 > news >正文

使用傅里叶变换进行图像边缘检测

使用傅里叶变换进行图像边缘检测

今天我们介绍通过傅里叶变换求得图像的边缘

什么是傅立叶变换?

简单来说,傅里叶变换是将输入的信号分解成指定样式的构造块。例如,首先通过叠加具有不同频率的两个或更多个正弦函数而生成信号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

相关文章:

使用傅里叶变换进行图像边缘检测

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

DDD FAQs梳理

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

新星杯-ESP32智能硬件开发--SoC基础

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

WDM_OTN_基础知识_波分系统的网络位置

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

计算机网络 (46)简单网络管理协议SNMP

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

Excel重新踩坑6:工作实战总结之根据筛选条件求平均成绩

一、前言&#xff1a; 这个博客的实战场景&#xff1a;给了一组学生数据&#xff0c;这些数据中&#xff0c;有全市20个社区&#xff0c;1-9年级的学生各科成绩。要求按照各社区统计1-9年级的所有学生各科平均值。下面首先介绍会用到的一些函数&#xff0c;然后再简单说明实战…...

使用 Java 和 FreeMarker 实现自动生成供货清单,动态生成 Word 文档,简化文档处理流程。

在上一篇博客中主要是使用SpringBootApache POI实现了BOM物料清单Excel表格导出&#xff0c;详见以下博客&#xff1a; Spring Boot Apache POI 实现 Exc&#xff08;&#xff09;el 导出&#xff1a;BOM物料清单生成器&#xff08;支持中文文件名、样式美化、数据合并&#…...

20250118拿掉荣品pro-rk3566开发板上Android13下在uboot和kernel启动阶段的Rockchip这个LOGO标识

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

《Hands_On_LLM》8.3: 检索增强生成-RAG技术概论

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

CSS中样式继承+优先级

继承属性和非继承属性 一、定义及分类 1、继承属性是指在父元素上设置了这些属性后&#xff0c;子元素会自动继承这些属性的值&#xff0c;除非子元素显式地设置了不同的值。 常见的继承属性: 字体 font 系列文本text-align text-ident line-height letter-spacing颜色 col…...

Vue进阶之旅:核心技术与页面应用实战(路由进阶)

文章目录 一、路由模块封装二、声明式导航&#xff08;一&#xff09;导航链接与高亮&#xff08;二&#xff09;声明式导航传参1. 查询参数传参2. 动态路由传参 三、路由重定向、404 与模式设置&#xff08;一&#xff09;路由重定向&#xff08;二&#xff09;路由 404&#…...

单片机存储器和C程序编译过程

1、 单片机存储器 只读存储器不是并列关系&#xff0c;是从ROM发展到FLASH的过程 RAM ROM 随机存储器 只读存储器 CPU直接存储和访问 只读可访问不可写 临时存数据&#xff0c;存的是CPU正在使用的数据 永久存数据&#xff0c;存的是操作系统启动程序或指令 断电易失 …...

Vue.js 动态设置表格最大高度的实现

概述 在现代 Web 开发中&#xff0c;响应式设计至关重要&#xff0c;尤其是在处理复杂的布局和数据表格时。表格通常会受到多种因素的影响&#xff0c;如分页、合计行或动态内容&#xff0c;这可能导致表格高度的变化。本文将介绍一个基于 Vue.js 的方法 setMaxHeight&#xf…...

Java测试开发平台搭建(九)前端

1. 搭建前端vue环境 Vue3 安装 | 菜鸟教程 2. 创建项目 1.进入ui vue ui 2. create项目 3. 成功之后添加插件&#xff1a; cli-plugin-router vue-cli-plugin-vuetify 4. 添加依赖 axios 5. 点击任务开始运行 如果报错&#xff1a; 修改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.求财务…...

低代码运维与管理服务

文章目录 前言一、服务内容二、服务范围三、服务流程四、服务交付件五、责任矩阵六、验收标准 前言 随着云计算技术的发展&#xff0c;数字化转型是企业的必然选择&#xff0c;企业需要实现广泛的连接并走向开放&#xff0c;传统集成工具无法满足当前企业面临的数字化转型诉求…...

【机器学习:三十二、强化学习:理论与应用】

1. 强化学习概述 **强化学习&#xff08;Reinforcement Learning, RL&#xff09;**是一种机器学习方法&#xff0c;旨在通过试验与反馈的交互&#xff0c;使智能体&#xff08;Agent&#xff09;在动态环境中学习决策策略&#xff0c;以最大化累积奖励&#xff08;Cumulative…...

解决wordpress媒体文件无法被搜索的问题

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

【2024年华为OD机试】(B卷,100分)- 增强的strstr (Java JS PythonC/C++)

一、问题描述 题目描述 C 语言有一个库函数 char *strstr(const char *haystack, const char *needle)&#xff0c;用于在字符串 haystack 中查找第一次出现字符串 needle 的位置&#xff0c;如果未找到则返回 null。 现要求实现一个 strstr 的增强函数&#xff0c;可以使用…...

【前端】CSS学习笔记

目录 CSS的简介CSS的概念语法 CSS的引入方式内联样式&#xff08;行内样式&#xff09;内部样式外部样式&#xff08;推荐&#xff09; 选择器全局选择器元素选择器类选择器ID选择器合并选择器后代选择器子选择器相邻兄弟选择器通用兄弟选择器伪类选择器:link:visited:hover:ac…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...