OpenCV图像处理之傅里叶变换

news2025/1/11 21:05:06

文章目录

  • OpenCV图像处理之傅里叶变换
    • 图像处理之傅里叶变换流程图
    • OpenCv图像处理之傅里叶变换
    • OpenCv傅里叶变换之低通滤波
    • OpenCv傅里叶变换之高通滤波

OpenCV图像处理之傅里叶变换

傅里叶变换:目的就是得到图像的低频和高频,然后针对低频和高频进行不同的处理。处理完之后,在通过逆变换恢复到图像,这时候对低频和高频的处理就会反映到图像上。

  • 频率

高频:变化剧烈的灰度分量,例如边界。
低频:变化缓慢的灰度分量,例如一天蓝天(相似的多)。

  • 滤波

低通滤波器:只保留低频,会使图像模糊。
高通滤波器:只保留高频,会使图像细节增强。

图像处理之傅里叶变换流程图

在这里插入图片描述

OpenCV主要就是cv.dft()和cv.idft(),输入图像需要先转换成np.float32格式,得到的结果中频率为0,的部分会在左上角,通常要转换到中心位置,可以通过shift变换来实现, cv.dft()返回的结果是双通道的(实部、虚部),通常需要转换成图像格式才能展示(0,255)

OpenCv图像处理之傅里叶变换

# 读取一张灰度图像
img = cv.imread('img/tree.jpg',0)
# 将图像转换成np.float32格式
img_float32 = np.float32(img)
# cv.dft()函数进行傅里叶变换,返回的结果是双通道的(实部、虚部),通常需要转换成图像格式才能展示(0,255)
dft = cv.dft(img_float32, flags = cv.DFT_COMPLEX_OUTPUT)
# 再调用 np.fft.fftshift() 函数将中心位置转移至中间。
dft_shift = np.fft.fftshift(dft)
# cv.magnitude()是OpenCV中的一个函数,用于计算两个数组的逐元素欧几里得距离。
# 具体来说,该函数可以计算两个数组(可以是实数或复数数组)的逐元素欧几里得距离,返回一个与输入数组形状相同的数组。
# 得到灰度图能表示的形式(转换成图像格式才能展示(0,255)),映射公式,需要将像素值映射之0-255
magnitude_spectrum = 20*np.log(cv.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
# 傅里叶变换后图像进行展示
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('OpenCV Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

  • 获取图像的中心位置
rows, cols = img.shape
crow, ccol = int(rows/2) , int(cols/2) # 中心位置

OpenCv傅里叶变换之低通滤波

# 设置遮掩的形状(一般为矩形、圆形),大小(自定义)
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow-50:crow+50, ccol-50:ccol+50] = 1

# IDFT
fshift = dft_shift*mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv.idft(f_ishift)
img_back = cv.magnitude(img_back[:,:,0],img_back[:,:,1])

plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img_back, cmap = 'gray')
plt.title('Result'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

OpenCv傅里叶变换之高通滤波

# 设置遮掩的形状(一般为矩形、圆形),大小(自定义)
mask = np.ones((rows, cols, 2), np.uint8)
mask[crow-5:crow+5, ccol-5:ccol+5] = 0

# IDFT
fshift = dft_shift*mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv.idft(f_ishift)
img_back = cv.magnitude(img_back[:,:,0],img_back[:,:,1])

plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img_back, cmap = 'gray')
plt.title('Result'), plt.xticks([]), plt.yticks([])

plt.show()

在这里插入图片描述

大家可以更改mask的大小或形状对图像进行处理,对比着学习起来更容易理解。

# 设置遮掩的形状(一般为矩形、圆形),大小(自定义)
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1

在这里给大家推荐几个关于傅里叶变换的学习网页以及视频。
哔站:B站首发!草履虫都能看懂的【傅里叶变换】讲解,清华大学李永乐老师教你如何理解傅里叶变换,辨清美颜和变声原理,!!
傅里叶变换这样学,何愁不会呢?直观理解傅里叶变换
图像傅里叶变换实验

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

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

相关文章

yolov5训练自己的目标检测模型

yolov5训练自己的目标检测模型 1.克隆项目并配置环境 1.1克隆项目 进入GitHub下载yolov5源码 点此进入 选择分支v5.0,并下载源码 anaconda激活相应环境 activate pytorch进入项目存放的地址 E: cd yolov5-master1.2 yolov5项目结构 ├── data:主…

信号生成和可视化——周期性/非周期性波形

信号生成和可视化 此示例说明如何使用 Signal Processing Toolbox™ 中提供的函数生成广泛使用的周期和非周期性波形、扫频正弦波和脉冲序列。尝试此示例Copy Command Copy Code 周期性波形 除了 MATLAB 中的 sin 和 cos 函数外,Signal Processing Toolbox™ 还…

客快物流大数据项目(一百一十五):熔断器 Spring Cloud Hystrix

文章目录 熔断器 Spring Cloud Hystrix 一、​​​​​​​Hystrix 简介 二、什么是雪崩效应

如何使用 Linux find 命令查找文件?

在Linux系统中,find命令是一个非常强大的工具,可以帮助用户查找文件或目录。这篇教程将向您展示如何使用Linux find命令来查找您需要的文件。 基本语法 在使用Linux find命令之前,您需要了解其基本语法。Linux find命令的基本语法如下&…

初识Java:数据类型与变量、运算符

哈喽大家好,这篇文章我将为大家分享关于Java的数据类型与变量和运算符。 文章目录 数据类型与变量数据类型整型类型byte类型short类型int类型long类型 浮点型字符类型布尔类型 变量浮点型变量布尔型变量类型转换隐式转化显式转化 运算符算术运算符增量运算符自增/自…

CSDN 周赛 47 期

CSDN 周赛 47 期 判断题单选题12 填空题编程题1、题目名称:最小差值(30分)2、题目名称:风险投资(45分) 小结 判断题 中国古代就发现并证明了勾股定理,并在《周髀算经》中出现了“勾三股四弦五”…

Linux 这4个进程相关的命令,太好用!

当您在Linux系统中管理进程时,了解一些进程监控命令是非常重要的。这些命令可以帮助您了解当前正在运行的进程以及它们的状态,从而更好地管理系统资源。下面是一些常用的Linux进程监控命令及其示例: 1、ps命令 ps命令可以列出当前正在运行的…

验证码登录开发----手机验证码登录

手机验证码登录 需求分析 为了方便用户登录,移动端通常都会提供通过手机验证码登录的功能 手机验证码登录的优点: 方便快捷、无需注册,直接登录使用短信验证码作为登录凭证,无需记忆密码安全 登录流程: 输入手机…

06-文章搜索页面

文章搜索页面 6-1:开篇 再上一章中,我们完成了 热搜首页 的开发,虽然经历了 ”千辛万苦“ ,但是对大家来说,应该也是收获满满。 那么在这一章节,我们将会进入新的篇章,来到 文章搜索 页面的开…

【C++】深度剖析string类的底层结构及其模拟实现

文章目录 前言1. string的结构2. 构造、析构2.1 无参构造2.2 带参构造2.3 问题发现及修改c_stroperator []析构 2.4 合二为一 ——全缺省 3. 拷贝构造3.1 浅拷贝的默认拷贝构造3.2 深拷贝拷贝构造的实现 4. 赋值重载4.1 浅拷贝的默认赋值重载4.2 深拷贝赋值重载的实现 5. strin…

ES6 中的类(class)

前言 ES6 引入的 class 关键字具有定义类的能力。类是 ECMAScript 中新的基础性语法糖。虽然 ES6 表面上看起来可以支持正式的面向对象编程,但实际上它背后使用的依旧是原型和构造函数的概念。(笔记内容参考《JavaScript 高级程序设计(第 4 …

TTL反相器、OC门、TS门、推挽输出、开漏输出

TTL反相器 这是一个TTL反相器,这是经过了很多工程师多种设计最终沉淀出来的电路,这个电路是比较成熟的。我们只需要对这个电路进行解析即可,不需要再去研究当初是如何设计出来的。 学过CMOS应该知道,右侧的输出级其实也是个推挽输…

为什么程序实际可用内存会远超物理内存?

背景介绍 不知道在你刚接触计算机的时候,有没有这么一个疑问:“为什么我的机器上只有两个G 的物理内存,但我却可以使用比这大得多的内存,比如 256T?”反正我当时还是挺疑惑的,不过现在我可以来告诉你这个答…

如何将销售效果最大化:从人工智能聊天机器人到即时聊天

聊天机器人的崛起 从几年前开始,客户支持是聊天机器人使用的第一个爆发点。B2C引领潮流,B2B紧随其后。市场营销和销售最近也开始加入,让聊天机器人承担起迎接和引导网站游客的任务。现在,人工智能已经进入聊天,可以说…

机器学习 第一周

目录 1. 什么是机器学习(课本给出的部分定义) 我理解的机器学习:

Java基础:IO流有哪些,各有什么特点和功能

具体操作分成面向字节(Byte)和面向字符(Character)两种方式。 如下图所示: IO流的三种分类方式 IO流的层次结构 IO流的常用基类有: 字节流的抽象基类:InputStream和OutputStream; 字符流的抽象基类:Reader和Writer…

20、单元测试

文章目录 1、JUnit5 的变化2、JUnit5常用注解3、断言(assertions)1、简单断言2、数组断言3、组合断言4、异常断言5、超时断言6、快速失败 4、前置条件(assumptions)5、嵌套测试6、参数化测试7、迁移指南 【尚硅谷】SpringBoot2零基…

JAVA性能优化实例

目录 概述 Sql性能优化 多线程 利用内存缓存 功能优化 参考博客 概述 性能优化的几个点,大致可以分为: sql优化使用多线程利用内存,缓存等,将固定不常更改的数据放入在,存取更快的内存当中功能实现逻辑优化 Sql性…

五分钟,说说Python 中多线程共享全局变量的问题

嗨害大家好鸭!我是爱摸鱼的芝士❤ 写在前面不得不看的一些P话: Python 中多个线程之间是可以共享全局变量的数据的。 但是,多线程共享全局变量是会出问题的。 假设两个线程 t1 和 t2 都要对全局变量g_num (默认是0)进行加1运算&#xff0c…

日常项目技术方案脉络

开篇引砖 软件在其生命周期中,当其进入稳定期后,大部分时间都处于迭代更新维护阶段。在这漫长的三年甚至五年的存活期内,我们需要面对林林种种大大小小的需求。今天我们就聊聊在这段期间,如何快速产出一份合格的技术方案。 方案给…