1

我在下面有一个二进制图像:

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

如您所见,其中有 5 个峰,因此这意味着其中有 5 个对象。

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

4

2 回答 2

1

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

rowSum = sum(1 - image, 1);

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

在此处输入图像描述

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

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

然后,您可以通过基于任何这些输出的阈值来选择“真实”峰值。对于这个例子,我们可以使用prominences并找到更突出的峰。

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

   5

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

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

在此处输入图像描述

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

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

findpeaks(smooth(rowSum, 40));

在此处输入图像描述

于 2016-03-10T03:07:02.657 回答
0

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

这是算法:

  1. 反转图像(黑色通常表示没有信息)
  2. 直方图投影
  3. 关闭和打开以清除信号并获得最终结果
  4. 您可以添加最大值检测以获取峰值。
于 2016-03-10T02:01:32.827 回答