【问题标题】:Finding 2d impulse peaks in MATLAB在 MATLAB 中查找 2d 脉冲峰值
【发布时间】:2011-05-13 13:25:56
【问题描述】:

在二维矩阵中找到脉冲峰值(狄拉克增量)的最佳方法是什么。

更具体地说,我想找到给定图像的谐波频率,因此我需要在图像绝对值 DFT 中找到脉冲峰值。

我想过使用 findpeaks,但没有 2d 版本。我还看到了有关使用 imdilate 和/或 imextendedmax 查找普通峰值的早期帖子,但那些在二维矩阵中找到所有峰值,而我只对脉冲峰值感兴趣。我相信 DSP 人对此有一个共同的秘诀......

请帮忙,

谢谢

【问题讨论】:

  • 我正在寻找傅立叶变换绝对值在该频率(无穷大)处取狄拉克增量函数值的频率。显然,对于 DFT,您不会期望看到无穷大,而是看到一个主要峰值。问题是如何在 2d 中找到这些峰值以及如何将它们与正常(较低、非脉冲)峰值区分开来。

标签: matlab image-processing signal-processing dft


【解决方案1】:

您要做的是找到具有高对比度的峰。因此,您需要一种识别局部最大值的方法,以及一种测量峰值与周围值之间差异的方法。对该差异进行阈值处理将为您识别脉冲峰值。

假设你的输入信号被称为signal

%# dilate to find, for every pixel, the maximum of its neighbors
dilationMask = ones(3);
dilationMask(5) = 0;
dilSignal = imdilate(signal, dilationMask);

%# find all peaks
%# peaks = signal > dilSignal;

%# find large peaks peaks by thresholding, i.e. you accept a peak only 
%# if it's more than 'threshold' higher than its neighbors
peaks = (signal - dilSignal) > threshold;

peaks 是一个逻辑数组,只要有一个好的峰值,就会有 1。您可以使用它通过signal(peaks) 从信号中读取峰高,并使用find(peaks) 查找坐标。

【讨论】:

  • 好的 - 这是一个开始......但是我如何选择阈值?我认为它应该取决于输入信号。有没有好的选择方法/经验法则?
  • 它们是狄拉克峰,因此阈值是无穷大:P。开个玩笑,没有选择阈值的最佳方法。如果有两个清晰的峰值,一个是信号峰值,一个是噪声峰值,您可以尝试在 signal-dilSignal 上运行 graythresh。您还可以将阈值设置为信号的 3 个稳健标准偏差(中值绝对偏差)。如果您的所有数据都非常一致,并且峰值的高度具有易于识别的含义,您甚至可以决定一个固定值。
  • 好的 - 这听起来很有希望......我会同意的。
【解决方案2】:

This paper I wrote 包含用于二维快速局部峰值检测的 Matlab 源代码。它的工作原理类似于 Mathworks 图像处理工具箱中的 imregionalmax(),但允许您指定局部邻域半径:更大的半径 -> 更稀疏的峰。

由于您期望稀疏脉冲,nonmaxsupp_scanline() 函数可能适合您。

【讨论】:

    【解决方案3】:

    findpeaks 算法非常简单;如果一个元素比它的两个邻居都大,那么它就是一个峰值。编写它的 2D 版本应该很简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 2015-02-24
      • 2014-09-04
      相关资源
      最近更新 更多