Image 2D Real Cepstrum with DFT,是否需要`ifftshift`?

信息处理 图像处理 自由度 频域 二维 倒谱分析
2022-01-18 08:17:06

这是我的测试图像,取自论文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。您将获得另一个长度的序列结果序列的第一个元素对应于零频率。然后我们对得到的长度为的序列进行处理,得到第三个长度为的序列中的元素的中心(如果对应于零频率。Nx[n]NNX[n]fftshiftNNX[n]NX[n]

  • 问题是如何 使用 IDFTx[n]

IDFT(X[n])是对的。是错误的。IDFT(X[n])

检查此 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&的情况相同ifft2iethis会给你原件img

 ifft2(fft2(img))

如果倒谱定义为

C=F1{ln(|F{I(x,y)}|)}

其中= 这类似于从傅立叶域转换回空间域。Iimg

更新2: 我发现我错了..

当报纸说

倒谱(用 FT 计算)在中心有最大值

我把它误解为

用 DFT 和 IDFT 计算的倒谱在中心有最大值

如果上面的倒谱真的是用傅里叶变换计算的,倒谱将在原点处具有最大值。这意味着如果我用 DFT 和 IDFT 计算,最大值应该在拐角处。与 FT 与 DFT 相同,我假设用 DFT 计算的倒谱应该在中心有最大值。那是我错的地方。

1个回答

如果您在空间域中有图像,为了计算其 DFT 变换,您应该使用fft.
一旦你有它的 DFT 以返回空间域,请使用该函数ifft

无论哪种方式,DFT 变换都会为您提供 [0, 2pi] 轴上的数据。
用于fftshift将其移动到论文中所见的 [-pi, pi] 域中。

祝你好运。

MATLAB 代码

这段代码对我有用:

mInputImage = imread('3.png');
mInputImage = double(mInputImage) / 255;
mInputImage = mean(mInputImage, 3);

mImageDft = (fft2(mInputImage));

mImageDft = log(1 + abs(mImageDft));

mImageCepstrum = abs(fftshift(ifft2(mImageDft)));

mImageCepstrum = mImageCepstrum / max(mImageCepstrum(:));

figure();
imshow(mImageCepstrum);

享受...