matlab 查找峰值图像

matlab find peak images

我有一个二值图像如下:

这是一个随机抽象图片的图像,通过使用matlab,我想做的是检测它有多少个峰,这样我就知道里面大约有5个物体。

如你所见,里面有5个峰,也就是说里面有5个物体。

我试过使用 imregionalmax(),但我发现它没有用,因为我的图像已经是二进制图像了。我也尝试使用 regionprops('Area'),但它显示错误的数字,因为每个对象之间没有确切的空格。提前致谢

因为你的它们是峰,它们是垂直结构。所以在这种特殊情况下,你可以使用 projection histograms (also know as histogram projection function): 你让所有的黑色像素都像受到重力影响一样下落。然后你会发现图像底部有一条黑色像素曲线。然后就可以数峰的数量了

算法如下:

  1. 反转图像(黑色通常是缺少信息)
  2. Histogram projection
  3. 关闭和打开以清除信号并获得the final result
  4. 您可以添加最大值检测以获得峰顶。

一个简单的方法是简单地对每一列的行求和,然后使用 findpeaks 找到结果的峰值。在下面的示例中,我选择使用图像的反转,这将导致列所在的正峰。

rowSum = sum(1 - image, 1);

如果我们绘制这个,它看起来像底部图

然后我们可以使用 findpeaks 来识别该图中的峰值。我们将对其应用 5 点移动平均线以帮助消除虚假峰值。

[peaks, locations, widths, prominences] = findpeaks(smooth(rowSum));

然后,您可以通过基于这些输出中的任何一个的阈值来 select "true" 峰值。对于此示例,我们可以使用 prominences 并找到更突出的峰。

isPeak = prominences > 50; 
nPeaks = sum(isPeak)

   5

然后我们可以绘制峰位置以确认

plot(locations(isPeak), peaks(isPeak), 'r*');

如果您对峰的预期宽度有一些先验知识,则可以调整 smooth 跨度以匹配此预期宽度,并在使用 findpeaks 时获得一些更清晰的峰。

使用图像的预期宽度 40,findpeaks 能够完美地检测到所有 5 个峰,没有误报。

findpeaks(smooth(rowSum, 40));