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 相关文章推荐
Django在Win7下的安装及创建项目hello word简明教程
Jul 14 Python
python数据结构之图的实现方法
Jul 08 Python
python直接访问私有属性的简单方法
Jul 25 Python
python学习之面向对象【入门初级篇】
Jan 21 Python
python解决js文件utf-8编码乱码问题(推荐)
May 02 Python
python从list列表中选出一个数和其对应的坐标方法
Jul 20 Python
python使用sessions模拟登录淘宝的方式
Aug 16 Python
Python 日志logging模块用法简单示例
Oct 18 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
Oct 30 Python
在OpenCV里使用Camshift算法的实现
Nov 22 Python
Python读取JSON数据操作实例解析
May 18 Python
python操作ini类型配置文件的实例教程
Oct 30 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
Discuz7.2版的faq.php SQL注入漏洞分析
2014/08/06 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
2016/07/13 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
2017/03/16 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
javascript动态加载实现方法一
2012/08/22 Javascript
JS编程小常识很有用
2012/11/26 Javascript
js和jquery使按钮失效为不可用状态的方法
2014/01/26 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
2016/06/24 Javascript
在localStorage中存储对象数组并读取的方法
2016/09/24 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
2016/11/04 Javascript
Vue-router路由判断页面未登录跳转到登录页面的实例
2017/10/26 Javascript
vue-cli webpack 引入jquery的方法
2018/01/10 jQuery
vue-cli实现多页面多路由的示例代码
2018/01/30 Javascript
详解使用create-react-app快速构建React开发环境
2018/05/16 Javascript
jQuery实现表格的增、删、改操作示例
2019/01/27 jQuery
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
微信小程序实现加入购物车滑动轨迹
2020/11/18 Javascript
[40:12]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
17个Python小技巧分享
2015/01/23 Python
基于hashlib模块--加密(详解)
2017/06/21 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
python实现点击按钮修改数据的方法
2019/07/17 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
2019/10/30 Python
Python 使用 PyQt5 开发的关机小工具分享
2020/07/16 Python
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
美国时尚在线:Showpo
2017/09/08 全球购物
英国领先的互联网葡萄酒礼品商:Vintage Wine & Port
2019/05/24 全球购物
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
小学毕业感言50字
2014/02/16 职场文书
校园广播稿100字
2014/10/06 职场文书
涨价通知
2015/04/23 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
民政局2016年“六一”儿童节慰问活动总结
2016/04/06 职场文书
大学生自我鉴定怎么写
2019/05/07 职场文书
Python3 类型标注支持操作
2021/06/02 Python
css3应用示例:新增的选择器
2022/03/16 HTML / CSS