我在下面有一个二进制图像:
这是一张随机抽象图片的图像,通过使用matlab,我想做的是检测它有多少个峰值,所以我会知道其中大约有5个对象。
如您所见,其中有 5 个峰,因此这意味着其中有 5 个对象。
我试过使用imregionalmax()
,但我觉得它没有用,因为我的图像已经是二进制图像。我也尝试使用regionprops('Area')
,但它显示错误的数字,因为每个对象之间没有确切的空格。提前致谢
我在下面有一个二进制图像:
这是一张随机抽象图片的图像,通过使用matlab,我想做的是检测它有多少个峰值,所以我会知道其中大约有5个对象。
如您所见,其中有 5 个峰,因此这意味着其中有 5 个对象。
我试过使用imregionalmax()
,但我觉得它没有用,因为我的图像已经是二进制图像。我也尝试使用regionprops('Area')
,但它显示错误的数字,因为每个对象之间没有确切的空格。提前致谢
一个简单的方法是简单地对每一列的行求和,并使用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));