python 快速实现傅里叶变换

哈哈哈,看清标题不是快速傅里叶变换(FFT)哟!

傅里叶变换公式:
在这里插入图片描述
傅里叶逆变换:
python 快速实现傅里叶变换_第1张图片
注意:公式中有个比例系数 1 M N \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 的效果一致

你可能感兴趣的:(#,编程语言,#,图像处理与计算机视觉)