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