二维频域下半部分隔行置零重建图像为何出现移位重复伪影?
二维频域下半部分隔行置零后重建出现移位重复伪影的原理
现象描述
对二维傅里叶变换后经fftshift将零频移到中心的频谱,将下半部分隔行选取的元素全部赋值为0+0j后,做逆傅里叶重建得到的空间域图像会出现原图像的移位副本,产生明显重复伪影:
复现代码
import cv2 as cv import math import numpy as np import matplotlib.pyplot as plt imgpath = "MRI_blackandwhite.png" 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[367//2:-1:2] = amp[367//2:-1:2]* (0+0j) amp_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))) plt.subplot(131), plt.imshow(norm_image, "gray", vmin=0, vmax=1), plt.title('Image') plt.xticks([]), plt.yticks([]) plt.subplot(132), plt.imshow(norm_amp, "gray", vmin=0, vmax=1), plt.title('Amplitude') plt.xticks([]), plt.yticks([]) plt.subplot(133), plt.imshow(restoredAMP, "gray", vmin=0, vmax=1), plt.title('Restored ') plt.xticks([]), plt.yticks([]) plt.show()
代码运行得到的结果如下:
原理说明
这个现象本质是傅里叶变换的采样/调制性质的直接体现,核心逻辑如下:
- 隔行置零等价于频域乘梳状采样函数
对频域的行做步长为2的隔行置零,本质是把原频谱$F(u,v)$和一个沿v方向(频域竖直方向,对应图像行维度)周期为2的冲激梳状函数逐点相乘:该梳状函数在保留行取值为1,置零行取值为0,和操作逻辑完全匹配。 - 频域相乘对应空间域卷积,冲激串卷积会产生移位副本
根据二维傅里叶变换卷积定理:频域两函数相乘,等价于空间域对应两函数做卷积。
沿v方向周期为2的频域冲激梳,对应的空间域核是沿y方向(空间域竖直方向)周期为图像高度1/2的冲激串:两个冲激分别位于$y=0$和$y=H/2$($H$为图像总高度),每个冲激幅值均为0.5。
原图像和这个冲激串卷积的结果,就是y=0位置的原图像本身,叠加一个沿竖直方向平移H/2距离的半幅值原图像副本,这就是观察到的移位重复伪影。
补充说明:由于操作仅对频谱下半部分做隔行置零,相当于给全频谱隔行采样的操作加了下半区的窗,因此最终的副本不会是严格半幅值、完全对齐的状态,会伴随一定的亮度、相位偏差,但核心的移位重复来源就是上述频域采样对应空间域冲激串卷积的效应。
内容的提问来源于stack exchange,提问作者ymmx
相关产品推荐
相关产品推荐

