Matlab - 使用fft的图像的对称PSD

时间:2013-11-23 10:42:25

标签: image matlab fft psd

我希望使用matlab计算一个图像的一维PSD(分别沿着行和列)。

我使用以下代码段。

F=fft(img,[],2);%FFT along dim2
F=fftshift(F,2);
mtf=(abs(F)).^2;
mtf_mean = mean(mtf,2);% Mean of all contents of a row
mtf_mean_norm = mtf_mean/max(max(mtf_mean)); %Normalization to 1
plot(mtf_mean_norm);

当我绘制它时,我期望一个关于中心的对称图(这就是我想要的)。但是,我碰巧看到两个部分看起来像附图中的那样。

看起来我有一个代码错误,任何线索我错过了什么?

图片网址:http://i.stack.imgur.com/RrLIt.jpg

2 个答案:

答案 0 :(得分:0)

我不是一个图像处理人员,但我只想从我自己的统计知识中说出来。 您应该使用mtf=abs(F)'*abs(F)代替mtf=(abs(F)).^2。我得到了下图 enter image description here

这是生成图形的代码。

> img=randn(50,50);
> F=fft(img,[],2);%FFT along dim2
> F=fftshift(F,2);
> mtf=abs(F)'*abs(F);
> mtf_mean = mean(mtf,2);% Mean of all contents of a row
> mtf_mean_norm = mtf_mean/max(max(mtf_mean)); %Normalization to 1
> plot(mtf_mean_norm);
> plot(mtf_mean_norm);

答案 1 :(得分:0)

我试图理解当你沿着图像的每一行操作一维FFT时你的观点是什么。这样的功率谱密度仅沿着行,并且与来自其他行的信息无关,并且沿着列的轮廓(在对每行进行平均之后)不一定是对称的。 当您对整个图像进行2D FFT时,您的PSD线将是对称的。

F=abs(fftshift(fft2(img))).^2;
plot(mean(F,2));

顺便说一下,有一个名为periodogram的函数,用于获取1D PSD。当你做1D PSD时,你可以将你的结果与它进行比较。