opencv python 傅里叶变换的使用


Posted in Python onJuly 21, 2018

理论

傅立叶变换用于分析各种滤波器的频率特性,对于图像,2D离散傅里叶变换(DFT)用于找到频域.快速傅里叶变换(FFT)的快速算法用于计算DFT.

于一个正弦信号,x(t)=Asin(2πft),我们可以说 f 是信号的频率,如果它的频率域被接受,我们可以看到 f 的峰值.如果信号被采样来形成一个离散信号,我们得到相同的频率域,但是在[−π,π] or [0,2π]范围内是周期性的 (or [0,N] for N-point DFT).

可以将图像视为在两个方向上采样的信号.因此,在X和Y方向上进行傅里叶变换可以得到图像的频率表示.

更直观的是,对于正弦信号,如果振幅在短时间内变化得非常快,你可以说它是一个高频信号.如果它变化缓慢,它是一个低频信号,可以把同样的想法扩展到图片上,边和噪声是图像中的高频内容,如果振幅没有很大的变化,那就是低频分量.

Numpy中的傅里叶变换

np.fft.fft2()

第一个参数是输入图像,它是灰度图像

第二个参数是可选的,它决定了输出数组的大小,如果它大于输入图像的大小,则输入图像在计算FFT之前填充了0.如果它小于输入图像,输入图像将被裁剪,如果没有参数传递,输出数组的大小将与输入相同.

一旦得到结果,零频率分量(DC分量)将位于左上角。 如果要将其置于中心位置,则需要在两个方向上将结果移动N2.np.fft.fftshift(),一旦你找到频率变换,你就能找到大小谱.

代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('img.jpg',0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20*np.log(np.abs(fshift))

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()

opencv python 傅里叶变换的使用

可以在中心看到更多的白色区域,表示低频率的内容更多.

现在可以在频域做一些运算,比如高通滤波和重建图像也就是找到逆DFT,只需用一个矩形窗口大小的60x60来移除低频部分,使用np.fft.ifftshift()应用反向移动,使DC组件再次出现在左上角,然后使用np.ifft2()函数找到反FFT,结果将会是一个复数,可以取它的绝对值.

代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('img.jpg',0)

f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20*np.log(np.abs(fshift))

rows, cols = img.shape
crow,ccol = int(rows/2) , int(cols/2)
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0
f_ishift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back)


plt.subplot(221),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(222),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(223),plt.imshow(img_back)
plt.title('Result in JET'), plt.xticks([]), plt.yticks([])
plt.subplot(224),plt.imshow(img_back, cmap = 'gray')
plt.title('Image after HPF'), plt.xticks([]), plt.yticks([])
plt.show()

opencv python 傅里叶变换的使用

结果表明,高通滤波是一种边缘检测操作.

OpenCV中的傅里叶变换

OpenCV提供了cv.dft()cv.idft()函数.它返回与前面相同的结果,但是有两个通道.第一个通道将会有结果的实部,第二个通道将会有一个虚部.

输入图像首先应该转换为np.float32

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('img.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()

opencv python 傅里叶变换的使用

也可以使用cv.cartToPolar(),它可以在一次拍摄中同时返回大小和相位.

现在我们要做的是逆DFT.这次我们将移除图像中的高频内容,即我们将LPF应用到图像中.它实际上模糊了图像.为此,我们先创建一个具有高值(1)低频率的掩模,即我们通过低频内容,而在高频区域则是0。

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('img.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 = int(rows/2) , int(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 python 傅里叶变换的使用

NOTE:

OpenCV函数cv.dft()cv.idft()比Numpy函数更快.但是Numpy功能更加用户友好.

Fourier Transform

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
闭包在python中的应用之translate和maketrans用法详解
Aug 27 Python
python实现简单ftp客户端的方法
Jun 28 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
tensorflow实现逻辑回归模型
Sep 08 Python
Flask框架web开发之零基础入门
Dec 10 Python
Python进阶:生成器 懒人版本的迭代器详解
Jun 29 Python
python读取.mat文件的数据及实例代码
Jul 12 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
Dec 05 Python
python基于TCP实现的文件下载器功能案例
Dec 10 Python
Python通过zookeeper实现分布式服务代码解析
Jul 22 Python
linux mint中搜狗输入法导致pycharm卡死的问题
Oct 28 Python
Python os和os.path模块详情
Apr 02 Python
Numpy中的mask的使用
Jul 21 #Python
Flask框架使用DBUtils模块连接数据库操作示例
Jul 20 #Python
Flask框架WTForm表单用法示例
Jul 20 #Python
Python使用pymongo模块操作MongoDB的方法示例
Jul 20 #Python
Python闭包函数定义与用法分析
Jul 20 #Python
Django rest framework工具包简单用法示例
Jul 20 #Python
Django 中使用流响应处理视频的方法
Jul 20 #Python
You might like
PHP中mb_convert_encoding与iconv函数的深入解析
2013/06/21 PHP
php 常用算法和时间复杂度
2013/07/01 PHP
php中fsockopen用法实例
2015/01/05 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
2016/01/27 PHP
javascript eval和JSON之间的联系
2009/12/31 Javascript
Extjs学习笔记之二 初识Extjs之Form
2010/01/07 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
2015/02/24 Javascript
JS模式之简单的订阅者和发布者模式完整实例
2015/06/30 Javascript
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
Javascript 实现简单计算器实例代码
2016/10/23 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
2017/07/21 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
jQuery实现手机号正则验证输入及自动填充空格功能
2018/01/02 jQuery
Node.js实现注册邮箱激活功能的方法示例
2018/03/23 Javascript
JS实现快递单打印功能【推荐】
2018/06/21 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
Layui事件监听的实现(表单和数据表格)
2019/10/17 Javascript
node省市区三级数据性能测评实例分析
2019/11/06 Javascript
JavaScript canvas绘制渐变颜色的矩形
2020/02/18 Javascript
python列表与元组详解实例
2013/11/01 Python
python选择排序算法的实现代码
2013/11/21 Python
python中enumerate函数遍历元素用法分析
2016/03/11 Python
python方向键控制上下左右代码
2018/01/20 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
2018/12/15 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
Django 大文件下载实现过程解析
2019/08/01 Python
python安装scipy的步骤解析
2019/09/28 Python
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
人事专员岗位职责
2013/11/20 职场文书
干部作风整顿个人剖析材料
2014/10/06 职场文书
2014年环保工作总结
2014/11/26 职场文书
结婚堵门保证书
2015/05/08 职场文书
2016年“6.26”禁毒宣传月系列活动总结
2016/04/05 职场文书
Python使用PyYAML库读写yaml文件的方法
2022/04/06 Python