python中图像处理中的2D DFT

信息处理 fft 傅里叶变换 Python 自由度
2022-02-18 01:20:59

我尝试使用以下公式在灰度图像中计算 2D DFT:

在此处输入图像描述

我用python写了下面的代码

def DFT2D(image):
    data = np.asarray(image)
    M, N = image.size # (img x, img y)
    dft2d = np.zeros((M,N))
    for k in range(M):
        for l in range(N):
            sum_matrix = 0.0
            for m in range(M):
                for n in range(N):
                    e = cmath.exp(- 2j * np.pi * ((k * m) / M + (l * n) / N))
                    sum_matrix +=  data[m,n] * e
            dft2d[k,l] = sum_matrix
    return dft2d

我认为我有一些问题,因为我没有得到预期的结果。我得到下面的图像:

在此处输入图像描述

我不知道我的代码中的问题在哪里!


我不想使用内置函数,我认为这应该可行,但可能存在一些数学问题。当我得到一个结果矩阵并将其转换为图像时,它与预期的 DFT 图像不同

1个回答

所以我认为它主要是错过了这条线

    dft2d = np.zeros((M,N),dtype=complex)

在你的代码中。否则,您的总和可能最终不会变得复杂。

然后你就不能绘制结果图像了……因为这需要实值。

我修改了您的代码,使其可以正常工作(但速度慢)。见下文。这会产生更像您期望的结果 --- 尽管由于索引,峰值位于左上角而不是中间。可能有一些类似于 Matlab 的fftshift函数可以为您居中。

在此处输入图像描述


下面更新了代码

import numpy as np
import matplotlib.pyplot as plt
import PIL
import cmath

def DFT2D(image):
    data = np.asarray(image)
    M, N = image.size # (img x, img y)
    dft2d = np.zeros((M,N),dtype=complex)
    for k in range(M):
        for l in range(N):
            sum_matrix = 0.0
            for m in range(M):
                for n in range(N):
                    e = cmath.exp(- 2j * np.pi * ((k * m) / M + (l * n) / N))
                    sum_matrix +=  data[m,n,1] * e
            dft2d[k,l] = sum_matrix
    return dft2d

img = PIL.Image.open("example.jpg")
img2 = img.resize((50,50))
plt.imshow(img2)
dft = DFT2D(img2)
plt.imshow(dft.real)