【发布时间】:2020-06-14 01:43:51
【问题描述】:
在下面的代码中,我有一个函数,它返回裁剪到某个半径的中心圆的图像。然后我对图像进行傅立叶变换,然后再次进行逆傅立叶变换,以恢复图像,效果很好。
然后我计算出,半径为 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()
这与我使用绝对值这一事实有什么关系吗?我看不出我应该如何在不消除图像的虚部的情况下绘制图像,但我可以看到一些信息可能会在逆 fft 中丢失。
我只是不明白为什么在原始幅度谱上执行 IFFT 时没有遇到问题。
【问题讨论】:
-
我认为您需要在恢复之前将 imgRadius() 应用于 amp 而不是 norm_amp。
-
@fmw42 这就是我试图用“rest99”做的,它在子图中显示为第 5 个图像,显示“后折叠”
-
要在使用半径遮罩后恢复图像,您需要遮罩 FFT 的结果,而不是日志标准化版本。在那做IFT。我不明白您为什么要对日志标准化图像进行 IFT。
-
@fmw42 也许代码有点混乱,但我并不想恢复掩码日志规范化版本的 FFT。这仅用于绘图。我屏蔽并尝试恢复的版本只是amp,这只是FFT的结果。查看变量“rest99”
-
尝试将
rest99 = np.abs(np.fft.ifft2((imgRadius(amp,43))))更改为rest99 = np.abs(np.fft.ifft2((imgRadius(amp,43)))).clip(0,255).astype(np.uint8)
标签: python numpy opencv image-processing fft