gpt4 book ai didi

python - FFT 图像的 IFFT 导致原始图像出现奇怪的上下重叠

转载 作者:行者123 更新时间:2023-12-01 13:56:04 29 4
gpt4 key购买 nike

在下面的代码中,我有一个函数,它返回裁剪到某个半径的中心圆的图像。然后我对图像进行傅立叶变换,然后再次进行逆傅立叶变换,以恢复图像,效果很好。

然后我计算出,半径为 43 的能谱(此处不包括)的中心圆将产生原始图像的 99% 的能量。但是当我尝试将我的函数“imgRadius”应用于幅度谱(傅立叶变换图像),然后对该图像执行逆傅立叶变换时,我得到了原始图像的这种奇怪的倒置重叠。

def imgRadius(img, radius):
result = np.zeros(img.shape,np.float64)
centerX = (img.shape[0])/2
centerY = (img.shape[1])/2
for m in range(img.shape[0]):
for n in range(img.shape[1]):
if math.sqrt((m-centerX)**2+(n-centerY)**2) < radius:
result[m,n] = img[m,n]
return result

imgpath = directory+"NorbertWiener.JPG"
img = cv.imread(imgpath, cv.IMREAD_GRAYSCALE)
norm_image = cv.normalize(img, None, alpha=0, beta=1, norm_type=cv.NORM_MINMAX, dtype=cv.CV_32F)
amp = (np.fft.fftshift(np.fft.fft2(norm_image)))
amp_log = np.log(np.abs(amp))
norm_amp = cv.normalize(amp_log, None, alpha=0, beta=1, norm_type=cv.NORM_MINMAX, dtype=cv.CV_32F)
restoredAMP = np.abs(np.fft.ifft2(np.fft.ifftshift(amp)))
radamp = imgRadius(norm_amp,43)
rest99 = np.abs(np.fft.ifft2((imgRadius(amp,43))))

plt.subplot(231),plt.imshow(norm_image, "gray", vmin=0, vmax=1),plt.title('Image')
plt.xticks([]), plt.yticks([])
plt.subplot(232),plt.imshow(norm_amp, "gray", vmin=0, vmax=1),plt.title('Amplitude')
plt.xticks([]), plt.yticks([])
plt.subplot(233),plt.imshow(restoredAMP, "gray", vmin=0, vmax=1),plt.title('Restored from amplitude')
plt.xticks([]), plt.yticks([])
plt.subplot(235),plt.imshow(rest99, "gray", vmin=0, vmax=1),plt.title('Restored from r=43')
plt.xticks([]), plt.yticks([])
plt.subplot(234),plt.imshow(radamp, "gray", vmin=0, vmax=1),plt.title('Amplitude r=43')
plt.xticks([]), plt.yticks([])
plt.show()

See the resulting subplots here

这与我使用绝对值这一事实有什么关系吗?我看不出我应该如何在不去除图像的虚部的情况下绘制图像,但我可以看到一些信息可能会在逆 fft 中丢失。

我只是不明白为什么在原始幅度谱上执行 IFFT 时没有遇到问题。

最佳答案

问题发生在这里:

def imgRadius(img, radius):
result = np.zeros(img.shape,np.float64)

您正在创建一个实数值数组,并复制复数值。可能将实部或幅度写入数组。在任何情况下,复值频域数据都变为实值。逆变换是一个对称矩阵。

为了解决这个问题,将result初始化为一个复值数组。

在此之后,确保使用逆变换的实部,而不是幅度,如 Gianluca already suggested in their answer .

关于python - FFT 图像的 IFFT 导致原始图像出现奇怪的上下重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60477377/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com