我希望使用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);
当我绘制它时,我期望一个关于中心的对称图(这就是我想要的)。但是,我碰巧看到两个部分看起来像附图中的那样。
看起来我有一个代码错误,任何线索我错过了什么?
答案 0 :(得分:0)
我不是一个图像处理人员,但我只想从我自己的统计知识中说出来。
您应该使用mtf=abs(F)'*abs(F)
代替mtf=(abs(F)).^2
。我得到了下图
这是生成图形的代码。
> 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时,你可以将你的结果与它进行比较。