day19 - 使用高通滤波提取图像边缘

news2025/1/6 19:53:07

在OpenCV中,对于图像或者视频的处理都或多或少的会涉及傅里叶变换的概念。在数学上,傅里叶变换是指所有的波形都可以由一系列简单且频率不同的正弦曲线叠加得到。也就是说,人们所看到的波形都是由其他波形叠加得到的。这个概念对操作图像非常重要,因为这样我们可以区分图像哪些区域的图像像素值变化特别强,哪些区域变化不那么强,从而可以任意得标记噪声区域、感兴趣的区域、前景和背景等。

本期我们主要来介绍傅里叶变换在图像处理中的应用,学习使用高通滤波提取图像边缘。

完成本期内容,你可以:

  • 了解傅里叶变换的基本定义和原理
  • 掌握使用傅里叶变换处理图像的基本流程
  • 掌握使用高通滤波对图像提取图像边缘的代码实现

若要运行案例代码,你需要有:

  • 操作系统:Ubuntu 16.04

  • 工具软件:PyCharm 2020.1.5, Anaconda3 2020.07

  • 硬件环境:无特殊要求

  • 核心库:python 3.6.13, opencv-python 3.4.2.16

点击下载源码


傅里叶变换的流程

针对数字图像的傅里叶变换是将原始图像通过傅里叶变换转换到频域,然后在频域中对图像进行处理的方法。

请添加图片描述

傅里叶变换流程图

傅里叶变换

OpenCV中实现傅里叶变换的函数是 cv2.dft(),输出的结果是双通道的。第一个通道是结果的实数部分,第二个通道是结果的虚数部分,并且输入图像要首先转换成 np.float32格式。其语法格式如下:

dst = cv2.dft(src, dst, flags, nonzeroRows)

参数说明

  • src:输入图像,需要通过np.float32转换格式
  • dst:输出图像,包括输出大小和尺寸
  • nonzeroRows:当参数不为零时,函数假定只有nonzeroRows输入数组的第一行(未设置)或者只有输出数组的第一个(设置)包含非零,因此函数可以处理其余的行更有效率,并节省一些时间;这种技术对计算阵列互相关或使用DFT卷积非常有用
  • flags表示转换标记
参数值含义
DFT _INVERSE执行反向一维或二维转换,而不是默认的正向转换
DFT _SCALE缩放结果,由阵列元素的数量除以它
DFT _ROWS执行正向或反向变换输入矩阵的每个单独的行,该标志可以同时转换多个矢量,并可用于减少开销以执行3D和更高维度的转换等;
DFT _COMPLEX_OUTPUT执行1D或2D实数组的正向转换,这是最快的选择,默认功能
DFT _REAL_OUTPUT执行一维或二维复数阵列的逆变换,结果通常是相同大小的复数数组,但如果输入数组具有共轭复数对称性,则输出为真实数组

np.fft.fftshift(img)

将图像中的低频部分移动到图像的中心,其语法格式如下:

np.fft.fftshift(img) 

参数说明

  • img:输入的图片

cv2.magnitude()

由于输出的频谱结果是一个复数,需要调用 cv2.magnitude() 函数将傅里叶变换的双通达结果转换为0到255的范围。其语法格式如下:

cv2.magnitude(x, y)

参数说明

  • x表示浮点型X坐标值,即实部
  • y表示浮点型Y坐标值,即虚部

np.fft.ifftshift(img)

将图像的低频和高频部分移动到图像原来的位置,其语法格式如下:

np.fft.ifftshift(img)  

参数说明

  • img:输入的图片

傅里叶变换逆变换

在OpenCV中,通过函数 cv2.idft()函数实现傅里叶逆变换,其返回结果取决于原始图像的类型和大小,原始图像可以为复数或实数,同时也要注意输入图像需要先转换成 np.float32格式,其语法格式如下:

dst = cv2.idft(src[, dst[, flags[, nonzeroRows]]])

参数说明

  • x表示浮点型X坐标值,即实部
  • y表示浮点型Y坐标值,即虚部

OpenCV中提供了cv2.drawContours()函数来绘制图像轮廓。

函数原型:image=cv.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])

image为目标图像,绘制了边缘的原始图像。

参数描述如下:

  • image:待绘制轮廓图像。
  • contours:需要绘制的轮廓。
  • contourIdx:需要绘制的边缘索引。
  • color:绘制的颜色,用 BGR 格式表示。
  • thickness:可选参数,表示绘制轮廓时所用的画笔粗细。
  • lineType:可选,绘制的线型。
  • hierarchy:对应函数cv2.findContours()所输出的层次信息。
  • maxLevel:该参数控制绘制的轮廓层次深度。
  • offset:偏移参数。

具体步骤

使用高通滤波提取图像边缘。

步骤一:创建项目工具

创建项目名为使用高通滤波提取图像边缘,项目根目录下新建code文件夹储存代码,新建dataset文件夹储存数据,项目结构如下:

使用高通滤波提取图像边缘                   # 项目名称
├── code                               # 储存代码文件
├── dataset                            # 储存数据文件

注:如项目结构已存在,无需再创建。

步骤二:正向傅里叶变换

  1. 导入所需模块:OpenCV、NumPy、Matplotlib ;
  2. 读取dataset文件夹下的cat.png 图片;
  3. 进行正向傅里叶变换;

代码实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
img = cv2.imread('../dataset/cat.png', 0)

# 傅里叶变换
fimg = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
# 将低频转移到图像中心
fshift = np.fft.fftshift(fimg)

步骤三:高通滤波处理

  1. 设置高通滤波器;
  2. 将高通滤波器与傅里叶变换后的图像相乘;

代码实现

# 设置高通滤波器
rows, cols = img.shape  # 获取图像属性
crow, ccol = int(rows / 2), int(cols / 2)  # 找到傅里叶频谱图的中心点
# 中心点加减30,刚好形成一个定义尺寸的滤波大小,然后设置为0
fshift[crow - 30:crow + 30, ccol - 30:ccol + 30] = 0

步骤四:傅里叶逆变换

  1. 进行傅里叶逆变换;
  2. 将数据由频域空间转化为空间域;
  3. 展示图像;

代码实现

# 傅里叶逆变换
ishift = np.fft.ifftshift(fshift)  # 将低频移动到原来的位置
iimg = cv2.idft(ishift)  # 使用cv2.idft进行傅里叶的反变化
iimg = cv2.magnitude(iimg[:, :, 0], iimg[:, :, 1])  # 转化为空间域内

# 显示原始图像和高通滤波处理图像
plt.subplot(121), plt.imshow(img, 'gray'), plt.title('original')
plt.axis('off')
plt.subplot(122), plt.imshow(iimg, 'gray'), plt.title('iimg')
plt.axis('off')
plt.show()

请添加图片描述

傅里叶变换通过波形来区分图像像素变换的强弱,从而来对图像进行操作。当频域滤波为高通滤波器的时候,就可以实现对图像边缘的提取或锐化。

点击下载源码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linus Torvalds发布了第一个Linux内核6.4候选版本

导读自Linux内核6.3发布和下一个内核系列Linux 6.4的合并窗口开放以来,已经过去了一段时间,近日,Linus Torvalds发布了第一个RC(候选发布版)的里程碑,供公众测试。 为期两周的Linux内核6.4合并窗口现已关闭…

3D开发程序员,如何在程序中将GLB格式转OBJ

Aspose.3D 是一个功能丰富的游戏软件和计算机辅助设计(CAD)的API,可以在不依赖任何3D建模和渲染软件的情况下操作文档。API支持Discreet3DS, WavefrontOBJ, FBX (ASCII, Binary), STL (ASCII, Binary), Universal3D, Collada, glTF, GLB, PLY…

微信小程序的基本使用以及安装教程

目录 一、使用微信开发者工具1、第一步先进行安装微信开发者工具2、使用方式安装完成后的使用步骤项目的大概界面 二、注册小程序账号在此处申请AppID,用于微信开发者工具的建立项目使用 三、使用微信官方文档 一、使用微信开发者工具 1、第一步先进行安装微信开发…

ASP-IIS中间件文件解析与写权限

ASP-IIS中间件文件解析与写权限 IIS文件解析 IIS 6 解析漏洞 1、该版本默认会将*.asp;.jpg 此种格式的文件名,当成Asp解析 2、该版本默认会将*.asp/目录下的所有文件当成Asp解析。 如:logo.asp;.jpg xx.asp/logo.jpgIIS 7.x 解析漏洞 在一个文件路…

Dubbo 3.2.1预览版发布,很多方面有改变

导读Dubbo 3.2.1预览版发布,很多方面有改变,比如:错误修正,代码增强,依赖性升级等。 改变了什么 功能介绍 添加追踪启动器 && 添加 zipkin 自动配置 by conghuhu in #12013QoS支持匿名命令允许列表 by Album…

2023智源大会议程公开 | 基于认知神经科学的大模型

2023年,人工智能新研究、新系统、新产品竞放——我们即将见证另一场有关智能的惊叹演化。6月9日,2023北京智源大会,将邀请这一领域的探索者、实践者、以及关心智能科学的每个人,共同拉开未来舞台的帷幕,你准备好了吗&a…

设备远程运维,实现设备管理智能化!

一、设备管理现状 设备运行状况:设备分布各地,无法远程监测设备运行参数、故障情况,对名下设备的运营情况懵然不知,能耗产量等关键数据无从知晓。 设备运营服务:当设备发生故障时,无法判断故障原因&#x…

IDEA重装后打开的一些设置

文章目录 1. 支持正版&科学永久2. 打开本地项目成功运行2. 修改IDEA的一些基本设置 1. 支持正版&科学永久 略(狗头)~ 2. 打开本地项目成功运行 刚打开项目,application是红叉状态点击Edit Configuration,配置好settings.xml和mave…

分布式项目10. js中src进行服务器之间的访问和优化使用jsonp的ajax请求处理访问

一般使用ajax来访问不同服务器的数据&#xff0c;可行吗&#xff1f; 做个实验&#xff1a; 第一步&#xff1a;在本服务器中使用ajax技术访问本服务器数据 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>测试JSON跨域…

【SpringMVC】SpringMVC的入门程序——HelloWorld(有点详细)

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

GP05丨多因子IC对冲

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 大家好&#xff0c;今天我们分享股票社群第5期量化策略——多因子IC对冲。 在前几期中&#xff0c;我们分享了GP01多因子、ETF轮动策略及Plus版本、网格等等。本期我们继续分享多因子策略。 策略背景与…

大数据治理入门系列:数据血缘关系

血缘关系在人类社会中扮演着重要角色。大多数家庭是基于血缘关系形成的&#xff0c;而家庭作为社会的基本单元&#xff0c;对维系社会稳定发挥着重要关系。其实&#xff0c;数据之间也存在类似的血缘关系。数据从产生、加工、流转&#xff0c;一直到消亡&#xff0c;每个环节必…

为什么要分库分表?

不急于上手实战 ShardingSphere 框架&#xff0c;先来复习下分库分表的基础概念&#xff0c;技术名词大多晦涩难懂&#xff0c;不要死记硬背理解最重要&#xff0c;当你捅破那层窗户纸&#xff0c;发现其实它也就那么回事。 什么是分库分表 分库分表是在海量数据下&#xff0…

【新星计划·2023】TCP协议与UDP协议讲解

前言 对于TCP协议与UDP协议&#xff0c;大家应该都有所耳闻。我们常用的网络通讯&#xff0c;比如浏览网页&#xff0c;软件聊天&#xff0c;都是通过这两种协议来进行数据传输的&#xff0c;下面我就来给大家讲解一下这两个协议。 一、什么是TCP、UDP TCP(Transmission Con…

什么是接地电阻?如何测量防雷接地电阻

防雷工程里经常出现“接地”这个词。 这种称为“接地”的布线&#xff08;施工&#xff09;旨在减少电能泄漏到使用电力的设备等原始路线外&#xff08;泄漏时&#xff09;对周围财产和人体的影响。 此外&#xff0c;为了可靠地工作设备&#xff0c;以检测漏电断路器&#xff…

股东刚减持,股价却起飞?用Python量化A股解禁数据,利空出尽是利好? | 邢不行

2019年6月11日&#xff0c;宁德时代上市一周年之际&#xff0c;有45%的股票迎来了解禁。 这些由大股东、高管、早期投资者持有的股份&#xff0c;原先无法交易&#xff0c;但从这一天起就可以自由卖出了。 很多人出于对解禁后巨大卖盘的担忧纷纷提前卖出&#xff0c;导致宁德时…

linux查看服务端口命令大全

目录&#xff1a; 零、 linux怎么查看所有服务端口一、常用命令二、lsof -i 需要 root 用户的权限来执行三、netstat命令四、扩展资料 零、 linux怎么查看所有服务端口 1、打开linux系统&#xff0c;在linux的桌面的空白处右击。 2、在d出的下拉选项里&#xff0c;点击打开终端…

责任链模式-参数校验

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、责任链模式概念二、责任链模式主要应用场景三、责任链模式的优点四、责任链模式的缺点五、场景案例&#xff1a;参数校验1.UML图2.代码实现2.1.请求体定义2…

【信号变化检测】使用新颖的短时间条件局部峰值速率特征进行信号变化/事件/异常检测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

day16 - 提取图像前景

在我们平时使用购物软件是会发现通常在搜索框右侧都会有一个相机的标志&#xff0c;这个标志是可以让用户通过图片来搜索自己需要购买的内容。拍照购物将用户拍摄的商品与商品图库的图像进行对比&#xff0c;找到最为相似的商品。但是由于用户拍摄的图像是任意的随机的&#xf…