opencv 傅里叶变换(低通滤波 + 高通滤波)

文章目录

  • 1、傅里叶变换
  • 2、通过numpy实现
  • 3、高通滤波器
  • 5、通过opencv实现傅里叶变换
  • 6、低通滤波器

1、傅里叶变换

时域分析:以时间作为参照物,世间万物都是随着时间变化而变化,并且不会停止
频域分析:认为世间万物都是静止的,永恒不变的

通过以下制作饮料的过程可以很好的理解傅里叶变换。

1、从时域分析:就是六点零一放了1块冰糖,3颗红豆,2颗绿豆,4块西红柿,1杯纯净水,六点零二放了1块冰糖。。。。随着时间的变化一直在变化

在这里插入图片描述
2、从频域角度分析:不在是以时间为参照物了,而是这个事情的频率,1分钟放1块冰糖,2分钟放3粒红豆,3分钟放2粒绿豆,4分钟放4块西红柿,5分钟放1杯水。
在这里插入图片描述

下面这两个图都是描述同一个事情,可以更明显看出,两者的区别。
在这里插入图片描述
在两个角度去看周期函数的变化
在这里插入图片描述

任何连续的周期信号,可以由一组适当的正𫠊曲线组成

相为:三个开始起点不一致的余𫠊函数,组成了这个曲线
在这里插入图片描述
在这里插入图片描述

2、通过numpy实现

通过将原图进行傅里叶变换,得到频域图像,获得高频和低频,对高频和低频进行操作之后,进行逆变换回原图像达到对图像进行特色操作:图像增强、图像去噪、边缘检测、特征提取、压缩、加密等
1、低通滤波器:只保留低频信息,去掉高频信息,会去掉边缘特征信息,会让图像变模糊
2、高频滤波器:只保留高频信息,去掉低频信息,会增强图像的边缘和特征信息,但是会失去一些细节信息
在这里插入图片描述
在这里插入图片描述

def test9():
    img = cv2.imread("1.jpg", 0)
    # 执行傅里叶变换,转化为频域
    f = np.fft.fft2(img)
    # 低频在左上角,为了方便,将其移到中心位置(带负数的数组)
    fshift = np.fft.fftshift(f)
    # 通过将其转换为(0-255)中
    result = 20 * np.log(np.abs(fshift))

    # 原图显示
    # 创建窗口一行两列,第一咧
    plt.subplot(121)
    plt.imshow(img, cmap='gray')
    plt.title('orginal')
    # 不用坐标系
    plt.axis('off')

    # 傅里叶变换之后的图
    plt.subplot(122)
    plt.imshow(result, cmap='gray')
    plt.title('result')
    plt.axis('off')
    plt.show()

在这里插入图片描述

从频域转换会原图像(因为没有做任何操作,所以输出图像不会发生改变)

def test10():
    img = cv2.imread("1.jpg", 0)
    # 执行傅里叶变换,转化为频域
    f = np.fft.fft2(img)
    # 低频在左上角,为了方便,将其移到中心位置(带负数的数组)
    fshift = np.fft.fftshift(f)

    # 低频谱从中心移动到左上角(相当于又移回去)
    ishift = np.fft.ifftshift(fshift)
    # 从频域转换回原图像
    iimg = np.fft.ifft2(ishift)
    iimg = np.abs(iimg)

    # 原图显示
    # 创建窗口一行两列,第一咧
    plt.subplot(121)
    plt.imshow(img, cmap='gray')
    plt.title('orginal')
    # 不用坐标系
    plt.axis('off')

    # 傅里叶变换之后的图
    plt.subplot(122)
    plt.imshow(iimg, cmap='gray')
    plt.title('result')
    plt.axis('off')
    plt.show()

在这里插入图片描述

3、高通滤波器

前面已经说过,高通滤波器是去除所有低频信息,达到图像增强的效果但是会失去一些细节信息。
在这里插入图片描述

def test11():
    img = cv2.imread("1.jpg", 0)
    # 执行傅里叶变换,转化为频域
    f = np.fft.fft2(img)
    # 低频在左上角,为了方便,将其移到中心位置(带负数的数组)
    fshift = np.fft.fftshift(f)

    # 高宽 创建高通滤波器
    rows, cols = img.shape
    crows, ccols = int(rows / 2), int(cols / 2)
    # 前面我们将低频信息移动到图像中间来了
    # 这里将低频信息全部设置为0,达到去掉低频信息目的
    fshift[crows - 30:crows + 30, ccols - 30:ccols + 30] = 0

    ifshift = np.fft.ifftshift(fshift)
    # 将频谱逆变换到图像
    iimg = np.fft.ifft2(ifshift)
    iimg = np.abs(iimg)

    plt.subplot(121)
    plt.imshow(img, cmap='gray')
    plt.title('orginal')
    # 不用坐标系
    plt.axis('off')

    # 傅里叶变换之后的图
    plt.subplot(122)
    plt.imshow(iimg, cmap='gray')
    plt.title('result')
    plt.axis('off')
    plt.show()

在这里插入图片描述

5、通过opencv实现傅里叶变换

使用opencv中的函数实现
在这里插入图片描述

def test12():
    img = cv2.imread("1.jpg", 0)

    # dft返回的是两个通道的频域,0是频域实部分,1是频域图像虚部分
    # DFT_COMPLEX_OUTPUT输出复数
    dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
    dftshift = np.fft.fftshift(dft)

    idftshift = np.fft.ifftshift(dftshift)
    # 傅里叶逆变换
    iimg = cv2.idft(idftshift)
    # magnitude函数频域图像的幅度谱
    # result = 20 * np.log(cv2.magnitude(dftshift[:, :, 0], dftshift[:, :, 1]))

    result = cv2.magnitude(iimg[:, :, 0], iimg[:, :, 1])

    plt.subplot(121)
    plt.imshow(img, cmap='gray')
    plt.title('orginal')
    # 不用坐标系
    plt.axis('off')

    # 傅里叶变换之后的图
    plt.subplot(122)
    plt.imshow(result, cmap='gray')
    plt.title('result')
    plt.axis('off')
    plt.show()

在这里插入图片描述

6、低通滤波器

创建一个mask,将中心位置设为1,其他位置设为0,然后和频谱图像相乘之后就只保留了低频信息了

在这里插入图片描述

def test13():
    img = cv2.imread("1.jpg", 0)

    # # 执行傅里叶变换
    dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
    ifshift = np.fft.fftshift(dft)

    # 创建低通滤波器
    rows, cols = img.shape
    mask = np.zeros((rows, cols, 2), np.int8)
    crows, ccols = int(rows / 2), int(cols / 2)
    mask[crows - 30:crows + 30, ccols - 30:ccols + 30] = 1
    fshift = ifshift * mask

    ishift = np.fft.ifftshift(fshift)
    io = cv2.idft(ishift)

    result = cv2.magnitude(io[:, :, 0], io[:, :, 1])

    plt.subplot(121)
    plt.imshow(img, cmap='gray')
    plt.title('orginal')
    # 不用坐标系
    plt.axis('off')

    # 傅里叶变换之后的图
    plt.subplot(122)
    plt.imshow(result, cmap='gray')
    plt.title('result')
    plt.axis('off')
    plt.show()

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

将html网页展示的图表,下载到PPT文档内,以图片的形式展示在PPT内

使用到的工具有: 开发工具:IDEA 报表开发工具:帆软10.0.19 1、针对帆软报表[普通报表]的设置 1.1首先选中在帆软里制作好的报表,选择模板web属性 1.2.选择数据分析模式,添加一个事件设置,该事件应该设置“…

使用甘特图实现高效时间规划

甘特图虽然看似简单,却蕴含着规划时间的奥秘。它将复杂的工序分解成逻辑严密的任务链条,每个短小的条形图块都清晰地道出一个任务的起始、持续和终止。就像指挥家挥舞手中的棒,每个动作都精确拍着节奏,确保各个乐手分工合作、行云流水。择一个好用的甘特图制作工具,会让你事半功…

HCIP作业

实验要求: 1、R6为ISP,接口IP地址均为公有地址,该设备只能配置IP地址,之后不能再对其进行任何配置; 2、R1-R5为局域网,私有IP地址192.168.1.0/24,请合理分配; 3、R1、R2、R4&#x…

空间解析几何之直线与平面:推导直线与直线、直线与平面交点

空间解析几何——直线与平面 三维空间中的直线和平面与二维空间中的性质有一定的类似之处,但是其相交关系的求解方式有所差异。本文回顾了三维空间中直线和平面的解析表达,然后推导线-线、线-面交点。 平面 空间平面的表达式为: A x B y…

React状态管理库快速上手-Redux(一)

基本使用 安装 pnpm install reduxjs/toolkit react-redux创建一个仓库 定义state createSlice相当于创建了一个模块仓库,initialState存放状态,reducers存放改变状态的方法。 import { createSlice } from reduxjs/toolkitexport const counterSli…

MATLAB环境下基于改进最大相关峭度解卷积的滚动轴承故障诊断

相关峭度解卷积MCKD是一种新的解卷积方法,其设计了一个新的目标函数—相关峭度,并以此为优化目标设计一系列的FIR滤波器,为实现最好的效果,需要从中找到最优滤波器并最终实现对信号中噪声的抑制和对信号中冲击成分的突出的目的。M…

产品推荐 | 基于XC7K325T的FMC接口万兆光纤网络验证平台

01、产品概述 TES307是一款基于XC7K325T FPGA的万兆光纤网络验证平台,板卡具有1个FMC(HPC)接口,4路SFP万兆光纤接口、4路SATA接口、1路USB3.0接口。 板载高性能的FPGA处理器可以实现光纤协议、SATA总线控制器、以及USB3.0高速串…

长安链Docker Java智能合约引擎的架构、应用与规划

#功能发布 长安链3.0正式版发布了多个重点功能,包括共识算法切换、支持java智能合约引擎、支持后量子密码、web3生态兼容等。我们接下来为大家详细介绍新功能的设计、应用与规划。 在《2022年度长安链开源社区开发者调研报告》中,对Java合约语言支持是开…

华为配置HTTPS服务器实验

配置HTTPS服务器示例 组网图形 图1 配置HTTPS服务器组网图 组网需求配置思路配置注意事项操作步骤配置文件 组网需求 如图1所示,用户通过Web方式访问网关设备AP。 为了防止传输的数据不被窃听和篡改,实现对设备的安全管理,网络管理员要…

Makefile编译make complie时报错的心路历程

本次报错是在Makefile文件里面找错 Makefile文件找错的方法很复杂,必须要有一双慧眼,一层一层剥离分析 第一个错误(还有一个错在全志 76节 23:35的时候连接wiringPi库) 第二个错误: undefined reference…

Java:类和对象

目录 1.面对对象的初步认识1.1 什么是面向对象?(Java当中一切皆为对象)1.2 面对对象与面对过程 2.类的定义和使用2.1简单认识类2.2 类的定义格式 3.类的实例化3.1 什么是实例化3.2类和对象的说明 4.this引用4.1为什么要使用this引用4.2 什么是…

docker小白第十四天之Portainer与CIG

Portainer简介 Portainer是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。 Portainer命令安装 # 一个容器可以同时起多个-p端口,restartalways表示随时在线,重启机器后也…

O2OA红头文件流转与O2OA版式公文编辑器基本使用

O2OA开发平台在流程管理中,提供了符合国家党政机关公文格式标准(GB/T 9704—2012)的公文编辑组件,可以让用户在包含公文管理的项目实施过程中,轻松地实现标准化公文格式的在线编辑、痕迹保留、手写签批等功能。并且可以…

[uni-app] uni.createAnimation动画在APP端无效问题记录

文章目录 uni.createAnimation动画描述动画代码templatejs部分 问题原因改进方案template js部分改动git 改进截图 uni.createAnimation 动画描述 实现一个以左上角为锚点,以Z轴做平面抬起及落下的动画效果 动画代码 template <image v-if"showHot(item.cname)&quo…

锂电极片生产中机器视觉系统的多元检测能力

随着新能源行业的快速发展&#xff0c;锂电池作为核心组件&#xff0c;其生产质量受到了前所未有的关注。在锂电极片的生产过程中&#xff0c;机器视觉系统以其高精度、高效率的特点&#xff0c;成为了保障产品质量的关键工具。本文将探讨机器视觉系统在锂电极片生产中可以检测…

WanAndroid(鸿蒙版)开发的第六篇

前言 DevEco Studio版本&#xff1a;4.0.0.600 WanAndroid的API链接&#xff1a;玩Android 开放API-玩Android - wanandroid.com 其他篇文章参考&#xff1a; 1、WanAndroid(鸿蒙版)开发的第一篇 2、WanAndroid(鸿蒙版)开发的第二篇 3、WanAndroid(鸿蒙版)开发的第三篇 …

GO语言:函数、方法、面向对象

本文分享函数的定义、特性、defer陷阱、异常处理、单元测试、基准测试等以及方法和接口相关内容 1 函数 函数的定义 func 函数名(参数列表) (返回值列表) { // 函数体&#xff08;实现函数功能的代码&#xff09; } 匿名函数的定义就是没有函数名&#xff0c;可以当做一个函…

第十九章 linux部署scrapyd

文章目录 1. linux部署python环境1. 部署python源文件环境2. 下载python3. 解压安装包4. 安装5. 配置环境变量6. 检查是否安装成功7. 准备python使用的包8. 安装scrapyd 1. linux部署python环境 1. 部署python源文件环境 yum install gcc patch libffi-devel python-devel zl…

【源码阅读】EVMⅢ

参考[link](https://blog.csdn.net/weixin_43563956/article/details/127725385 大致流程如下&#xff1a; 编写合约 > 生成abi > 解析abi得出指令集 > 指令通过opcode来映射成操作码集 > 生成一个operation 以太坊虚拟机的工作流程&#xff1a; 由solidity语言编…

WordPress站点如何实现发布文章即主动推送到神马搜索引擎?

平时boke112百科很少关注到神马搜索引擎&#xff0c;近日有站长留言想要实现WordPress站点发布文章就主动推送到神马搜索引擎&#xff0c;而且推送成功就自动添加一个自定义字段&#xff0c;以防重复推送。 登录进入神马站长平台后才知道神马也有一个API推送功能&#xff0c;不…
最新文章