opencv-傅里叶变换

cv2.dft()cv2.idft() 是 OpenCV 中用于进行离散傅里叶变换(DFT)和逆离散傅里叶变换(IDFT)的函数。这些函数用于将图像从空间域转换到频率域以及从频率域转换回空间域。

cv2.dft()

dst = cv2.dft(src, flags=None, nonzeroRows=None)
  • src: 输入数组,可以是灰度图像或浮点型矩阵。
  • flags: 操作标志,可以是 cv2.DFT_COMPLEX_OUTPUT 表示输出结果为复数。
  • nonzeroRows: 可选参数,通常为 None

cv2.dft() 函数将输入数组进行离散傅里叶变换。

import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取灰度图像
img = cv2.imread(r"C:\Users\mzd\Desktop\opencv\2.jpg", cv2.IMREAD_GRAYSCALE)

# 进行二维离散傅里叶变换
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.figure(figsize=(12, 6))

plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])

plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])

plt.show()

在这里插入图片描述

cv2.idft()

dst = cv2.idft(src, flags=None, nonzeroRows=None)
  • src: 输入数组,可以是复数数组,通常为 cv2.dft() 的输出结果。
  • flags: 操作标志,可以是 cv2.DFT_SCALE 表示进行逆变换时对结果进行缩放。
  • nonzeroRows: 可选参数,通常为 None

cv2.idft() 函数将输入数组进行逆离散傅里叶变换,将频率域的结果转换回空间域。

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

# 生成一个简单的图像
img = np.zeros((100, 100), dtype=np.uint8)
img[30:70, 30:70] = 255

# 进行二维离散傅里叶变换
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)

# 将低频部分移到图像中心
dft_shift = np.fft.fftshift(dft)

# 进行逆离散傅里叶变换
idft = cv2.idft(dft_shift)

# 取逆变换的实部
result_img = cv2.magnitude(idft[:, :, 0], idft[:, :, 1]).astype(np.uint8)

# 显示原始图像、傅里叶变换后的频率域和逆变换结果
plt.figure(figsize=(12, 6))

plt.subplot(131), plt.imshow(img, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])

plt.subplot(132), plt.imshow(np.log(1 + cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1])), cmap='gray')
plt.title('Magnitude Spectrum (Log)'), plt.xticks([]), plt.yticks([])

plt.subplot(133), plt.imshow(result_img, cmap='gray')
plt.title('IDFT Result'), plt.xticks([]), plt.yticks([])

plt.show()

在这里插入图片描述

在这个示例中,我们首先生成一个简单的图像,然后进行二维离散傅里叶变换。接着,通过逆离散傅里叶变换将频率域的结果转换回时域,最后绘制了原始图像、傅里叶变换后的频率域(以对数尺度表示)和逆变换的结果。逆离散傅里叶变换通常用于还原由傅里叶变换得到的频率域表示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI自修室

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

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

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

打赏作者

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

抵扣说明:

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

余额充值