matlab找到峰值图像

时间:2016-03-09 23:22:12

标签: image matlab image-processing binary-image

我在下面有一张二进制图片:

它是随机抽象图片的图像,并且通过使用matlab,我想要做的是检测它有多少个峰,所以我知道其中大约有5个对象。

如您所见,其中有5个峰值,因此它意味着有5个物体。

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

2 个答案:

答案 0 :(得分:1)

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

rowSum = sum(1 - image, 1);

如果我们绘制它,它看起来像底部的情节

enter image description here

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

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

然后,您可以根据这些输出中的任何一个进行阈值处理来选择“真实”峰值。对于此示例,我们可以使用prominences并找到更突出的峰值。

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

   5

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

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

enter image description here

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

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

findpeaks(smooth(rowSum, 40));

enter image description here

答案 1 :(得分:0)

由于它们是峰值,它们是垂直结构。所以在这种特殊情况下,你使用projection histograms(也称为histogram projection function):你使所有的黑色像素都像重力一样受到影响。然后,您会在图像底部找到黑色像素的曲线。然后你可以计算峰值数量。

以下是算法:

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