在Python-OpenCV中找到轮廓峰

时间:2018-03-20 18:39:51

标签: python-2.7 opencv image-processing

我有一个包含四个人的二进制图像/轮廓,我想检测/计算所有人类。由于存在遮挡,所以我认为最好在所有人的轮廓中获得头部/最大值。在那种情况下,可以计算人类。 我能够得到global maxima\topmost point(就微积分语言而言),但我希望获得所有local maximas

找到最高点的代码是Adrian在他的博客中提出的建议,即:

  

topmost =元组(largest_contour [largest_contour [:,:1] .argmin()] [0])

任何人都可以建议如何获取所有local maximas,而不仅仅是最顶级的位置? 以下是我的图片示例:

enter image description here

1 个答案:

答案 0 :(得分:0)

“局部最大值”的定义可能很难确定,但如果你从一个简单的方法开始,你就会发展直觉以进一步观察。即使网上有可用的方法来为您完成这项工作,在使用Google搜索之前,自己也应该自己实施一些基本技术。

我在路径中使用的一个简单方法是这样的:

  1. 将轮廓视为(x,y)坐标的数组/列表/容器。
  2. 在列表中的每个元素N(像素)处,获得N-D和N + D处的像素;即当前像素前面的像素D和当前像素后面的D
  3. 计算点对点距离
  4. 计算从N-D到N + D
  5. 的轮廓距离
  6. 计算(distanceAlongContour)/(点对点距离)
  7. ...
  8. 还有很多其他方法可以做到这一点,但这很快就可以从头开始实施,我认为这是一个合理的起点:比较“测地线”距离和欧几里德距离。

    其他一些可能性:

    • 将一堆曲线拟合到轮廓中的像素块。 (这里有很多细节需要调查。)
    • 使用Ramer-Puecker-Douglas将轮廓渲染为多边形,然后选择参数以确保这些多边形得到适当简化。 (我今天第二次提到R-P-D;它很方便。)检查角度偏离180度的顶点。
    • 尝试角落探测器。原油,但易于实施。
    • 实现在轮廓列表中从一个像素移动到下一个像素的边缘跟随器,并在像素移动方向时计算某种“惯性”。这在逐个像素的基础上没有用,但是你可以比较像素N-1,N,N + 1到像素N + 1,N + 2,N + 3。或者只计算它们之间的角度。