傅里叶变换

对于傅里叶变换的介绍,此处有一篇很好的帖子可供参考。(至少知乎上说很好。。虽然有些地方没懂,但是我不想掐它 呵呵)
傅里叶分析之掐死教程(完整版)更新于2014.06.06

说句题外话,文中结尾作者的阐述的一些观点,本人表示赞同!嘿嘿。。

傅里叶变换是把一个信号从时域变换到其对应的频域进行分析

  • 这种变换的思想是任何函数可以很精确的接近无穷个sin()函数和cos()函数的和。傅里叶变换提供了这种方法来达到这种效果。
  • 傅里叶公式如下:

    上式中f(i, j)是图像空间域的值而F是频域的值。傅里叶转换的结果是复数,这也显示出了傅里叶变换是一副实数图像(real image)和虚数图像(complex image)叠加或者是幅度图像(magitude image)和相位图像(phase image)叠加的结果。在实际的图像处理算法中仅有幅度图像(magnitude image)图像能够用到,因为幅度图像包含了我们所需要的所有图像几何结构的信息。但是,如果想通过修改幅度图像或者相位图像来间接修改原空间图像,需要保留幅度图像和相位图像来进行傅里叶逆变换,从而得到修改后图像。

傅里叶变换的作用之滤波

  1. 高频:变换剧烈的灰度变量,例如 边界
  2. 低频:变换缓慢的灰度变量,流入 大海

滤波

  1. 低通滤波器:保留 低频,使得图像 模糊
  2. 高通滤波器:保留 高频,使得图像 细节增强

opencv的傅里叶变换

方法 作用
cv2.dif() 把图像进行傅里叶变换,时域->频域
cv2.idft() 逆傅里叶变换,频域-> 时域

注:输入图像必须要转成numpy.float32格式

void dft(InputArray src, OutputArray dst, int flags=0, int nonzeroRows=0);
  1. InputArray src: 输入图像,可以是实数或虚数
  2. OutputArray dst: 输出图像,其大小和类型取决于第三个参数flags
  3. int flags = 0: 转换的标识符,有默认值0.其可取的值如下所示:

DFT_INVERSE: 用一维或二维逆变换取代默认的正向变换 。DFT_SCALE:
缩放比例标识符,根据数据元素个数平均求出其缩放结果,如有N个元素,则输出结果以1/N缩放输出,常与DFT_INVERSE搭配使用。
DFT_ROWS:
对输入矩阵的每行进行正向或反向的傅里叶变换;此标识符可在处理多种适量的的时候用于减小资源的开销,这些处理常常是三维或高维变换等复杂操作。
DFT_COMPLEX_OUTPUT:
对一维或二维的实数数组进行正向变换,这样的结果虽然是复数阵列,但拥有复数的共轭对称性(CCS),可以以一个和原数组尺寸大小相同的实数数组进行填充,这是最快的选择也是函数默认的方法。你可能想要得到一个全尺寸的复数数组(像简单光谱分析等等),通过设置标志位可以使函数生成一个全尺寸的复数输出数组。
DFT_REAL_OUTPUT:
对一维二维复数数组进行逆向变换,这样的结果通常是一个尺寸相同的复数矩阵,但是如果输入矩阵有复数的共轭对称性(比如是一个带有DFT_COMPLEX_OUTPUT标识符的正变换结果),便会输出实数矩阵。

  1. int nonzeroRows = 0: 当这个参数不为0,函数会假设只有输入数组(没有设置DFT_INVERSE)的第一行或第一个输出数组(设置了DFT_INVERSE)包含非零值。这样的话函数就可以对其他的行进行更高效的处理节省一些时间,这项技术尤其是在采用DFT计算矩阵卷积时非常有效。

实例代码:
画出傅里叶变换后的频域图像

import numpy as np
import cv2
from matplotlib import pyplot as pltimg=cv2.imread("lenna.jpg",0)#化成np.float32
img_float32=np.float32(img)#执行傅里叶变换
dft=cv2.dft(img_float32,flags=cv2.DFT_COMPLEX_OUTPUT)
#把低频率图像放到中间位置
dft_shift=np.fft.fftshift(dft)#把值化成灰度图可以表示的形式(0—255)
magnitude_spectrum=20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))#画出频域图像 (中间亮点为低频数据)
plt.subplot(121),plt.imshow(img,cmap='gray')
plt.title("input imgage"),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum,cmap='gray')
plt.title("magnitude_spectrum"),plt.xticks([]),plt.yticks([])
plt.show()

中间亮点为低频数据


画出傅里叶变换后进行低通滤波的lenna图

import numpy as np
import cv2
from matplotlib import pyplot as pltimg=cv2.imread("lenna.jpg",0)#化成np.float32
img_float32=np.float32(img)#执行傅里叶变换
dft=cv2.dft(img_float32,flags=cv2.DFT_COMPLEX_OUTPUT)
#把低频率图像放到中间位置
dft_shift=np.fft.fftshift(dft)#图像形状
rows,cols=img.shape
#图像中心点位置
crow,ccol=int(rows/2),int(cols/2)#低通滤波
mask=np.zeros((rows,cols,2),np.uint8)
mask[crow-30:crow+30,ccol-30:ccol+30]=1#去除中心之外的频域
fshift=dft_shift*mask#把中心频域的放回原位置
f_ishift=np.fft.ifftshift(fshift)#逆傅里叶变换
img_back=cv2.idft(f_ishift)
#使值化成灰度图可以表示的形式(0—255)
img_back=cv2.magnitude(img_back[:,:,0],img_back[:,:,1])#画出低通滤波后的图像
plt.subplot(121),plt.imshow(img,cmap='gray')
plt.title("input imgage"),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(img_back,cmap='gray')
plt.title("Result"),plt.xticks([]),plt.yticks([])
plt.show()

消除了边界高频信息,只保留了低频信息,图像变得模糊

画出傅里叶变换后进行低通滤波的lenna图
和低通滤波基本相同,只改变了mask的取值。

import numpy as np
import cv2
from matplotlib import pyplot as pltimg=cv2.imread("lenna.jpg",0)#化成np.float32
img_float32=np.float32(img)#执行傅里叶变换
dft=cv2.dft(img_float32,flags=cv2.DFT_COMPLEX_OUTPUT)
#把低频率图像放到中间位置
dft_shift=np.fft.fftshift(dft)#图像形状
rows,cols=img.shape
#图像中心点位置
crow,ccol=int(rows/2),int(cols/2)#高通滤波
mask=np.ones((rows,cols,2),np.uint8)
mask[crow-30:crow+30,ccol-30:ccol+30]=0#去除中心频域
fshift=dft_shift*mask#把中心频域的放回原位置
f_ishift=np.fft.ifftshift(fshift)#逆傅里叶变换
img_back=cv2.idft(f_ishift)
#使值化成灰度图可以表示的形式(0—255)
img_back=cv2.magnitude(img_back[:,:,0],img_back[:,:,1])#画出低通滤波后的图像
plt.subplot(121),plt.imshow(img,cmap='gray')
plt.title("input imgage"),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(img_back,cmap='gray')
plt.title("Result"),plt.xticks([]),plt.yticks([])
plt.show()

只保留了边界高频信息,过滤低频信息

opencv之傅里叶变换相关推荐

  1. Python+OpenCV:傅里叶变换(Fourier Transform)

    Python+OpenCV:傅里叶变换(Fourier Transform) ############################################################# ...

  2. 《OpenCv视觉之眼》Python图像处理六 :Opencv图像傅里叶变换和傅里叶逆变换原理及实现

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  3. OpenCV快速傅里叶变换(FFT)用于图像和视讯流的模糊检测

    OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测 翻译自[OpenCV Fast Fourier Transform (FFT) for blur detection in images ...

  4. 利用python对图像进行傅里叶变换_python用opencv 图像傅里叶变换

    傅里叶变换 dft = cv.dft(np.float32(img),flags = cv.DFT_COMPLEX_OUTPUT) 傅里叶逆变换 img_back = cv.idft(f_ishift ...

  5. opencv离散傅里叶变换进行图像旋转校正

    前言 离散傅立叶变换的一个应用是决定图片中物体的几何方向.     观察这两张幅度图你会发现频域的主要内容(幅度图中的亮点)是和空间图像中物体的几何方向相关的. 通过这点我们可以计算旋转角度并修正偏差 ...

  6. OpenCV——图像傅里叶变换

    1.OpenCV傅里叶变换相关函数 首先我要说明的是,在使用OpenCV写代码做图像傅里叶变换的时候,并仅仅是调用dft函数做一个傅里叶变换这么简单的,而是先要对图像进行一些变换之后,才能得到正确的傅 ...

  7. opencv图像傅里叶变换

    傅里叶变换可以用来分析不同滤波器的频率特性. numpy中的傅里叶变换 numpy 中的FFT包可以实现快速傅里叶变换.np.fft.fft2()可以对信号进行频率转换. ""&q ...

  8. OPenCV:傅里叶变换、时域和频域、频谱和相位谱、傅里叶级数、离散傅里叶变换(DFT)、频域滤波、高通和低通滤波器、带通和带阻滤波器

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 快速了解傅立叶变换(播放PPT即能动态地显示gif图)    ...

  9. OpenCV 离散傅里叶变换

    离散傅里叶变换(DFT) 定义 离散傅里叶变换(Discrete Fourier Transform,缩写为DFT),是傅里叶变换在时域和频域上都呈离散的形式,将信号的时域采样变换为其DFT的频域采样 ...

最新文章

  1. 【模拟】【codeforces】451B Sort the Array
  2. linux c语言文件拷贝_linux - 远程拷贝文件之scp
  3. jenkins 增量发布插件_CI/CD工具:Jenkins还是GitLab CI/CD?
  4. 终极之战!TensorFlow与PyTorch谁最适合深度学习
  5. 大话ion系列(五)
  6. ASP.NET Core 单元测试:如何Mock Url.Page()
  7. 个人学习进度(第十六周)
  8. 要求两个给定正整数的最大公约数和最小公倍数。_最小公倍数的求法,最大公因数要你有什么用...
  9. 那些云中的负载均衡器——Azure、AWS和NetScaler
  10. vue实现页面权限显示_Vue 实现前端权限控制
  11. 2021年中国电热饭盒市场趋势报告、技术动态创新及2027年市场预测
  12. 网站页面黑白色效果实现技巧
  13. ubuntu远程访问sftp服务器_ubuntu 下搭建sftp服务器
  14. 企业微信小程序开发流程
  15. excel power Query
  16. jmp指令流程图怎么写_NS流程图是什么?规范实用的流程图工具
  17. Mysql-ERROR:1055错误修复
  18. 牛客多校第十场 Han Xin and His Troops(扩展中国剩余)
  19. PKUSC2019总结
  20. hadoop自定义机架实现-08

热门文章

  1. SQLite Expert一些功能中英文对照表和一些数据库相关概念
  2. laravel 模板
  3. angular+TS实现搜索关键字高亮
  4. POI实战——好久不见,导出Excel的方式你知道几种?
  5. 低代码跑出了独角兽,通用平台靠什么?
  6. 100句常用英语万能句子——【写作必备】
  7. [c++]——什么是类型萃取
  8. 论文引言中说明的事情
  9. 【前端】CSS中的相对定位,绝对定位和固定定位
  10. Qt找不到qt GUI Application