如何在matlab中找到DFT谱的峰值(r,theta)?

时间:2014-10-12 18:02:07

标签: matlab fft spectrum

假设我有一个矩阵M. 我对它应用DFT并将其转移到中心

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

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

1 个答案:

答案 0 :(得分:0)

使用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来确定rtheta。换句话说:

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

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

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

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