基于OpenCv的图像傅里叶变换

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/

❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我

基于OpenCv的图像傅里叶变换

  • 基于OpenCv的图像傅里叶变换
    • 任务需求
    • 任务目标
      • 1、掌握图像的傅里叶变换
      • 2、掌握使用低通滤波使图像模糊
      • 3、掌握使用高通滤波使图像细节增强
    • 任务环境
      • 1、jupyter开发环境
      • 2、OpenCv
      • 3、python3.6
    • 任务实施过程
      • 一、图像的傅里叶变换
        • 1.导入所需要的工具包和读取图像
        • 2.图像傅里叶变换
        • 3.低通滤波
        • 4.高通滤波
      • 二、任务小结
  • 说明

基于OpenCv的图像傅里叶变换

任务需求

傅里叶变换将原来难以处理的时域信号转换成了易于分析的频域信号,可以利用一些工具对这些频域信号进行处理、加工。最后还可以利用傅里叶反变换将这些频域信号转换成时域信号。
图像经过傅里叶变换后,大部分能力都分布于低频谱段,这对以后图像的压缩、传输都比较有利。如下图为不同图像的经过傅里叶变换后的频谱图。

在这里插入图片描述

任务目标

1、掌握图像的傅里叶变换

2、掌握使用低通滤波使图像模糊

3、掌握使用高通滤波使图像细节增强

任务环境

1、jupyter开发环境

2、OpenCv

3、python3.6

任务实施过程

一、图像的傅里叶变换

傅里叶变换,可以将时域转换成频域。

  • 低通滤波:让低频信息通过,过滤高频信息,会使得图像模糊
  • 高通滤波:让高频信息通过,过滤低频信息,会使得图像细节增强
1.导入所需要的工具包和读取图像
import cv2 # 导入opencv
import matplotlib.pyplot as plt # 导入绘图模块
import numpy as np # 导入numpy库
from utils import im_show # 导入显示图像函数
# 绘制图像直接展示,不用调用plt.show()
%matplotlib inline 
# 用来正常显示中文标签
plt.rc('font',family="SimHei")
# 读取图像,0表示按单通道的方式读入图像,即灰度图像 
img = cv2.imread(r'./experiment/data/lena.jpg',0)
plt.figure(figsize=(6,6))
im_show('图像', img)

在这里插入图片描述

2.图像傅里叶变换

cv2.dft(img, flags =cv2.DFT_COMPLEX_OUTPUT) 傅里叶变换

  • img:输入的图片
  • cv2.DFT_COMPLEX_OUTPUT表示进行傅里叶变换的方法

np.fft.fftshift(img) 将图像中的低频部分移动到图像的中心

  • img:输入的图片

cv2.magnitude(x, y) 将sqrt(x^2 + y^2) 计算矩阵维度的平方根

参数说明:需要进行x和y平方的数

# 1.进行float32形式转换(dft()函数输入图像需要先转换成np.float32 格式)
img_float32 = np.float32(img)# 2.使用cv2.dft()进行傅里叶变换,dft()返回的结果是双通道的(实部,虚部)
dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT)# 3.使用np.fft.fftshift()将变换后的图像的低频转移到中心位置
dft_shift = np.fft.fftshift(dft)# 4.使用cv2.magnitude()函数将dft()返回的实部和虚部转换成图像格式(0-255),乘以20是为了使得结果更大
img_dft = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))# 5.绘图
plt.figure(figsize=(12,12))
plt.subplot(121)
im_show('输入图像', img)
plt.subplot(122)
im_show('频谱图',img_dft)

在这里插入图片描述

  • 1.振幅谱中越靠近中心亮点,表示该点对应频率的幅值越大。
  • 2.频谱图上的各点与图像上各点不存在对应的关系。
3.低通滤波

让低频信息通过,过滤高频信息,会使得图像模糊

# 使用掩模只保留低通# 1.读取图像
img = cv2.imread(r'./experiment/data/lena.jpg', 0)
# 2.进行float32形式转换
img_float = np.float32(img)
# 3.使用cv2.dft()进行傅里叶变换
dft = cv2.dft(img_float, flags=cv2.DFT_COMPLEX_OUTPUT)
# 4.使用np.fft.fftshift()将变换后的图像的低频转移到中心位置
dft_center = np.fft.fftshift(dft)# 5.定义掩模:生成的掩模中间为1周围为0
# 求得图像的中心点位置
crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) 
# 创建一个全为0的数组,设置数据类型为np.uint8
mask = np.zeros((img.shape[0], img.shape[1], 2), np.uint8)
# 中心上取30,下取3,左取30,右取30,设置为1
mask[crow-30:crow+30, ccol-30:ccol+30] = 1# 6.将掩模与傅里叶变化后图像相乘,保留中间部分(低频部分)
mask_img = dft_center * mask# 7.使用np.fft.ifftshift()将低频移动到原来的位置
img_idf = np.fft.ifftshift(mask_img)# 8.使用cv2.idft进行傅里叶的反变换
img_idf = cv2.idft(img_idf)# 9.使用cv2.magnitude转换成图像格式
img_idf = cv2.magnitude(img_idf[:, :, 0], img_idf[:, :, 1])# 10.绘图
plt.figure(figsize=(12,12))
plt.subplot(121)
im_show('原图',img)
plt.subplot(122)
im_show('低通滤波后',img_idf)
plt.show()

在这里插入图片描述

4.高通滤波

让高频信息通过,过滤低频信息,会使得图像细节增强

# 使用掩模只保留高通# 1.读取图像
img = cv2.imread(r'./experiment/data/lena.jpg', 0)
# 2.进行float32形式转换
img_float = np.float32(img)
# 3.使用cv2.dft()进行傅里叶变换
dft = cv2.dft(img_float, flags=cv2.DFT_COMPLEX_OUTPUT)
# 4.使用np.fft.fftshift()将变换后的图像的低频转移到中心位置
dft_center = np.fft.fftshift(dft)# 5.定义掩模:生成的掩模中间为0周围为1
# 求得图像的中心点位置
crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) 
# 创建一个全为1的数组,设置数据类型为np.uint8
mask = np.ones((img.shape[0], img.shape[1], 2), np.uint8)
# 中心上取30,下取3,左取30,右取30,设置为0
mask[crow-30:crow+30, ccol-30:ccol+30] = 0# 6.将掩模与傅里叶变化后图像相乘,保留中间部分(低频部分)
mask_img = dft_center * mask# 7.使用np.fft.ifftshift()将低频移动到原来的位置
img_idf = np.fft.ifftshift(mask_img)# 8.使用cv2.idft进行傅里叶的反变换
img_idf = cv2.idft(img_idf)# 9.使用cv2.magnitude转换成图像格式
img_idf = cv2.magnitude(img_idf[:, :, 0], img_idf[:, :, 1])# 10.绘图
plt.figure(figsize=(12,12))
plt.subplot(121)
im_show('原图',img)
plt.subplot(122)
im_show('高通滤波后',img_idf)

在这里插入图片描述

二、任务小结

本次实验主要完成基于OpenCv的傅里叶变换。通过低通和高通滤波完成图像去噪和图像增强的作用。

通过本次实验需要掌握以下内容:

  • 1.掌握使用低通滤波使图像模糊
  • 2.掌握使用高通滤波使图像细节增强

–end–

说明

本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我

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

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

相关文章

【题解】OR26 最长回文子串(回文串)

https://www.nowcoder.com/practice/b4525d1d84934cf280439aeecc36f4af?tpId182&tqId34752&ru/exam/oj class Solution { public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * param A string字符串 * …

【电子通识】为什么用双绞线?双绞线抗干扰的原理是什么?

使用双绞线最大的理由是抗干扰。不仅可以防止别人干扰,也可以防止自己干扰别人。这与EMC中的EMS和EMI相对应(参考【EMC专题】电磁兼容--基本概念)。 双绞线是由一对带有绝缘层的铜线(绝缘层使两根线中的金属导体不会因为互碰而导致短路)以螺旋的方式缠绕在一起所构成的。通…

【Java】Stream流、方法引用(Java8)

Stream流 中间方法 distinct() 使用HashSet去重 终结方法 toArray() value 表示 流中数据的个数,要跟数组的长度保持一致。 collect() 收集到map中,比较复杂。需要指定 键 和 值 的生成规则。 方法引用 01_引用静态方法 ​ 引用类方法,其实…

jQuery 笔记13 JavaScript的好帮手

相关内容:下载jQuery网址、jQuery的使用、表格排序软件(tablesorter)、行事历软件(FullCalendar)、…… jQuery是一套开放性源代码的JavaScript函数库(Library),jQuery是JavaScript函数库,简化了…

示波器使用学习笔记#1

1.示波器横轴表示的是时间,纵轴是电压 此时纵轴一格刻度是1V。 此时横轴一格是200us。 此时方波的电压值是2500mV,周期为200us * 4.6 920 us,频率为1087Hz。 采样率500M/秒表示:示波器每秒钟采集500w个点 ,当前示波器…

A Bug‘s Life (并查集)

//新生训练 #include <iostream> #include <algorithm> using namespace std; const int N 5000; int p[N], sz[N]; int n, m; int find(int x) {if (p[x] ! x)p[x] find(p[x]);return p[x]; } int main() {int T;scanf("%d", &T);for (int k 1; …

python中type,object,class 三者关系

type,object,class 三者关系 在python中&#xff0c;所有类的创建关系遵循&#xff1a; type -> int -> 1 type -> class -> obj例如&#xff1a; a 1 b "abc" print(type(1)) # <class int> 返回对象的类型 print(type(int)) …

C++设计模式-创建型设计模式

设计模式 设计模式是什么 设计模式是指在软件开发中&#xff0c;经过验证的&#xff0c;用于解决在特定环境下&#xff0c;重复出现的&#xff0c;特定问题的解决方案&#xff1b;其实就是解决问题的固定套路。但是要慎用设计模式&#xff0c;有一定的工程代码量之后用它比较…

主持人口才训练与实用技巧

主持人口才训练与实用技巧 一、引言 在广播、电视、网络等媒体中&#xff0c;主持人是节目的灵魂和核心。一个优秀的主持人不仅要具备良好的专业素养&#xff0c;更需要出色的口才技巧和应对能力。本文将详细探讨主持人口才训练的重要性以及实用的技巧&#xff0c;帮助主持人…

当AI遇上架构师:谁将主导未来?

▼最近直播超级多&#xff0c;预约保你有收获 架构师的核心能力是面对不同的业务场景给出合适的架构设计方案&#xff0c;Balance 平衡设计就是架构师最重要的能力&#xff0c;没有之一。 在 AI 大模型时代&#xff0c;AI 大模型正在重新定义软件的范式。在当前&#xff0c;世界…

Win11 怎么让软件运行后台全部显示在任务栏上 win11任务栏展开显示所有软件图标

Win11 怎么让软件运行后台全部显示在任务栏上 win11任务栏展开显示所有软件图标 方法二 搜索cmd 打开命令行面板 然后输入 explorer shell:::{05d7b0f4-2121-4eff-bf6b-ed3f69b894d9}就能显示出来了 ## 方法三 通知区域图标不存在 如图&#xff0c;显示为这样 这种时候桌面…

[C++基础学习-07]----C++结构体详解

前言 结构体&#xff08;Struct&#xff09;是C中一种用户定义的复合数据类型&#xff0c;用于存储不同类型的数据项。结构体可以包含不同类型的数据成员&#xff0c;这些数据成员可以是基本类型&#xff08;如int、float、char等&#xff09;&#xff0c;也可以是数组、指针、…

Android版本依赖Version catalog

曾经我们使用config.gradle文件进行版本依赖配置&#xff0c;然后在project的build.gradle.kts中使用如下方式引入&#xff1a; apply(from "./config.gradle") 缺点&#xff1a;在project的module中引用无任何提示&#xff0c;无法跳转到指定引用 一、创建versio…

绝地求生 延迟高 丢包掉线加速器分享 内附延迟问题解决方法

绝地求生 延迟高 丢包掉线加速器分享 内附延迟问题解决方法 绝地求生&#xff0c;俗称吃鸡&#xff0c;自从游戏18年上线之初一直火热至今&#xff0c;在全世界范围内都有着极高的关注度。可是许多玩家常常在游戏内遇到各种问题&#xff0c;影响了玩家们的游戏体验&#xff0c…

[数据结构]——非递归排序总结——笔试爱考

具体代码实现在gitee&#xff1a;登录 - Gitee.com 目录 具体代码实现在gitee&#xff1a;登录 - Gitee.com 1.非递归实现的快速排序算法。 第一步 首先要创建一个栈 第二步紧接着进行入栈&#xff0c;出栈&#xff0c;弹出栈顶元素&#xff0c;获取栈顶元素&#xff0c;判…

百度/高德地图的自定义content中如何使用ReactDom写法

遇到的问题 我们知道&#xff0c;在百度/高德地图中&#xff0c;有时需要加一些自定义html标签&#xff0c;但通常是用字符串传入&#xff08;意味着只能用原生的写法&#xff09;&#xff0c;写起来非常不方便&#xff0c;如下图所示&#xff1a; // 百度api const infoWindo…

如何查公网IP?

在网络通信中&#xff0c;每个设备都被分配一个独特的IP地址&#xff0c;用于在Internet上进行标识和通信。公网IP是指可以直接从Internet上访问的IP地址&#xff0c;也称为全局IP。通过查公网IP&#xff0c;我们可以了解我们的设备在Internet上的位置和连接状态。 2. 查公网IP…

【免费Java系列】大家好 ,今天是学习面向对象高级的第四天点赞收藏关注,持续更新作品 !

这是java进阶课面向对象第一天的课程可以坐传送去学习http://t.csdnimg.cn/Lq3io day04——常用API 一、 StringBuilder类 StringBuilder代表可变字符串对象&#xff0c;相当于是一个容器&#xff0c;它里面的字符串是可以改变的&#xff0c;就是用来操作字符串的。 好处&am…

MATLAB实现遗传算法优化第三类生产线平衡问题

第三类生产线平衡问题的数学模型 假设&#xff1a; 工作站数量&#xff08;m&#xff09;和生产线节拍&#xff08;CT&#xff09;是预设并固定的。每个任务&#xff08;或作业元素&#xff09;只能分配到一个工作站中。任务的执行顺序是预先确定的&#xff0c;且不可更改。每…

读天才与算法:人脑与AI的数学思维笔记16_音乐图灵测试

1. 艾米 1.1. 人工智能作曲家 1.1.1. 分析机可能会生成任意复杂程度、精细程度的科学的音乐作品 1.1.1.1. 阿达洛夫莱斯 1.1.2. 巴赫的作品是大多数作曲家开始学习创作的起点&#xff0c;也是大多数计算机开始学习作曲的起点…