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简单删除列表中相同元素的方法示例
Jun 12 Python
Python调用ctypes使用C函数printf的方法
Aug 23 Python
Python标准库笔记struct模块的使用
Feb 22 Python
python利用smtplib实现QQ邮箱发送邮件
May 20 Python
python+selenium实现自动抢票功能实例代码
Nov 23 Python
使用Python+wxpy 找出微信里把你删除的好友实例
Feb 21 Python
python3使用GUI统计代码量
Sep 18 Python
pycharm部署、配置anaconda环境的教程
Mar 24 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
Mar 26 Python
解决django框架model中外键不落实到数据库问题
May 20 Python
python基于pygame实现飞机大作战小游戏
Nov 19 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
Dec 16 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 class类的用法详细总结
2013/10/17 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
浅谈Node.js中的定时器
2015/06/18 Javascript
详谈javascript精度问题与调整
2017/07/08 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
2017/09/14 Javascript
js实现多个倒计时并行 js拼团倒计时
2019/02/25 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
基于Vue.js与WordPress Rest API构建单页应用详解
2019/09/16 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
Vue实现简单计算器
2021/01/20 Vue.js
Python升级提示Tkinter模块找不到的解决方法
2014/08/22 Python
python使用wmi模块获取windows下硬盘信息的方法
2015/05/15 Python
举例详解Python中yield生成器的用法
2015/08/05 Python
Python中格式化format()方法详解
2017/04/01 Python
python基础之包的导入和__init__.py的介绍
2018/01/08 Python
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
numpy concatenate数组拼接方法示例介绍
2019/05/27 Python
Python之——生成动态路由轨迹图的实例
2019/11/22 Python
解决Python图形界面中设置尺寸的问题
2020/03/05 Python
Python内存泄漏和内存溢出的解决方案
2020/09/26 Python
CSS3教程:background-clip和background-origin
2008/10/17 HTML / CSS
CSS3 清除浮动的方法示例
2018/06/01 HTML / CSS
Oroton中国官网:澳洲知名奢侈配饰品牌
2017/03/26 全球购物
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
Opodo英国旅游网站:预订廉价航班、酒店和汽车租赁
2018/07/14 全球购物
澳大利亚第一旅行车和房车配件店:Caravan RV Camping
2020/12/26 全球购物
EJB的几种类型
2012/08/15 面试题
大学生找工作推荐信范文
2013/11/28 职场文书
建材业务员岗位职责
2013/12/08 职场文书
机关门卫制度
2014/02/01 职场文书
大专生毕业的自我评价
2014/02/06 职场文书
文明餐桌行动实施方案
2014/02/19 职场文书
影视广告专业求职信
2014/09/02 职场文书
领导班子四风问题个人对照检查材料
2014/10/04 职场文书
2015年财务部年度工作总结
2015/05/19 职场文书