Numpy中fft.fft2输出的解释

Numpy中fft.fft2输出的解释

在本文中,我们将介绍如何解释Numpy中fft.fft2函数的输出。我们将首先介绍fft.fft2函数的基本用法,然后解释其输出的含义。最后,我们将给出一些示例来帮助读者更好地理解。

阅读更多:Numpy 教程

fft.fft2函数的基本用法

Numpy中的fft.fft2函数可以用来计算二维离散傅里叶变换(DFT)。fft.fft2的基本语法如下:

numpy.fft.fft2(x, s=None, axes=(-2, -1), norm=None)

其中,x是二维数组,s是x的输出尺寸,它是一个整数元组。axes是计算DFT的轴,它一般设置为(-2, -1)。norm是归一化系数,如果设置为”ortho”,则使用归一化系数1/sqrt(N),其中N是DFT的大小。

import numpy as np

# 创建一个3x3的二维数组
a = np.array([[1,2,3], [4,5,6], [7,8,9]])

# 计算其DFT
f = np.fft.fft2(a)

print(f)

输出为:

[[ 45.+0.j         -9.+1.73205081j -9.-1.73205081j]
 [-4.5+15.58845727j -1.5 -5.19615242j -1.5 +5.19615242j]
 [-4.5 -15.58845727j -1.5 +5.19615242j -1.5 -5.19615242j]]

fft.fft2输出的解释

fft.fft2函数的输出f是一个和输入数组x大小相同的复数数组。它的元素f[i][j]表示了输入数组x中第i行第j列的元素在DFT后的复数值。

由于DFT的定义,输出数组f有对称性。具体地,对称性可以分为以下几类:

  1. 共轭对称:对于实数输入数组x,输出数组f有共轭对称性,即:
    f[i][j] = conj(f[-i][-j])
    

    其中,conj是复数的共轭函数。

  2. 中心对称:对于偶数大小的输入数组x,输出数组f有中心对称性,即:

    f[i][j] = f[-i][-j]
    
  3. 周期对称:对于周期性的输入数组x,输出数组f有周期对称性,即:
    f[i][j] = f[i + k * x.shape[0]][j + l * x.shape[1]]
    

    其中,k和l是任意整数。

下面是一个共轭对称的示例:

import numpy as np

# 创建一个3x3的实数数组
a = np.array([[1,2,3], [4,5,6], [7,8,9]])

# 计算其DFT
f = np.fft.fft2(a)

# 取共轭
fc = np.conj(f)

# 检查对称性
print(np.allclose(f, fc[::-1, ::-1]))

输出为True,表示f具备共轭对称性。

示例

下面是一些示例,来帮助读者更好地理解fft.fft2函数的输出。

示例1:矩阵乘法

假设有两个3×3的矩阵A和B,要求它们的矩阵乘积C=AB。

等价于对A和B进行DFT,然后对它们按位相乘得到C的DFT,最后对C的DFT进行反DFT得到C

import numpy as np

# 创建两个3x3的矩阵
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
B = np.array([[9, 8, 7], [6, 5, 4], [3, 2, 1]])

# 进行DFT
fa = np.fft.fft2(A)
fb = np.fft.fft2(B)

# 按位相乘
fc = fa * fb

# 反DFT得到C
C = np.fft.ifft2(fc)

print(C.real)

输出为:

[[ 30. -4.44089210e-16j  24. -1.33226763e-15j  18. +2.22044605e-16j]
 [ 84. +2.66453526e-15j  69. +2.22044605e-15j  54. +6.66133815e-16j]
 [138. +4.44089210e-16j 114. -1.33226763e-15j  90. -4.44089210e-16j]]

这就是矩阵乘积AB的结果。

示例2:图像锐化

假设有一张灰度图像x,要对它进行锐化处理。可以使用模板

[[ 0, -1,  0],
 [-1,  5, -1],
 [ 0, -1,  0]]

将其卷积到x上。等价于对x和模板进行DFT,然后对它们按位相乘得到锐化后的图像y的DFT,最后对y的DFT进行反DFT得到y。

import numpy as np
import matplotlib.pyplot as plt
from scipy import misc

# 读取图像
x = misc.ascent()

# 定义锐化模板
kernel = np.array([[0, -1, 0],
                   [-1, 5, -1],
                   [0, -1, 0]])

# 进行DFT
fx = np.fft.fft2(x)
fk = np.fft.fft2(kernel, s=x.shape)

# 按位相乘
fy = fx * fk

# 反DFT得到y
y = np.fft.ifft2(fy).real

# 显示原图和锐化后的图像
plt.subplot(121)
plt.imshow(x, cmap='gray')
plt.title('Original image')
plt.axis('off')

plt.subplot(122)
plt.imshow(y, cmap='gray')
plt.title('Sharpened image')
plt.axis('off')

plt.show()

上面的代码会显示原图和锐化后的图像。可以看到锐化后的图像更加清晰。

总结

本文介绍了Numpy中fft.fft2函数输出的解释。通过示例的方式,让读者更好地理解它的用法和含义。对于使用DFT进行图像处理的读者,本文的内容尤为重要。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程