python 快速实现傅里叶变换

本文通过五行Python代码实现二维傅里叶变换,对比numpy.fft库,验证了自定义函数的正确性和效率,适用于图像处理和模式识别等领域。

哈哈哈,看清标题不是快速傅里叶变换(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 的效果一致
lenna 和 她的频谱

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

颹蕭蕭

白嫖?

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

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

打赏作者

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

抵扣说明:

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

余额充值