傅立叶变换2D神器 - 我做错了什么?

时间:2018-02-19 12:05:15

标签: python numpy fft cv2

所以目前我正试图围绕傅里叶变换(2D)。我想对图像进行傅里叶变换,然后返回幅度谱,就像本网站上的这个主题一样:

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

然而,我的图像(使用spyder ide)就像这样,中间有一些奇怪的艺术家,使用上面链接中的相同图像。

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()

我做错了什么?

更新:添加了导入

2 个答案:

答案 0 :(得分:1)

您可以尝试将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')

答案 1 :(得分:1)

在你的情节中间的奇怪的事情是包裹大值(转换为uint8取模数)。不投射时,您会看到中间只有一个白点。通常(对于自然图像),DFT在原点具有非常高的幅度,对于较高频率,幅度会呈指数级减小。

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

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