代码之家  ›  专栏  ›  技术社区  ›  smichak

在Matlab中求二维脉冲峰值

  •  4
  • smichak  · 技术社区  · 15 年前

    在二维矩阵中寻找脉冲峰(dirac delta)的最佳方法是什么?

    更具体地说,我想找到一个给定图像的谐波频率,所以我需要在图像绝对值dft中找到脉冲峰值。

    我想用findpeaks,但没有二维版本。我也看到了关于使用imexplate和/或imextenddmax寻找普通峰的早期文章,但是这些文章在二维矩阵中找到了所有的峰,而我只对脉冲峰感兴趣。我相信数字信号处理器的人有一个共同的食谱…

    请帮忙,

    谢谢

    3 回复  |  直到 15 年前
        1
  •  6
  •   Jonas    15 年前

    你要做的是找到高对比度的峰值。因此,您需要一种识别局部最大值的方法,以及一种测量峰值和周围值之间差异的方法。对这一差异进行阈值化将为您确定脉冲峰值。

    假设您的输入信号被调用 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 是一个逻辑数组,其中有一个好的峰值。您可以使用它从信号中读取峰高 signal(peaks) ,并使用 find(peaks) .

        2
  •  2
  •   Jonas Heidelberg liori    14 年前

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

    因为你期望的是稀疏的脉冲, nonmaxsupp_scanline() 功能可能适合您。

        3
  •  0
  •   George Hilliard    8 年前

    这个 findpeaks 算法非常简单;如果一个元素大于它的两个邻居,那么它就是一个峰值。写一个二维版本应该很简单。

    推荐文章