【问题标题】:how to find the peak(r,theta) from DFT spectrum in matlab?如何在matlab中从DFT频谱中找到峰值(r,theta)?
【发布时间】:2014-10-12 18:02:07
【问题描述】:

假设我有一个矩阵 M 我对其应用 DFT 并将其移至中心

img_fft = fft2(double(M));
img_spec = abs(img_fft);
img_shift = fftshift(img_spec);

然后根据我的问题,我怎样才能找到光谱的峰值,即(u,v) 的峰值? 非常感谢!

【问题讨论】:

    标签: matlab fft spectrum


    【解决方案1】:

    使用find 确定图像中最大值出现的位置。但是,问题是要忽略 DC 值,这很可能是迄今为止您频谱中最大的分量。因此,您应该做的是找到最大值,这应该是当前的 DC 值,并将其设置为NaN。完成此操作后,下一个最大值就是您要搜索以回答问题的值。

    因此,请先执行此操作:

    idx = find(img_shift == max(img_shift(:)));
    img_shift(idx) = NaN;
    

    如果在这里设置最大值为NaN,下次调用find时,会忽略这个位置,在搜索最大值时跳过这个位置。现在,再次拨打find

    [u,v] = find(img_shift == max(img_shift(:)));
    

    这里,u 将是图像的水平位置,而v 将是垂直位置。这现在应该正确返回不是 DC 值的最大峰值。但是,这与中心无关,因为您已经移动了图像,所以一旦完成上述操作,您需要执行以下操作:

    [rows, cols] = size(img_fft);
    
    u = u - floor(rows/2);
    v = v - floor(cols/2);
    

    现在这会将原点移动到图像的中心,因此现在应该找到最大峰值相对于图像中心的位置。

    您现在可以根据您的问题使用uv 来确定@​​987654334@ 和theta。换句话说:

    r = sqrt(u^2 + v^2);
    theta = atan2(v, u);
    

    根据您的评论,一个小提示是您遇到了两个共享最大值的值。这是因为光谱是对称的。在你做find之后,你会得到两个答案。因此,任何一个答案都会给你正确的结果。您可以选择任一 r,theta 对,也可以修改您的 find 语句,使其仅返回 一个 答案。换句话说,这样做:

    [u,v] = find(img_shift == max(img_shift(:)), 1);
    

    注意最后1的第二个参数。这意味着只返回一个结果。

    【讨论】:

    • 天哪!你真是天才!你怎么能学那么多matlab技术!
    • 如果 r 和 theta 都出现 2 个值怎么办?我发现我的矩阵出现 r 和 theta 给出 2X1 矩阵结果
    • @Iamrubbishinprogramming - 是的。那是因为光谱是对称的。选择rtheta 对中的任何一个,它会给你正确的结果。因此,r(1)theta(1) 将是一个答案,r(2)theta(2) 是另一个答案。
    • 哦,这就是我的猜测!谢谢,喜欢@rayryeng​​span>
    • @Iamrubbishinprogramming - 我已经编辑了我的答案。看看有没有帮助!
    猜你喜欢
    • 2014-04-24
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    相关资源
    最近更新 更多