傅里叶变换

news2024/11/20 14:25:27

傅里叶变换
傅里叶变换常用的三个函数
函数一: numpy.fft.fft2: 复数数组
函数二: numpy.fft.fftshift: 将零频率分量移动到频谱中心
函数三: 20*np.log(np.abs(fshift)) 设置频谱的范围

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

def test_1():
    img = cv2.imread(r"E:\script\lx\image\img.png", 0)  #  0: 表示保持灰度状态
    f = np.fft.fft2(img)
    f_shift = np.fft.ifftshift(f)  # 低频移动到中间
    result = 20*np.log(np.abs(f_shift))  # 设置频谱的范围
    plt.subplot(121) # 创建一个显示窗口(位置为第一个, 左边)
    plt.imshow(img, cmap="gray") # 保持灰度状态
    plt.title("original")  # 设置标题
    plt.axis("off")  # 不设置坐标系
    plt.subplot(122)  # 创建一个显示窗口(位置为第二个, 右边)
    plt.imshow(result, cmap="gray")
    plt.title("result")
    plt.axis("off") 
    plt.show()

test_1()

结果展示
在这里插入图片描述傅里叶逆变换
常用的三个函数
函数一: numpy.fft.ifft2 实现逆傅里叶变换 返回一个复数数组
函数二: numpy.fft.ifftshift 逆函数 将低频归放到原来的位置
函数三: np.abs() # 区间转换

def test_2():
    img = cv2.imread(r"E:\script\lx\image\img.png", 0)  # 0: 表示保持灰度状态
    f = np.fft.fft2(img)
    f_shift = np.fft.ifftshift(f)  # 低频移动到中间
    i_shift = np.fft.ifftshift(f_shift)  # 低频从中间移动到原有位置
    i_img = np.fft.ifft2(i_shift)  # 转为复数数组
    i_img = np.abs(i_img)
    plt.subplot(121)  # 创建一个显示窗口(位置为第一个, 左边)
    plt.imshow(img, cmap="gray")  # 保持灰度设置
    plt.title("original")  # 设置标题
    plt.axis("off")  # 不设置坐标系
    plt.subplot(122)  # 创建一个显示窗口(位置为第二个, 右边)
    plt.imshow(i_img, cmap="gray")
    plt.title("result")
    plt.axis("off")
    plt.show()

test_2()

结果如下:
在这里插入图片描述高频及低频
低频: 对应图像内变化缓慢的灰度分量(在一副大草原的图像中,低频代表着颜色趋于一致的草原)
高频: 草原上出现一头大象,大象在草原上很容易显示出来
滤波
1: 接受或者拒绝一定频率的分量
2: 通过低频的滤波器称为低通滤波器
3: 通过高频的滤波器称为高通滤波器
频域滤波
1: 修改傅里叶变换以达到特殊目的,然后计算IDFT返回到图像域
2:特殊目的: 图像增强 图像去噪 边缘检测 特征提取 压缩 加密
3: 衰减高频而通过低频 低通滤波器 将模糊一幅画像
4: 衰减低频而通过高频 高频滤波器 将增强尖锐的细节 但是会导致图像的对比度降低

高通滤波器示例:

def test_3():
    # 高通滤波器-去掉低频
    img = cv2.imread(r"E:\script\lx\image\lunchuan.png", 0)  # 0: 表示保持灰度状态
    f = np.fft.fft2(img)  # 转为复数数组
    f_shift = np.fft.fftshift(f)  # 低频移动到中心
    rows, cols = img.shape  # 获取图片大小
    crow, col = int(rows / 2), int(cols / 2)  # 中心点
    f_shift[crow-30: crow+30, col-30:col+30] = 0  # 去掉指定区间的低频
    i_shift = np.fft.ifftshift(f_shift)  # 逆变换
    i_shift = np.fft.ifft2(i_shift)  # 返回一个复数数组
    i_mg = np.abs(i_shift) # 区间转换
    plt.subplot(121)
    plt.imshow(img, cmap="gray")
    plt.title("original")
    plt.axis("off")
    plt.subplot(122)
    plt.imshow(i_mg, cmap="gray")
    plt.title("result")
    plt.axis("off")
    plt.show()
    
test_3()

OpenCV实现傅里叶变换
常用函数
函数一: cv2.dft(原始图像, 转换标识) 返回双通道: 一通道是实数 二通道是虚数 原始图像 首先转换成np.float32格式 转换标识: flags = cv2.DFT_COMPLEX_OUTPUT 输出复数阵列
函数二: cv2.magnitude(参数1, 参数2) 参数1: 浮点型X坐标值 实部 参数2: 浮点型Y坐标值 虚部


def test_4():
    """
    OpenCV实现傅里叶变换
    @return:
    """
    img = cv2.imread(r"E:\script\lx\image\lunchuan.png", 0)
    dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
    dft_shift = np.fft.fftshift(dft)
    result = 20*np.log(cv2.magnitude(dft_shift[:,:,0], dft_shift[:,:,1]))  # 双通道变为[0~255]的矩阵
    plt.subplot(121)
    plt.imshow(img, cmap="gray")
    plt.title("original")
    plt.axis("off")
    plt.subplot(122)
    plt.imshow(result, cmap="gray")
    plt.title("result")
    plt.axis("off")
    plt.show()

test_4()

结果如下
在这里插入图片描述OpenCV实现逆变换
函数一: cv2.idft(原始数据) 原始数据: 实数或者复数均可 返回结果: 取决于原始数据的类型和大小
代码示例

def test_5():
    """
    OpenCV实现傅里叶逆变换
    @return:
    """
    img = cv2.imread(r"E:\script\lx\image\lunchuan.png", 0)
    d_ft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
    d_shift = np.fft.fftshift(d_ft)
    i_shift = np.fft.ifftshift(d_shift)
    i_img = cv2.idft(i_shift)
    i_img = cv2.magnitude(i_img[:,:,0], i_img[:,:,1])
    plt.subplot(121)
    plt.imshow(img, cmap="gray")
    plt.title("original")
    plt.axis("off")
    plt.subplot(122)
    plt.imshow(i_img, cmap="gray")
    plt.title("result")
    plt.axis("off")
    plt.show()

test_5()

结果如下:
在这里插入图片描述低通滤波器

def test_6():
    # 低频滤波器-去掉高频
    img = cv2.imread(r"E:\script\lx\image\lunchuan.png", 0)  # 0: 表示保持灰度状态
    d_ft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
    d_shift = np.fft.fftshift(d_ft)
    rows, cols = img.shape
    crow, col = int(rows / 2), int(cols / 2)
    mask = np.zeros((rows, cols, 2), np.uint8)  # 创建一个新的矩阵
    mask[crow-30:crow+30, col-30: col+30] = 1  # 指定区间去掉高频
    f_shift = d_shift * mask  # 滤波
    i_shift = np.fft.ifftshift(f_shift)  # 逆变换
    i_shift = cv2.idft(i_shift)  # 返回一个复数数组
    i_mg = cv2.magnitude(i_shift[:,:,0], i_shift[:,:,1])  # 区间转换
    plt.subplot(121)
    plt.imshow(img, cmap="gray")
    plt.title("original")
    plt.axis("off")
    plt.subplot(122)
    plt.imshow(i_mg, cmap="gray")
    plt.title("result")
    plt.axis("off")
    plt.show()

test_6()

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

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

相关文章

再说多线程(三)——Mutex类

1.引子在前面2节,我们已经讨论了Lock语句和Monitor类,Locks 和 Monitors 确保 InProcess 线程的线程安全,即由应用程序本身生成的线程,即内部线程。但是,如果线程来自 OutProcess,即来自外部应用程序&#…

Java 诊断利器 Arthas monitor/watch/trace命令

一、监控相关命令介绍 二、监控相关命令 2.1、运行Demo 2.2、monitor 命令 2.2.1、方法监控 2.3、watch 命令 (重要) 2.3.1、观察函数调用返回时的参数、this 对象和返回值 2.3.2、查看函数调用的入参和返回值 2.3.3、深度遍历 x 说明 2.3.4、查…

检验仪器控制怎么停止的

之前介绍仪器控制启动是按维护的调用M和仪器ID组串直接j启动进程,进程在调用Start启动TCP。 组装执行M串用j启动进程 启动TCP通道,成功之后就到f的死循环了 死循环这里容易有个误解,以为Stop是停止仪器接口的。其实这个Stop是判断要不要…

一灯大师,基于imx6ull点亮LED灯

一.imx6ull GPIO原理1. STM32 GPIO回顾我们一般拿到一款全新的芯片,第一个要做的事情的就是驱动其 GPIO,控制其 GPIO 输出高低电平,我们学习 I.MX6U 也一样的,先来学习一下 I.MX6U 的 GPIO。在学习 I.MX6U的 GPIO 之前&#xff0c…

Spark WordCount 案例

文章目录Spark WordCount 案例1、程序连接 Spark2、WordCount 案例示例3、复杂版 WordCount4、Spark 框架WordcountSpark WordCount 案例 1、程序连接 Spark 首先这个Scala spark程序和spark的链接,跟sql编程类似。首先new 一个新的val context SparkContext()对…

谷粒商城-高级篇-Day10-ElasticSearch

初步检索 1、_cat GET /_cat/nodes:查看所有节点 GET/_cat/health:查看es健康状况 GET/_cat/master:查看主节点 GET/_cat/indices:查看所有索引–相当于查询所有数据库 2、索引一个文档 put:http://192.168.205.128:9200/customer/external/1 {"name&qu…

Qt之加载百度离线地图(WebKit和WebEngine)

最近翻看进年前写了一篇关于百度离线地图的博客:Qt加载百度离线地图,发现存在很多问题,比如不能加载折线等图形覆盖物;只支持QtWebKit,不支持QtWebEngine。 之前做项目需要在百度离线地图上绘制Mesh拓扑图,必须添加折线覆盖物,使用的是百度离线地图API V2.1,满足需求。…

Java注解详解

什么是注解 ​ 用一个词就可以描述注解,那就是元数据,即一种描述数据的数据。所以,可以说注解就是源代码的元数据 元注解 JDK1.5之后内部提供的注解: Deprecated 意思是“废弃的,过时的”Override 意思是“重写、覆…

算法训练营 day18 二叉树 找树左下角的值 路径总和 从中序与后序遍历构建二叉树

算法训练营 day18 二叉树 找树左下角的值 路径总和 从中序与后序遍历构建二叉树 找树的左下角 513. 找树左下角的值 - 力扣(LeetCode) 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节…

Java --- JUC之原子类

目录​​​​​​​ 一、基本类型原子类 二、数组类型原子类 三、引用类型原子类 四、对象的属性修改类型原子类 五、原子操作增强类 5.1、高性能热点商品应用 5.2、LongAdder架构图 5.3、源码分析 一、基本类型原子类 public class AtomicTest1 {public static final…

canvas:基础知识【直线和矩形】

canvas,就是画布,是HTML5和核心技术之一,结合JavaScript,可以绘制各种各样的图形,比如矩形、曲线、圆形等等。另外,canvas可以绘制图表、动画效果、游戏开发。 基本图形汇中有直线和曲线。常见的直线图形是…

arduino rc522模块使用

rfid IC卡 先了解IC卡一些前置知识。 首先我们会有一张ic卡(M1类型IC卡,一般买到的都是1K存储空间),在rc522代码中会出现这个,就是对IC卡进行检查PICC_TYPE_MIFARE_4K和PICC_TYPE_MIFARE_1K就是一种卡片类型不同大小…

零基础学MySQL(二)-- 表的创建,修改,删除

文章目录🎈一、创建表1️⃣基本语法2️⃣入门案例🎆二、MySQL常用数据类型1️⃣数值型(整型)默认有符号2️⃣数值型(bit)3️⃣数值型(浮点型)默认有符号4️⃣字符串的基本使用5️⃣字…

1584_AURIX_TC275_SMU的调试以及部分寄存器

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 前面学习的过程中,突然间减速了不少。但是为了保证学习的推进,还是得有每天的稳定输出。我的策略是多看,多处理,之后每天整理10页标注的文档…

设计模式相关内容介绍

1.学习设计模式好处 提高编程能力、思维能力、设计能力程序设计更加标准化、代码编制更加工程化,软件开发效率大大提高,缩短项目周期设计的代码可重用性高、可读性强、可靠性高、 灵活性好、可维护性强 2.设计模式分类 创建型模式 提供创建对象的机制…

一文读懂工业级交换机的规范使用

工业交换机具备电信级特性特点,可承受严苛的工作环境,产品种类丰富多彩,交换机配置灵便,可以满足各类工业应用的应用标准。那么,大家使用工业级交换机的过程当中应该如何规范使用呢? 工业级交换机其实质运…

蓝队攻击的四个阶段(四)

目录 一, 外网纵向突破 1.1 何为外网纵向突破 1.2外网纵向突破的主要工作 二, 外网纵向突破的途径 1. Web 网站 2.外部邮件系统 3.边界网络设备 4.外部应用平台 三,内网横向拓展 1. 1何为内网横向拓展 1.2 内网横向拓展的主要工作 …

电商价格监测,关注这些,才算实际到手价

品牌控价的第一项工作,是先找出低价乱价链接,这就需要进行电商价格监测。但是我们搜索品牌链接的时候,会发现网页上的价格是多种多样:有原价(但是划掉了)、促销价、折扣价、惊喜价,优惠活动也是…

localStorage

localStorage localStorage了解 有些数据确实需要存储在本地,但是它却不需要发送到服务器,所以并不适合放在cookie中 localStorage 也是一种浏览器存储数据的方式(本地存储),它只是存储在本地,不会发送…

【Linux】进程间通信(1)

信号 什么是信号?信号是给程序提供一种可以处理异步事件的方法,它利用软件中断来实现。不能自定义信号,所有信号都是系统预定义的。 信号由谁产生? 由shell终端根据当前发生的错误(段错误、非法指令等)Ctr…