Numpy 中傅立叶变换的可逆性问题
Problem with Invertability of Fourier Transform in 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");
Original Image
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");
Noisy Image
但是,当我尝试通过按照添加噪声的方式去除噪声来重建原始图像时,我得到了原始图像的噪声版本。这是代码:
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");
Reconstructed Image
知道为什么会发生这种情况以及如何消除它吗?如果我能得到任何帮助,我将不胜感激。谢谢
在傅里叶 space 中添加噪声后,您的真实图像 space 将变得复杂(即同时具有幅度和相位)。在您的情况下,您虽然采用了绝对值,但可能是为了绘制它,但这样做是在删除此相位信息并在不应该更改图像时更改图像。
简而言之,我认为您需要删除这一行中的 abs
:
img_noise = np.abs(np.fft.ifft2(mag_orig*np.exp(ang_noise*1j)))
添加到你的代码中,在字符串
之后
ns = np.random.uniform(0, 6.28, size = f.shape)
这使得对称相位:
ns = np.fft.fft2(ns)
ns = np.arctan2(ns.imag, ns.real)
我试图伪随机地改变傅里叶域中图像的相位,同时保持幅度相同以获得有噪声的图像。这是相关代码:
import numpy as np
import matplotlib.pyplot as plt
import cv2
img_orig = cv2.imread("Lenna.png", 0)
plt.imshow(img_orig, cmap="gray");
Original Image
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");
Noisy Image
但是,当我尝试通过按照添加噪声的方式去除噪声来重建原始图像时,我得到了原始图像的噪声版本。这是代码:
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");
Reconstructed Image
知道为什么会发生这种情况以及如何消除它吗?如果我能得到任何帮助,我将不胜感激。谢谢
在傅里叶 space 中添加噪声后,您的真实图像 space 将变得复杂(即同时具有幅度和相位)。在您的情况下,您虽然采用了绝对值,但可能是为了绘制它,但这样做是在删除此相位信息并在不应该更改图像时更改图像。
简而言之,我认为您需要删除这一行中的 abs
:
img_noise = np.abs(np.fft.ifft2(mag_orig*np.exp(ang_noise*1j)))
添加到你的代码中,在字符串
之后ns = np.random.uniform(0, 6.28, size = f.shape)
这使得对称相位:
ns = np.fft.fft2(ns)
ns = np.arctan2(ns.imag, ns.real)