opencv 傅里叶变换(python)

傅里叶变换

图像处理一般分为空间域处理和频率域处理。

空间域处理是直接对图像内的像素进行处理。

空间域处理主要划分为灰度变换和空间滤波两种形式。

  • 灰度变换是对图像内的单个像素进行处理,比如调节对比度和处理阈值等。
  • 空间滤波涉及图像质量的改变,例如图像平滑处理。空间域处理的计算简单方便,运算速度更快。

频率域处理是先将图像变换到频率域,然后在频率域对图像进行处理,最后再通过反变换将图像从频率域变换到空间域。

理论基础

时间差,在傅里叶变换里就是相位。相位表述的是与时间差相关的信息。

在图像处理过程中,傅里叶变换就是将图像分解为正弦分量和余弦分量两部分,即将图像从空间域转换到频域。

数字图像经过傅里叶变换后,得到的频域值是复数。因此,显示傅里叶变换的结果需要使用实数图像(real image)加虚数图像(complex image),或者幅度图像(magnitude image)加相位图像(phase image)的形式。

因为幅度图像包含了原图像中我们所需要的大部分信息,所以在图像处理过程中,通常仅使用幅度图像。

如果希望先在频域内对图像进行处理,再通过逆傅里叶变换得到修改后的空域图像,就必须同时保留幅度图像和相位图像。

对图像进行傅里叶变换后,会得到图像中的低频和高频信息。

低频信息对应图像内变化缓慢的灰度分量。高频信息对应图像内变化越来越快的灰度分量,是由灰度的尖锐过渡造成的。

傅里叶变换的目的,就是为了将图像从空域转换到频域,并在频域内实现对图像内特定对象的处理,然后再对经过处理的频域图像进行逆傅里叶变换得到空域图像。

傅里叶变换在图像处理领域发挥着非常关键的作用,可以实现图像增强、图像去噪、边缘检测、特征提取、图像压缩和加密等。

Numpy实现傅里叶变换

Numpy模块中的fft2()函数可以实现图像的傅里叶变换。

实现傅里叶变换

Numpy提供的实现傅里叶变换的函数是numpy.fft.fft2(),它的语法格式是:

返回值 = numpy.fft.fft2(原始图像)

参数“原始图像”的类型是灰度图像,函数的返回值是一个复数数组(complex ndarray)。

经过该函数的处理,就能得到图像的频谱信息。

此时,图像频谱中的零频率分量位于频谱图像(频域图像)的左上角

image-20220604151713378

为了便于观察,通常会使用numpy.fft.fftshift()函数将零频率成分移动到频域图像的中心位置。

函数numpy.fft.fftshift()的语法格式是:

返回值=numpy.fft.fftshift(原始频谱) 

使用该函数处理后,图像频谱中的零频率分量会被移到频域图像的中心位置,对于观察傅里叶变换后频谱中的零频率部分非常有效。

对图像进行傅里叶变换后,得到的是一个复数数组。

为了显示为图像,需要将它们的值调整到[0, 255]的灰度空间内,使用的公式为:

像素新值=20*np.log(np.abs(频谱值))

用Numpy实现傅里叶变换,观察得到的频谱图像。

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

img = cv2.imread('./img/hand1.png',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('original') 
plt.axis('off') 
plt.subplot(122) 
plt.imshow(magnitude_spectrum, cmap = 'gray') 
plt.title('result') 
plt.axis('off') 
plt.show() 

image-20220604152158301

实现逆傅里叶变换

注意: 如果在傅里叶变换过程中使用了numpy.fft.fftshift()函数移动零频率分量,那么在逆傅里叶变换过程中,需要先使用numpy.fft.ifftshift()函数将零频率分量移到原来的位置,再进行逆傅里叶变换

函数numpy.fft.ifftshift()是numpy.fft.fftshift()的逆函数,其语法格式为:

调整后的频谱 = numpy.fft.ifftshift(原始频谱)

numpy.fft.ifft2()函数可以实现逆傅里叶变换,返回空域复数数组。

它是numpy.fft.fft2()的逆函数,该函数的语法格式为:

返回值=numpy.fft.ifft2(频域数据)

函数numpy.fft.ifft2()的返回值仍旧是一个复数数组(complex ndarray)。

逆傅里叶变换得到的空域信息是一个复数数组,需要将该信息调整至[0, 255]灰度空间内,使用的公式为:

iimg = np.abs(逆傅里叶变换结果)

在Numpy内实现傅里叶变换、逆傅里叶变换,观察逆傅里叶变换的结果图像。

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

img = cv2.imread('./img/hand1.png',0) 
f = np.fft.fft2(
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴风雨中的白杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值