Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 傅里叶变换二维伪影-我做错了什么?_Python_Numpy_Fft_Cv2 - Fatal编程技术网

Python 傅里叶变换二维伪影-我做错了什么?

Python 傅里叶变换二维伪影-我做错了什么?,python,numpy,fft,cv2,Python,Numpy,Fft,Cv2,所以现在我试着用傅里叶变换(2D)来概括我的思想。我想对一幅图像进行傅里叶变换,只返回幅度谱,就像本网站上的主题一样: 然而,我的图像(使用Sydide IDE)是这样的,中间有一些奇怪的人为工具,使用上面链接中的相同图像。 我使用的代码是python中使用numpy(np)、opencv2和matplotlib的代码: import numpy as np import cv2 from matplotlib import pyplot as plt from os import lis

所以现在我试着用傅里叶变换(2D)来概括我的思想。我想对一幅图像进行傅里叶变换,只返回幅度谱,就像本网站上的主题一样:

然而,我的图像(使用Sydide 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()
我做错了什么


更新:添加了导入

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

<> P>在你的情节中间的奇怪的东西是被包裹的大的值(转换为UIT8的模数)。当不铸造时,你只看到中间有一个白点。通常(对于自然图像),DFT在原点具有非常高的幅值,对于更高的频率,幅值呈指数减小

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

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

无法运行给定的代码,因为它缺少导入、引用本地数据等。请更新它,以便我们重现您的问题。您好,抱歉!我已经更新了导入。它引用的是本地数据,但原始图像(图像链接)是我用来创建震级谱的图像。这看起来像是由大值包装引起的伪影。为什么要转换成
uint8
?@kazemakase我这样做是因为傅里叶变换返回一个复数,为了重建图像,我需要将其转换成原始格式(uint8)。你检查过
的值是否适合8字节的整数吗?(我打赌他们不会。)试着让你的生活变得轻松,转而使用
np.float64
。如果你真的想放弃想象的部分,谢谢你的帮助,但是,如果我把它改成NP.ABS,我只会得到一个中间有白点的黑色图像。我也已经在使用rgbgray图像(cv2.imread(0)的第二个参数)。更正了我的答案。uint8不剪裁255以上的值,用作模数
np.uint8(257)
给出了
1
。它可以工作!太棒了,非常感谢你的帮助。我没有想到这一点,但这是有道理的,谢谢你!