基于OpenCv的图像傅里叶变换

news2024/5/18 16:13:22

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计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.coloradmin.cn/o/1641749.html

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

相关文章

【C++并发编程】(四)条件变量

文章目录 (四)条件变量 (四)条件变量 条件变量(Condition Variable)用于线程间的同步,允许一个或多个线程在特定条件不满足时等待,并在条件满足时被其他线程唤醒。C标准库中提供了的…

D3CTF2024

文章目录 前言notewrite_flag_where【复现】D3BabyEscapePwnShell 前言 本次比赛笔者就做出两道简单题,但队里师傅太快了,所以也没我啥事。然后 WebPwn 那题命令行通了,但是浏览器不会调试,然后就简单记录一下。 note 只开了 N…

【热门话题】如何构建具有高度扩展性的系统

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 如何构建具有高度扩展性的系统引言一、理解扩展性1.1 扩展性的定义1.2 扩展性的…

3GPP官网下载协议步骤

1.打开官网 https://www.3gpp.org/ 2.点击 3.在界面选择要找的series,跳转到查找界面 以V2X通信协议为例,论文中通常会看到许多应用: [7] “Study on evaluation methodology of new Vehicle-to-Everything (V2X) use cases for LTE and NR…

2-手工sql注入(进阶篇) sqlilabs靶场1-4题

1. 阅读,学习本章前,可以先去看看基础篇:1-手工sql注入(基础篇)-CSDN博客 2. 本章通过对sqlilabs靶场的实战,关于sqlilabs靶场的搭建:Linux搭建靶场-CSDN博客 3. 本章会使用到sqlmap,关于sqlmap的命令&…

C 深入指针(2)

目录 1 野指针 1.1 成因 1.2 如何规避野指针 2 assert 断言 2.1 用法 2.2 assert 的优点 2.1 assert 的缺点 3 小注解 3.1 Debug 和 Release 1 野指针 【概念】: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的&#…

解决windows下无法安装Hyper-V

在windows中打开hyper-v的办法如下:(但不适用无法安装hyper-v的windows系统如win10家庭版) 通过「控制面板」是启用 Hyper-V 最直接的方法: 1 使用Windows R快捷键打开「运行」对话框,执行appwiz.cpl以打开「控制面…

关于win平台c语言引入开源库的问题与解决

许久不写博客,五一还在加班,就浅浅写一篇吧 最近除了做物联网平台 还对网关二次开发程序做了修改,网关的二次开发去年年底的时候做过,但是当时的逻辑不是十分完善,差不多已经过了半年了,很多细节已经忘记了…

Java--方法的使用

1.1什么是方法 方法顾名思义就是解决问题的办法,在程序员写代码的时候,会遇到很多逻辑结构一样,解决相同问题时,每次都写一样的代码,这会使代码看起来比较绒余,代码量也比较多,为了解决这个问题…

VBA 根据表格指定列拆分多sheet

一. 需求 ⏹ 根据部分列,拆分数据到多个sheet页 二. 代码 ⏹ 重点代码摘要 CreateObject("scripting.dictionary"):创建一个字典对象,相当于Java中的MapDim aRef() As String:定义一个存储字符串类型的数组ReDim aRe…

Linux学习之IP协议

前言: 在学习IP协议i前,我们其实知道网络协议栈是一层层的,上层封装好之后就传给下层,对于我们治安学习到的TCP协议,在对数据进行封装之后,并不是直接就将数据进行传输,而是交给下一层网络层进…

【讲解如何OpenCV入门】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

GDPU unity游戏开发 碰撞器与触发器

砰砰叫,谁动了她的奶酪让你的小鹿乱撞了。基于此,亦即碰撞与触发的过程。 碰撞器与触发器的区别 通俗点讲,碰撞器检测碰撞,触发器检测触发,讲了跟没讲似的。碰撞器是用来检测碰撞事件的,在unity中&#xff…

发表博客之:transformer 架构 推理时候运算流程详细讲解,小白都可以看得懂,AI推理工程师必备技能!

文章目录 [发表博客之:transformer 架构 推理时候 详细讲解,小白都可以看得懂,AI推理工程师必备技能!](https://cyj666.blog.csdn.net/article/details/138439826)总结一下 发表博客之:transformer 架构 推理时候 详细…

[每日AI·0501]GitHub 版 Devin,Transformer的强力挑战者 Mamba,Sora 制作细节与踩坑,OpenAI 记忆功能

AI 资讯 国资委:加快人工智能等新技术与制造全过程、全要素深度融合GitHub版 Devin 上线,会打字就能开发应用,微软 CEO:重新定义 IDE在12个视频理解任务中,Mamba 先打败了 TransformerSora 会颠覆电影制作吗&#xff…

Python | Leetcode Python题解之第66题加一

题目: 题解: class Solution:def plusOne(self, digits: List[int]) -> List[int]:n len(digits)for i in range(n - 1, -1, -1):if digits[i] ! 9:digits[i] 1for j in range(i 1, n):digits[j] 0return digits# digits 中所有的元素均为 9retu…

Java——认识异常

目录 一.异常的概念与体系结构 1.异常的概念 1.1算术异常 1.2数组越界异常 1.3空指针异常 2.异常的体系结构 3.异常的分类 3.1编译时异常 3.2运行时异常 二.异常的处理 1.防御式编程 1.1LBYL 1.2EAFP(核心) 2.异常的抛出 3.异常的捕获 3…

1081 检查密码(测试点2简析)

solution 潜在的非法字符里可能包含空格&#xff0c;所以不能直接用cin接收string&#xff08;测试点2&#xff09; #include<iostream> #include<string> using namespace std; int judge(string s){if(s.size() < 6) return 1;int num 0, c 0;for(int i …

C++基础——输入输出(文件)

一、标准输入输出流 C 的输入输出是程序与用户或外部设备&#xff08;如文件、网络等&#xff09;之间交换信息的过程。 C 提供了丰富的标准库来支持这种交互&#xff0c;主要通过流的概念来实现。 流&#xff1a;抽象概念&#xff0c;表示一连串的数据&#xff08;字节或字…

Python爬虫--爬取糗事百科段子

爬取糗事百科段子&#xff1a; 段子在 <div class"content"> 里面的 <span> 标签里面 不过这里有个坑&#xff0c;div 标签跟 span 标签 之间有很多空行 普通 .*? 是匹配不了的&#xff0c;需要使用模式修饰符 S S 的意思 让 .(点) 匹配&#xff0c…