【问题标题】:Power spectrum of an image图像的功率谱
【发布时间】:2013-12-09 22:24:03
【问题描述】:

我已经开始(一个小项目)计算频域中图像的功率谱。

所以,到目前为止,我有以下内容:

%// close all; clear all; %// not generally appreciated
img   = imread('ajw_pic.jpg','jpg'); % it is a color image
img = rgb2gray(img); %// change to gray
psd = 10*log10(abs(fftshift(fft2(img))).^2 );
figure(2); clf
mesh(psd)

到目前为止看起来不错;我得到的网格图类似于我在各种学术论文中看到的光谱。

但是,我正在寻找的是这个功率谱与频率的关系图,我不完全确定如何获得这个频率向量。例如,我可以这样做:

N=400;        %// the image is 400 x 400
f=-N/2:N/2-1; %// possible frequencies?

但我不相信这是完全正确的,因为这会产生负频率。

如果有人能指出正确的方向来绘制对数频率与功率谱的关系,我将不胜感激。

【问题讨论】:

    标签: matlab signal-processing dft


    【解决方案1】:

    fft 将信号“拆分”成频率“箱”,您可以观察到的最大频率是奈奎斯特频率或采样频率的一半。这意味着:

    Y = fft(X,N); %  (1D case)
    

    Y(1:N/2+1) 中 fft 值对应的频率将是:

    f = [fs/2*linspace(0,1,N/2+1)]; % where fs is your sampling frequency
    

    Y 的另一半只是镜像,来自傅里叶变换的内在函数。如果你不想完全理解它,我会说除了你可以在维基百科上找到的东西之外,没有必要去打扰它。但出于好奇,您可以查看正负频率起源的直观说明:https://dsp.stackexchange.com/questions/431/what-is-the-physical-significance-of-negative-frequencies/449#449

    您的 2D 图像案例的一些主要区别:

    1. 使用 fftshift 您已将 0 频率移动到矩阵的中心,而不是像上面的一维示例中那样将它们放在边缘。所以你实际上会得到f = fs/2 * linspace(-1,1,N)(再一次,不要介意负频率)

    2. 下一个问题是获取采样频率。空间频率通常以 [mm^-1] 为单位,因此为了获得它,您实际上需要知道像素中心之间的物理距离(像素间距)。但是您当然可以考虑 [pixels^-1] 中的空间频率,在这种情况下您就可以开始了。

    【讨论】:

    • 非常感谢您的详细回复。我似乎确实了解负频率位 - 但是,我仍然不完全确定 fft 之后我的频率应该是什么。所以,正如你所解释的,我可以使用1/400(给定 400 是我的像素),但我没有fs,因为这是一张图片?此外,当我 fft 我的 400x400 图像并计算功率时,结果也是一个 400 x 400 矩阵 - 但是,我想我想要的是 1x400 大小的东西 - 这样我就可以绘制频率和功率谱。还是我在这里很傻?
    • 你的 fs 实际上是 1 像素或 1/(像素间距)mm。如果您没有像素间距,您仍然可以使用 fs=1 (请注意单位 - 您的奈奎斯特频率是倒置像素的一半)。您还应该考虑在 x 和 y 方向上可以有不同的频率(例如非二次像素) - 这就是为什么您有一个 400x400 矩阵的原因。所以创建一个 fx 和 fy 频率向量(它们是相同的,因为 NX=NY=400,并且像素大小是未知的)。但是,如何将其可视化是一个不同的问题(除了将轴标记为 fx 和 fy 为 tics 之外,我没有一个好的答案)
    • 我正在尝试按照您的建议进行操作:所以,我这样做了:fs=1; f = fs/2 * linspace(-1,1,N); %where N is 400 - 这适用于 -0.5 to +0.5 - 这有意义吗?这是赫兹值还是弧度/秒? :(
    • 只是另一个小想法:我也在使用这个资源:http://redwood.berkeley.edu/bruno/npb261b/lab2/lab2.html,这里的频率似乎是 0:N/2 他们似乎以某种方式计算了 rotavg - 但功能肯定不是来自 Matlab。想知道你有没有什么想法。谢谢。
    • 查看此处以获取有关旋转平均值的一些信息:sbirc.ed.ac.uk/cyril/download/DTP_Fourier_analyses.pdf。您提到的频率范围与我上面的回复一致(即 fs=1 和从 0:N/2 * fs 开始的频率,加上镜像的负频率)
    【解决方案2】:

    要绘制图像的功率谱与频率的关系,可以使用一种称为“径向平均”的过程。这将计算距图像中心一定径向距离的像素的平均值。将其应用于功率谱密度矩阵会得到功率与频率的线图。

    欲了解更多信息和示例 MATLAB 代码:http://www.mathworks.com/matlabcentral/fileexchange/46468-radialavg-zip/content/radialavg.m

    【讨论】:

    • 我删除了第一段,因为这个问题确实有解决方案,因此接受了答案。此外,所有内容都保存在此站点上,因此将来的参考总是如此。至于您的答案本身:请将链接中的所有相关代码(如果可能)包含到答案本身中,因为链接可能会消失。如果您不是该代码的作者,通常会添加参考/引文。
    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    相关资源
    最近更新 更多