import cv2
import numpy as np
from matplotlib import pyplot as plt
# OpenCV实现傅里叶逆变换
img = cv2.imread('C:\\Users\\86186\\Desktop\\DIP_Photo\\Lenna_RGB.tif', 1)
# 傅里叶变换
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT) # 傅里叶变换库函数调用
dftshift = np.fft.fftshift(dft) # 将傅里叶频域从左上角移动到中间
res1 = 20 * np.log(cv2.magnitude(dftshift[:, :, 0], dftshift[:, :, 1])) # 双通道结果转换为0到255的范围用于图像显示
# 傅里叶逆变换
ishift = np.fft.ifftshift(dftshift) # 将频域从中间移动到左上角
iimg = cv2.idft(ishift) # 傅里叶逆变换库函数调用
res2 = cv2.magnitude(iimg[:, :, 0], iimg[:, :, 1]) # 双通道结果转换为0到255的范围
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
# 显示图像
plt.subplot(131), plt.imshow(img, 'gray'), plt.title('原图像'), plt.axis('off')
plt.subplot(132), plt.imshow(res1, 'gray'), plt.title('傅里叶变换'), plt.axis('off')
plt.subplot(133), plt.imshow(res2, 'gray'), plt.title('傅里叶逆变换'), plt.axis('off')
plt.show()
Traceback (most recent call last):
File "C:/Users/86186/PycharmProjects/pythonProject/test3.1.py", line 10, in <module>
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT) # 傅里叶变换库函数调用
cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-xeqjxthj\opencv\modules\core\src\dxt.cpp:3506: error: (-215:Assertion failed) type == CV_32FC1 || type == CV_32FC2 || type == CV_64FC1 || type == CV_64FC2 in function 'cv::dft'
这两个地方改就可以了:
#在img=...下面加一行,先对图像灰度化处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#改一行,将gray传入
dft = cv2.dft(np.float32(gray), flags=cv2.DFT_COMPLEX_OUTPUT) # 傅里叶变换库函数调用