在2D矩阵中查找脉冲峰(Dirac Delta)的最佳方法是什么?

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

我想到使用Findpeaks,但没有2D版本。我还看到了有关使用Imdilate和/或ImextendedMax找到普通峰的较早文章,但是这些峰在2D矩阵中找到了所有峰,而我只对脉冲峰感兴趣。我确定DSP的人有一个常见的食谱...

请帮忙,

谢谢

有帮助吗?

解决方案

您想做的是找到具有高对比度的峰值。因此,您需要一种识别本地最大值的方法,以及一种测量峰值和周围值之间的差异的方法。在此差异上的阈值将为您确定冲动峰值。

假设您的输入信号被调用 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).

其他提示

我写的本文 包含2D中快速局部峰值检测的MATLAB源代码。它的工作类似 imregionalmax() 在Mathworks图像处理工具箱中,但是您可以指定本地邻域半径:较大的半径 - >稀疏峰。

由于您期望稀疏的冲动,所以 nonmaxsupp_scanline() 功能可能适合您。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top