参考

Numpy 中的傅里叶变换

首先我们看看如何使用 Numpy 进行傅里叶变换。Numpy 中的 FFT 包可以帮助我们实现快速傅里叶变换。函数 np.fft.fft2() 可以对信号进行频率转换,输出结果是一个复杂的数组。本函数的第一个参数是输入图像,要求是灰度格式。第二个参数是可选的, 决定输出数组的大小。输出数组的大小和输入图像大小一样。如果输出结果比输入图像大,输入图像就需要在进行 FFT 前补0。如果输出结果比输入图像小的话,输入图像就会被切割。

频率为0 的部分(直流分量)在输出图像的左上角。(2D傅里叶变换F(x,y)的F(0,0)位置在图像的左上角,F(0,0)表示的是图像灰度的均值)如果想让它(直流分量)在输出图像的中心,我们还需要将结果沿两个方向平移 N/2 。函数 np.fft.fftshift() 可以帮助我们实现这一步。

# coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread("/home/wl/3.jpg", 0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
# 这里构建振幅图的公式没学过
magnitude_spectrum = 20*np.log(np.abs(fshift))#先取绝对值,表示取模。取对数,将数据范围变小
print magnitude_spectrum
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum , cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()

我们可以看到输出结果的中心部分更白(亮),这说明低频分量更多。现在我们可以进行频域变换了,我们就可以在频域对图像进行一些操作了,例如高通滤波和重建图像(DFT 的逆变换)。比如我们可以使用一个60x60 的矩形窗口对图像进行掩模操作从而去除低频分量。然后再使用函数np.fft.ifftshift() 进行逆平移操作,所以现在直流分量又回到左上角了,左后使用函数 np.ifft2() 进行 FFT 逆变换。同样又得到一堆复杂的数字,我们可以对他们取绝对值:

# coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread("/home/wl/3.jpg", 0)
f = np.fft.fft2(img)#得到结果为复数矩阵
fshift = np.fft.fftshift(f)#直接取中心
rows, cols = img.shape
crow,ccol = rows/2 , cols/2
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0#蒙板大小60×60
f_ishift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f_ishift)#使用FFT逆变换,此时结果仍然是复数
img_back = np.abs(img_back)# 取绝对值
plt.subplot(131),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(img_back, cmap = 'gray')
plt.title('Image after HPF'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(img_back)
plt.title('Result in JET'), plt.xticks([]), plt.yticks([])
plt.show()

上图的结果显示高通滤波其实是一种边界检测操作。这就是我们在前面图像梯度那一章看到的。同时我们还发现图像中的大部分数据集中在频谱图的低频区域。

OpenCV 中的傅里叶变换

OpenCV 中相应的函数是 cv2.dft() 和 cv2.idft()。和前面输出的结果一样,但是是双通道的。第一个通道是结果的实数部分,第二个通道是结果的虚数部分。输入图像要首先转换成 np.float32 格式。

# coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread("/home/wl/3.jpg", 0)
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))#频谱图
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()

使用函数 cv2.cartToPolar()会同时得到幅度和相位,此函数也是直角坐标转换为极坐标的函数。

现在我们来做逆 DFT。在前面的部分我们实现了一个 HPF(高通滤波),现在我们来做 LPF(低通滤波)将高频部分去除。其实就是对图像进行模糊操作。首先我们需要构建一个掩模,与低频区域对应的地方设置为 1, 与高频区域对应的地方设置为 0。

# coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread("/home/wl/3.jpg", 0)
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
rows, cols = img.shape
crow,ccol = rows/2 , cols/2
# create a mask first, center square is 1, remaining all zeros
mask = np.zeros((rows,cols,2),np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
# apply mask and inverse DFT
fshift = dft_shift*mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img_back, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()

注意:OpenCV 中的函数 cv2.dft() 和 cv2.idft() 要比 Numpy 快。但是Numpy 函数更加用户友好。

DFT 的性能优化

当数组的大小为某些值时 DFT 的性能会更好。当数组的大小是 2 的指数时 DFT 效率最高。当数组的大小是 2,3,5 的倍数时效率也会很高。所以如果你想提高代码的运行效率时,你可以修改输入图像的大小(补 0)。对于OpenCV 你必须自己手动补 0。但是 Numpy,你只需要指定 FFT 运算的大小,它会自动补 0。那我们怎样确定最佳大小呢?OpenCV 提供了一个函数:cv2.getOptimalDFTSize()。它可以同时被 cv2.dft() 和 np.fft.fft2() 使用。

# coding=utf-8
import cv2
import numpy as npimg = cv2.imread("/home/wl/3.jpg", 0)
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
rows, cols = img.shape
print rows,cols
nrows = cv2.getOptimalDFTSize(rows)
ncols = cv2.getOptimalDFTSize(cols)
print nrows,ncols
1420 946
1440 960

转载于:https://www.cnblogs.com/longwhite/p/10397743.html

Opencv笔记(二十一)——傅里叶变换相关推荐

  1. OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats()

    OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats() 1.connectedComponents() ...

  2. python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法

    python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0. zfill()方法语法: ...

  3. Mr.J-- jQuery学习笔记(二十一)--模拟微博页面

    先看之前的节点操作方法:Mr.J-- jQuery学习笔记(二十)--节点操作方法 Mr.J-- jQuery学习笔记(五)--属性及属性节点 Mr.J-- jQuery学习笔记(十一)--事件委托  ...

  4. opencv笔记(二)之opencv打开笔记本摄像头

    一.前言 楼主最近在使用opencv采集摄像头信息,一开始都不知道怎么去打开笔记本的摄像头的,于是有空做一个记录分享 至于win下怎么配置opencv可以参考楼主文章Opencv笔记(一)之vs201 ...

  5. 【Visual C++】游戏开发笔记二十一 游戏基础物理建模(三) 摩擦力系统模拟

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7555785 作者:毛星云    邮箱: h ...

  6. 数据科学和人工智能技术笔记 二十一、统计学

    二十一.统计学 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 贝塞尔校正 贝塞尔的校正是我们在样本方差和样本标准差的计算中使用 n−1n-1n−1 而不是 nnn 的 ...

  7. 【Visual C++】游戏开发笔记二十一 游戏基础物理建模 三 摩擦力系统模拟

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  8. opencv学习笔记二十一:使用HSV颜色空间实现颜色识别

    一.颜色空间介绍        RGB 颜色空间是大家最熟悉的颜色空间,即三基色空间,任何一种颜色都可以由该三种 颜色混合而成.然而一般对颜色空间的图像进行有效处理都是在 HSV 空间进行的,HSV( ...

  9. RV1126笔记二十一:车辆颜色识别

    若该文为原创文章,转载请注明原文出处. 一.介绍 在学习RV1126的过程中,测试了yolov5可以实现物体检测,物体目标识别等功能,Rock-X也自带了车牌识别功能,具体可以了解下正点原子的资料,里 ...

  10. 3 calender python_python3笔记二十一:时间操作datetime和calendar

    一:学习内容 datetime calendar 二:datetime 1.模块说明:可以理解为datetime基于time进行了封装,提供了各种使用的函数,datetime模块的接口更直接,更容易调 ...

最新文章

  1. 【php增删改查实例】第十七节 - 用户登录(1)
  2. 2021年春季学期-信号与系统-第四次作业参考答案-第十小题
  3. java变量初始化0.00
  4. ListView控件学习系列2-编辑ListView(Edit,Update,Insert,Delete)
  5. redhat6.下安装配置hadoop环境--单实例版本
  6. 五款好评如潮的手机APP分享 用起来绝对好用!
  7. 微信浏览器 返回按钮二次返回
  8. 僵尸进程和孤儿进程 转载
  9. 华为笔试题-磁盘容量排序
  10. java socket 读不到数据_Java Socket通信以及可能出现的问题解决
  11. 公测: 机智云自动生成app代码
  12. msvcr71.dll丢失的解决方法
  13. 博士申请 | 加拿大阿尔伯塔大学韩杰教授招收电子与计算机专业博士/博后
  14. 如何确认是文章发表在哪里?
  15. 点击图标分享页面到QQ,微信,微博 等
  16. TPLINK免驱版网卡插上后无法识别到CD驱动器怎么办?
  17. 我的学习笔记001--private protected public internal mxx
  18. Excel,world ,ppt文件图标显示异常解决办法 (2022最新)
  19. 深圳中学老师工资单曝光,秒杀程序员,网友:酸了酸了
  20. 阿里巴巴Java成神之路-笔记(8)动态代理

热门文章

  1. python安装及运行环境_Python 安装及环境搭建
  2. 感受野,以及为什么神经网络可以分清猫是猫,狗是狗的直观理解
  3. switchyomega规则列表备份_一键备份微博并导出生成PDF,顺便用Python分析微博账号数据...
  4. oracle表数据的导出到excel文件,文件怎么导出到excel表格数据库-如何导出oracle数据库中某张表到excel...
  5. c语言程序设计最后一题调试时闪退,visual studio 2017调试时闪退。
  6. pie函数--Matplotlib
  7. 专业Excel组件Spire.XLS 教程:在Excel中合并单元格
  8. 《BGP设计与实现》一2.10 案例研究:BGP内存的使用评估
  9. 博客园模板--博客园老牛大讲堂
  10. Samba 共享服务