傅立叶变换 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')
所以目前我正在努力研究傅里叶变换(二维)。我想对图像进行傅里叶变换,然后 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')