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



我正在尝试更改傅里叶域伪随机图像的相位,同时保持幅度相同以获得噪声图像。这是代码:

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");

重建图像

知道为什么会发生这种情况以及如何删除它吗?我将不胜感激我能得到的任何帮助。谢谢

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

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

这使得对称相位:

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

在傅里叶空间中添加噪声后,您在真实空间中的图像将很复杂(即同时具有幅度和相位(。在您的情况下,您正在获取绝对值,可能是为了您可以绘制它,但这样做您正在删除此相位信息并在不应该更改图像时更改图像。

简而言之,我认为您需要删除此行中的abs

img_noise = np.abs(np.fft.ifft2(mag_orig*np.exp(ang_noise*1j)))

最新更新