傅立叶变换 2D 工件 - 我做错了什么?

Fourier Transform 2D artifact - what am I doing wrong?

所以目前我正在努力研究傅里叶变换(二维)。我想对图像进行傅里叶变换,然后 return 仅返回幅度谱,就像本网站上的这个主题一样:

https://dsp.stackexchange.com/questions/16995/image-reconstructionphase-vs-magnitude

但是我的图像(使用 spyder ide)是这样的,中间有一些奇怪的技师,使用上面 link 中的相同图像。

original image

Magnitude spectrum

我使用的代码是 python 使用 numpy (np)、opencv2 和 matplotlib:

import numpy as np
import cv2
from matplotlib import pyplot as plt
from os import listdir
from os.path import isfile, join


image1 = cv2.imread("Images/test2.png", 0)
fourier = np.fft.fft2(image1)
magnitude = abs(fourier)
inverse = np.fft.ifftshift(np.fft.ifft2(magnitude))
plt.subplot(), plt.imshow(np.uint8(inverse), cmap='gray')
plt.title(''), plt.xticks([]), plt.yticks([])
plt.show()

我做错了什么?

更新:添加了导入

您可以尝试将 np.uint8 更改为 np.abs。既然你想要超过 255 而不是模数,你应该做这样的事情:

inverse = np.fft.ifftshift(np.fft.ifft2(magnitude))
inv = np.abs(inverse)
inv[inv > 255] = 255
plt.subplot(), plt.imshow(inv, cmap='gray')

情节中间的奇怪之处在于包裹了大值(转换为 uint8 需要模数)。不施法时,你只能看到中间有一个白点。通常(对于自然图像),DFT 在原点具有非常高的幅度,随着频率的增加幅度呈指数下降。

显示 DFT 的最佳方式是对幅度应用对数变换:

inverse = np.fft.ifftshift(np.fft.ifft2(magnitude))
inverse = np.log(np.abs(inverse))
plt.subplot(), plt.imshow(inverse, cmap='gray')