所以目前我正试图围绕傅里叶变换(2D)。我想对图像进行傅里叶变换,然后返回幅度谱,就像本网站上的这个主题一样:
https://dsp.stackexchange.com/questions/16995/image-reconstructionphase-vs-magnitude
然而,我的图像(使用spyder ide)就像这样,中间有一些奇怪的艺术家,使用上面链接中的相同图像。
我使用的代码是在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()
我做错了什么?
更新:添加了导入
答案 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')