matlab 查找峰值图像
matlab find peak images
我有一个二值图像如下:
这是一个随机抽象图片的图像,通过使用matlab,我想做的是检测它有多少个峰,这样我就知道里面大约有5个物体。
如你所见,里面有5个峰,也就是说里面有5个物体。
我试过使用 imregionalmax()
,但我发现它没有用,因为我的图像已经是二进制图像了。我也尝试使用 regionprops('Area')
,但它显示错误的数字,因为每个对象之间没有确切的空格。提前致谢
因为你的它们是峰,它们是垂直结构。所以在这种特殊情况下,你可以使用 projection histograms (also know as histogram projection function): 你让所有的黑色像素都像受到重力影响一样下落。然后你会发现图像底部有一条黑色像素曲线。然后就可以数峰的数量了
算法如下:
- 反转图像(黑色通常是缺少信息)
- Histogram projection
- 关闭和打开以清除信号并获得the final result。
- 您可以添加最大值检测以获得峰顶。
一个简单的方法是简单地对每一列的行求和,然后使用 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));
我有一个二值图像如下:
这是一个随机抽象图片的图像,通过使用matlab,我想做的是检测它有多少个峰,这样我就知道里面大约有5个物体。
如你所见,里面有5个峰,也就是说里面有5个物体。
我试过使用 imregionalmax()
,但我发现它没有用,因为我的图像已经是二进制图像了。我也尝试使用 regionprops('Area')
,但它显示错误的数字,因为每个对象之间没有确切的空格。提前致谢
因为你的它们是峰,它们是垂直结构。所以在这种特殊情况下,你可以使用 projection histograms (also know as histogram projection function): 你让所有的黑色像素都像受到重力影响一样下落。然后你会发现图像底部有一条黑色像素曲线。然后就可以数峰的数量了
算法如下:
- 反转图像(黑色通常是缺少信息)
- Histogram projection
- 关闭和打开以清除信号并获得the final result。
- 您可以添加最大值检测以获得峰顶。
一个简单的方法是简单地对每一列的行求和,然后使用 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));