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实现学生管理系统
Jan 11 Python
Python2中文处理纪要的实现方法
Mar 10 Python
浅谈python中真正关闭socket的方法
Dec 18 Python
对python中if语句的真假判断实例详解
Feb 18 Python
Python matplotlib生成图片背景透明的示例代码
Aug 30 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
Sep 18 Python
python实现代码统计器
Sep 19 Python
PYTHON如何读取和写入EXCEL里面的数据
Oct 28 Python
python列表生成器迭代器实例解析
Dec 19 Python
django 外键创建注意事项说明
May 20 Python
Python timeit模块原理及使用方法
Oct 10 Python
python 获取域名到期时间的方法步骤
Feb 10 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遍历CSV类实例
2015/04/14 PHP
php给图片加文字水印
2015/07/31 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
2015/09/30 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
javascript之通用简单的table选项卡实现(二)
2010/05/09 Javascript
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
如何使用Jquery获取Form表单中被选中的radio值
2013/08/09 Javascript
Javascript技术栈中的四种依赖注入小结
2016/02/27 Javascript
jQuery实现淡入淡出的模态框
2017/02/09 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
详解webpack介绍&安装&常用命令
2017/06/29 Javascript
Express使用html模板的详细代码
2017/09/18 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
uploadify插件实现多个图片上传并预览
2019/09/30 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
2019/10/16 jQuery
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
Python中关于字符串对象的一些基础知识
2015/04/08 Python
python3实现读取chrome浏览器cookie
2016/06/19 Python
元组列表字典(莫烦python基础)
2019/04/03 Python
Python Web框架之Django框架Model基础详解
2019/08/16 Python
Python模块/包/库安装的六种方法及区别
2020/02/24 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
Moss Bros官网:英国排名第一的西装店
2020/02/26 全球购物
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
应届生求职简历的自我评价怎么写
2013/10/23 职场文书
教师自荐信范文
2013/12/09 职场文书
销售总监岗位职责
2014/01/04 职场文书
图书室管理制度
2014/01/19 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
学习党的群众路线剖析材料
2014/10/09 职场文书
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
2021/06/09 Python
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS
面试被问select......for update会锁表还是锁行
2021/11/11 MySQL
企业版Windows 11有哪些新功能? Win11适用于企业的功能介绍
2021/11/21 数码科技
关于k8s环境部署mysql主从的问题
2022/03/13 MySQL
ConditionalOnProperty配置swagger不生效问题及解决
2022/06/14 Java/Android