傅里叶变换(opencv_python学习)

Numpy中的傅里叶变换

在NumPy中,可以使用numpy.fft模块进行傅里叶变换(Fourier Transform)的计算。傅里叶变换是一种将信号从时域转换到频域的数学变换,可以帮助我们分析信号的频谱特性。

下面是几个常用的傅里叶变换函数:

  • numpy.fft.fft():计算一维输入序列的快速傅里叶变换(FFT)。返回输出数组,其中包含了输入信号的频域表示。

  • numpy.fft.ifft():计算一维输入序列的逆傅里叶变换(IFFT)。返回输出数组,其中包含了频域输入信号的时域表示。

  • numpy.fft.fft2():计算二维输入数组的二维快速傅里叶变换(2D FFT)。返回输出数组,其中包含了输入信号的频域表示。

  • numpy.fft.ifft2():计算二维输入数组的二维逆傅里叶变换(2D IFFT)。返回输出数组,其中包含了频域输入信号的时域表示。

这些函数还有一些可选的参数,例如指定变换的长度、变换的轴、以及是否进行归一化等。

import numpy as np
import cv2 as cv

# 读取图像
img = cv.imread('pic1.jpg', 0)

# 获取图像尺寸
rows, cols = img.shape

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

# 显示结果
cv.imwrite('pic.jpg', magnitude_spectrum)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
恢复原图像(灰度图)

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

在这里插入图片描述

opencv中的傅里叶变换

在OpenCV中,cv.dft()函数和cv.idft()函数返回的结果都是与输入图像具有相同大小和类型的复数数组。

  • 在进行傅里叶变换之前,需要将输入图像转换为np.float32类型。
  • 注意 通常,OpenCV函数cv.dft()和cv.idft()比Numpy函数更快。但是Numpy函数更容易使用。
# 将图像转换为 np.float32 类型
image_float32 = np.float32(image)

# 执行傅里叶变换
dft = cv.dft(image_float32, flags=cv.DFT_COMPLEX_OUTPUT)

# 执行逆傅里叶变换
idft = cv.idft(dft, flags=cv.DFT_SCALE | cv.DFT_REAL_OUTPUT)

# 取幅度谱
magnitude_spectrum = 20 * np.log(cv.magnitude(dft[:, :, 0], dft[:, :, 1]))

dft_shift = np.fft.fftshift(dft)这行代码对傅里叶变换结果进行了移动操作,将低频分量移到频谱的中心。np.fft.fftshift() 函数用于实现这个操作。傅里叶变换结果 dft 被传递给 np.fft.fftshift() 函数,返回移动后的结果 dft_shift。
逆变换时要平移回去,使用f_ishift = np.fft.ifftshift(fshift)

优化性能

cv.getOptimalDFTSize()是OpenCV中用于获取最优傅里叶变换大小的函数。在进行傅里叶变换之前,通常会将输入图像的大小扩充到最接近的2的幂次方。这是为了获得更高的计算效率和更好的性能。

使用cv.getOptimalDFTSize()函数可以找到最接近给定尺寸的2的幂次方。它接受一个整数作为输入,并返回最接近该整数的2的幂次方。

代码示例:

# 读取图像
image = cv.imread('image.jpg', 0)

# 获取最优傅里叶变换大小
dft_size = cv.getOptimalDFTSize(image.shape[0])

# 将图像尺寸调整到最优大小
padded_image = cv.copyMakeBorder(image, 0, dft_size - image.shape[0], 0, dft_size - image.shape[1], cv.BORDER_CONSTANT)

# 执行傅里叶变换
dft = cv.dft(np.float32(padded_image), flags=cv.DFT_COMPLEX_OUTPUT)

# ... 进行其他操作 ...

在上面的示例中,我们首先读取图像,并使用cv.getOptimalDFTSize()获取最优傅里叶变换大小。然后,我们使用cv.copyMakeBorder()函数将图像的尺寸调整为最优大小。接下来,我们执行傅里叶变换,并继续进行其他操作。

通过使用cv.getOptimalDFTSize()函数,我们可以确保输入图像的尺寸符合傅里叶变换的要求,从而获得更好的计算性能和结果质量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值