这是我的测试图像,取自论文Image Restoration for Linear Local Motion-Blur Based on Cepstrum:
我尝试使用这个简单的 MATLAB 代码将其转换为真正的倒谱域:
cepstrum_img=ifft2(log(1+abs(fft2(img(:,:,1)))));
imshow((abs(cepstrum_img)))
但我的结果很奇怪:最大值不在图像的中心,它们在 4 个角。这是左上角最大的放大图片:
但是这篇论文的结果是这样的:
最大值实际上在中心!
因为我没有做任何事情fftshift
,我认为我不需要做任何事情ifftshift
。
- 这让我很困惑。我的代码有问题吗?还是我对带有 DFT 的 2D 实倒谱的理解?
更新1: 为什么我认为这里不需要 fftshift
或 ifftshift
不需要。
对于长度为的序列,您执行点 DFT。您将获得另一个长度的序列。结果序列的第一个元素对应于零频率。然后我们对得到的长度为的序列进行处理,得到第三个长度为的序列中的元素的中心(如果对应于零频率。fftshift
- 问题是如何 使用 IDFT
是对的。是错误的。
检查此 MATLAB 代码:
% the original sequence
x=1:8
% this will give you the original sequence
ifft(fft(x))
% but this won't
ifft(fftshift(fft(x)))
% anyway, the amplitude is the same.
图像和fft2
&的情况相同ifft2
。iethis会给你原件img
:
ifft2(fft2(img))
如果倒谱定义为
其中= 。这类似于从傅立叶域转换回空间域。img
更新2: 我发现我错了..
当报纸说
倒谱(用 FT 计算)在中心有最大值
我把它误解为
用 DFT 和 IDFT 计算的倒谱在中心有最大值
如果上面的倒谱真的是用傅里叶变换计算的,倒谱将在原点处具有最大值。这意味着如果我用 DFT 和 IDFT 计算,最大值应该在拐角处。与 FT 与 DFT 相同,我假设用 DFT 计算的倒谱应该在中心有最大值。那是我错的地方。