我在下面有一张二进制图片:
它是随机抽象图片的图像,并且通过使用matlab,我想要做的是检测它有多少个峰,所以我知道其中大约有5个对象。
如您所见,其中有5个峰值,因此它意味着有5个物体。
我已尝试使用imregionalmax()
,但我发现它没有用,因为我的图片已经是二进制图片了。我也尝试使用regionprops('Area')
,但它显示错误的数字,因为每个对象之间没有确切的空格。提前致谢
答案 0 :(得分: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));
答案 1 :(得分:0)
由于它们是峰值,它们是垂直结构。所以在这种特殊情况下,你使用projection histograms(也称为histogram projection function):你使所有的黑色像素都像重力一样受到影响。然后,您会在图像底部找到黑色像素的曲线。然后你可以计算峰值数量。
以下是算法: