python 傅立叶函数_python 图像的离散傅立叶变换实例
图片(M×N)的二维离散傅里叶变换是一种能将图片从空间域转换至频域的方法,在该区域中使用x和y变量来表示位置坐标,在该区域中的相应频率成分则由u和v变量标识出来。二维离散傅里叶变换的具体计算公式如后所示。

在Python编程环境中
当应用log函数时,应表述为1 + x而非直接采用x的形式来计算该函数值。为了避免在数值等于零的情况下进行无效的对数运算操作
为了使图像变换的效果更为准确,请将图像变换的原点设置为频域矩形中心位置,并对 fft2 的输出结果施以 fftshift 处理。此外,在观察结果时建议采用 log 操作以提高可视化的清晰度。
代码如下:
import numpy as np
import matplotlib.pyplot as plt
img = plt.imread('photo.jpg')
#根据公式转成灰度图
img = 0.2126 * img[:,:,0] + 0.7152 * img[:,:,1] + 0.0722 * img[:,:,2]
#显示原图
plt.subplot(231),plt.imshow(img,'gray'),plt.title('original')
#进行傅立叶变换,并显示结果
fft2 = np.fft.fft2(img)
plt.subplot(232),plt.imshow(np.abs(fft2),'gray'),plt.title('fft2')
#将图像变换的原点移动到频域矩形的中心,并显示效果
shift2center = np.fft.fftshift(fft2)
plt.subplot(233),plt.imshow(np.abs(shift2center),'gray'),plt.title('shift2center')
#对傅立叶变换的结果进行对数变换,并显示效果
log_fft2 = np.log(1 + np.abs(fft2))
plt.subplot(235),plt.imshow(log_fft2,'gray'),plt.title('log_fft2')
#对中心化后的结果进行对数变换,并显示结果
log_shift2center = np.log(1 + np.abs(shift2center))
plt.subplot(236),plt.imshow(log_shift2center,'gray'),plt.title('log_shift2center')
运行结果:


根据公式实现的二维离散傅立叶变换如下:
import numpy as np
import matplotlib.pyplot as plt
PI = 3.141591265
img = plt.imread('temp.jpg')
#根据公式转成灰度图
img = 0.2126 * img[:,:,0] + 0.7152 * img[:,:,1] + 0.0722 * img[:,:,2]
#显示原图
plt.subplot(131),plt.imshow(img,'gray'),plt.title('original')
#进行傅立叶变换,并显示结果
fft2 = np.fft.fft2(img)
log_fft2 = np.log(1 + np.abs(fft2))
plt.subplot(132),plt.imshow(log_fft2,'gray'),plt.title('log_fft2')
h , w = img.shape
#生成一个同样大小的复数矩阵
F = np.zeros([h,w],'complex128')
for u in range(h):
for v in range(w):
res = 0
for x in range(h):
for y in range(w):
res += img[x,y] * np.exp(-1.j * 2 * PI * (u * x / h + v * y / w))
F[u,v] = res
log_F = np.log(1 + np.abs(F))
plt.subplot(133),plt.imshow(log_F,'gray'),plt.title('log_F')
直接根据公式实现复杂度很高,因为是四重循环,时间复杂度为

,所以实际用的时候需要用快速傅立叶变换来实现
对于该Python图像的离散傅里叶变换实例而言,在此就是小编向大家提供了完整的相关内容。如果能为大家提供参考帮助的话,请大家能够给予更多的支持和鼓励。
本文标题: python 图像的离散傅立叶变换实例
