热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Python学习笔记】21:numpy傅里叶变换

一个简单的傅里叶变换>>>importnumpyasnp>>>importmatplotlib.pyplo

一个简单的傅里叶变换

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x=np.linspace(0,2*np.pi,50)
>>> x
array([ 0. , 0.12822827, 0.25645654, 0.38468481, 0.51291309,
0.64114136, 0.76936963, 0.8975979 , 1.02582617, 1.15405444,
1.28228272, 1.41051099, 1.53873926, 1.66696753, 1.7951958 ,
1.92342407, 2.05165235, 2.17988062, 2.30810889, 2.43633716,
2.56456543, 2.6927937 , 2.82102197, 2.94925025, 3.07747852,
3.20570679, 3.33393506, 3.46216333, 3.5903916 , 3.71861988,
3.84684815, 3.97507642, 4.10330469, 4.23153296, 4.35976123,
4.48798951, 4.61621778, 4.74444605, 4.87267432, 5.00090259,
5.12913086, 5.25735913, 5.38558741, 5.51381568, 5.64204395,
5.77027222, 5.89850049, 6.02672876, 6.15495704, 6.28318531])
>>> wave=np.cos(x)
>>> transformed=np.fft.fft(wave) #傅里叶变换
>>> plt.plot(transformed) #绘制变换后的信号
Warning (from warnings module):
File "D:\Program Files\Python\lib\site-packages\numpy\core\numeric.py", line 531
return array(a, dtype, copy=False, order=order)
ComplexWarning: Casting complex values to real discards the imaginary part
[]
>>> plt.show()

傅里叶变换使用np.fft中的fft函数,可以将余弦值作傅里叶变换。
不知道为什么按董老师的代码,绘制变换后的信号时会有这样的报错,不过最后的图像可以正常显示。

傅里叶反变换

>>> plt.plot(np.fft.ifft(transformed)) #反变换
[]
>>> plt.show()

变换后的点用np.fft中的ifft就可以反变换回去,得到它的余弦的图像。

移频(针对作好傅里叶变换的数据)

>>> shifted=np.fft.fftshift(transformed) #移频
>>> plt.plot(shifted)
[]
>>> plt.show()

使用np.fft中的ffshift可以对信号进行移频操作,还有iffshift可以将移频后的信号还原成之前的。

对移频后的信号进行傅里叶反变换

>>> plt.plot(np.fft.ifft(shifted))
[]
>>> plt.show()

二维傅里叶变换

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x=np.random.rand(10,10) #二维随机信号
>>> wave=np.cos(x)
>>> plt.plot(wave)
>>> plt.show()

>>> transformed=np.fft.fft2(wave)
>>> plt.plot(transformed)
>>> plt.show()

二维傅里叶变换使用的函数是np.fft里的fft2()函数。

>>> plt.plot(np.fft.ifft2(transformed)) #二维反变换
>>> plt.show()

同样地二维反变换也使用ifft2()函数。

得到的图像和最开始变换前的图像理论上是一样的。

滤出图像中的低频信号

首先先安装python3下的PIL包,用pip安装pillow模块就可以了。但在这之前可能需要对pip更新。

等待安装完成(cmd会回到之前的文件夹),就可以使用PIL包了。pillow模块用于图像处理非常强大,其中的Image类是比较常用的一个类。
选择一个图像作为测试,如下图。

import numpy as np
from PIL import Image
from numpy.fft import fft,ifft
def filterImage(srcImage):
#打开图像文件并获取数据
srcIm=Image.open(srcImage)
srcArray=np.fromstring(srcIm.tobytes(),dtype=np.int8)
#傅里叶变换并滤除低频信号
result=fft(srcArray)
result&#61;np.where(np.absolute(result)<9e4,0,result)
#傅里叶反变换,保留实部
result&#61;ifft(result)
result&#61;np.int8(np.real(result))
#转换为图像
im&#61;Image.frombytes(srcIm.mode,srcIm.size,result)
im.show()
filterImage(&#39;test.jpg&#39;)

首先&#xff0c;通过自定义的函数filterImage传入这个图片的名称字符串&#xff0c;然后传给了Image类的open()函数&#xff0c;打开这样一个图片&#xff0c;然后得到的Image对象传给了srcIm。

然后这个Image对象srcIm调用自己的成员函数tobytes()转换成了一个字节串&#xff0c;然后将这个图像转换成的字节串数据通过numpy的fromstring转换成一个一维数组&#xff0c;传给srcArray。

然后对这个一维数组通过fft()函数进行一维傅里叶变换&#xff0c;变换的结果给result&#xff0c;它仍然是一个数组&#xff0c;并且其中的数都是复数(关于这一点可以自己输出看一看)。

紧接着用前面学习过的numpy的where函数(见分段函数那节)&#xff0c;对于这个数组result中模(numpy的absolute函数)小于9e4的部分变成0&#xff0c;对result作更新&#xff0c;这也就是滤除了低频信号。

然后就要对这个result进行一维傅里叶反变换&#xff0c;然后通过numpy的real()函数对数组进行函数操作&#xff0c;只保留复数的实部。并且转换成int8字节码&#xff0c;这样也就可以作为一个图像的字节串数据来看待了。

最后用Image类的frombytes函数将这个变换好的字节串数据&#xff0c;转换成与原来的图像(也就是Image对象srcIm)相同模式(mode)&#xff0c;相同大小(size)的图像对象&#xff0c;再用show()函数显示即可&#xff0c;最后的结果如下。


推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了包的基础知识,包是一种模块,本质上是一个文件夹,与普通文件夹的区别在于包含一个init文件。包的作用是从文件夹级别组织代码,提高代码的维护性。当代码抽取到模块中后,如果模块较多,结构仍然混乱,可以使用包来组织代码。创建包的方法是右键新建Python包,使用方式与模块一样,使用import来导入包。init文件的使用是将文件夹变成一个模块的方法,通过执行init文件来导入包。一个包中通常包含多个模块。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
author-avatar
好好_haohao_100
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有