热门标签 | 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;最后的结果如下。


推荐阅读
  • 图像因存在错误而无法显示 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 手把手教你使用GraphPad Prism和Excel绘制回归分析结果的森林图
    本文介绍了使用GraphPad Prism和Excel绘制回归分析结果的森林图的方法。通过展示森林图,可以更加直观地将回归分析结果可视化。GraphPad Prism是一款专门为医学专业人士设计的绘图软件,同时也兼顾统计分析的功能,操作便捷,可以帮助科研人员轻松绘制出高质量的专业图形。文章以一篇发表在JACC杂志上的研究为例,利用其中的多因素回归分析结果来绘制森林图。通过本文的指导,读者可以学会如何使用GraphPad Prism和Excel绘制回归分析结果的森林图。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
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社区 版权所有