哈哈哈,看清标题不是快速傅里叶变换(FFT)哟!
傅里叶变换公式:
傅里叶逆变换:
注意:公式中有个比例系数 1MN\frac{1}{MN}MN1,既可以放在正变换,也可以放在逆变换。本人在实验时发现,放在正变换时得到的对数频谱图像不清晰,读者可以自己试试。
import cv2
import numpy as np
import matplotlib.pyplot as plt
from numpy.fft import *
# 只需要 5 行代码就可以实现二维傅里叶变换哟!
# 记住:用 python 千万不要写 for 循环哟!
def shift_ft(img):
M, N = img.shape
shift = np.matrix([[pow(-1,i+j) for j in range(N)] for i in range(M)])
U = np.matrix([[np.exp(-1j*2*3.14159*m*i/M) for m in range(M)] for i in range(M)])
V = np.matrix([[np.exp(-1j*2*3.14159*n*j/N) for j in range(N)] for n in range(N)])
return U.dot(np.multiply(gray,shift)).dot(V)
def shift_ift(img):
M, N = gray.shape
shift = np.matrix([[pow(-1,i+j) for j in range(N)] for i in range(M)])
U = np.matrix([[np.exp(1j*2*3.14159*m*i/M) for m in range(M)] for i in range(M)])
V = np.matrix([[np.exp(1j*2*3.14159*n*j/N) for j in range(N)] for n in range(N)])
return np.multiply(shift,U.dot(img).dot(V))/M/N
img = cv2.imread("Lenna.png", cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.figure()
plt.subplot(2,2,1)
plt.imshow(gray, cmap='gray')
plt.title('lenna')
ft_data = shift_ft(gray)
ft_img = np.log(abs(ft_data)+1)
plt.subplot(2,2,2)
plt.title('my shift_ft')
plt.imshow(ft_img,cmap='gray')
ft_img2 = np.log(abs(fftshift(fft2(gray)))+1)
plt.subplot(2,2,3)
plt.title('fftshift(fft2(lenna))')
plt.imshow(ft_img2,cmap='gray')
ift_img = abs(shift_ift(ft_data))
plt.subplot(2,2,4)
plt.title('my shift_ift')
plt.imshow(ift_img,cmap='gray')
plt.show()
效果如下,和 numpy.fft 的效果一致