Numpy中傅里叶变换的可逆性问题。

问题描述 投票:0回答:1

我想在保持幅值不变的情况下,伪随机改变傅里叶域中图像的相位,以得到一个有噪声的图像。下面是代码。

import numpy as np
import matplotlib.pyplot as plt
import cv2

img_orig = cv2.imread("Lenna.png", 0)
plt.imshow(img_orig, cmap="gray");

原始图像

f = np.fft.fft2(img_orig)
mag_orig, ang_orig = np.abs(f), np.arctan2(f.imag, f.real)
np.random.seed(42)
ns = np.random.uniform(0, 6.28, size = f.shape)
ang_noise = ang_orig+ns
img_noise = np.abs(np.fft.ifft2(mag_orig*np.exp(ang_noise*1j)))
plt.imshow(img_noise, cmap="gray");

嘈杂的图像

但当我试图通过去除添加噪声的方式重建原始图像时,我得到的是原始图像的噪声版本。下面是代码。

f_noise = np.fft.fft2(img_noise)
mag_noise, ang_noise = np.abs(f_noise), np.arctan2(f_noise.imag, f_noise.real)
ang_recover = ang_noise-ns
img_recover = np.abs(np.fft.ifft2(mag_noise*np.exp(ang_recover*1j)))
plt.imshow(img_recover, cmap="gray");

重构后的图像

知道为什么会出现这种情况以及如何去除吗?我将感激任何帮助,我可以得到。谢谢您的帮助

python numpy image-processing fft
1个回答
3
投票

在你的代码中,在字符串后添加

ns = np.random.uniform(0, 6.28, size = f.shape)

这使得对称相位。

ns = np.fft.fft2(ns)
ns = np.arctan2(ns.imag, ns.real)

2
投票

在傅里叶空间添加噪声后,你的图像在现实空间将是复杂的(即会有一个幅度和一个相位)。在你的例子中,你虽然取了绝对值,可能是为了让你可以绘制它,但这样做你就去掉了这个相位信息,改变了你的图像,而你不应该这样做。

简而言之,我认为您需要删除您的 abs 在这一行。

img_noise = np.abs(np.fft.ifft2(mag_orig*np.exp(ang_noise*1j)))
© www.soinside.com 2019 - 2024. All rights reserved.