【问题标题】:OpenCV - How to remove small line segments from contour?OpenCV - 如何从轮廓中删除小线段?
【发布时间】:2014-10-10 14:23:23
【问题描述】:

有没有办法从轮廓中删除小线段?

例如,在此图像中,最大轮廓由绿色指定,其近似值由蓝色指定:

由于轮廓是一组点,我想我们可以做一些事情来删除红色圆圈中的轮廓段。例如通过检测和去除小线或小子轮廓或其他方式。但我不知道我该怎么做。

请记住,我想在找到轮廓后删除它们,而不是在那之前。你知道我怎样才能删除它们吗?或者有什么想法?

【问题讨论】:

  • 我的做法是坐下来拿一张纸,画一个草图,然后用数学方法定义这些异常值的条件,例如与任一坐标的跳跃有关(此处查看异常值中的点数会有所帮助)。然后简单地过滤掉尖峰。试过这样的吗?
  • 你是怎么解决的?
  • @tobes 我无法以常规方式删除它们,我尝试通过grabcut 找到前景,然后找到它的轮廓。
  • 可以的话可以上传原图吗?
  • @JeruLuke 对不起!我找不到原件。

标签: opencv image-processing opencv-contour


【解决方案1】:

我发现 contourArea 非常适合移除小的、孤立的轮廓。这个 sn-p 说明了你可以如何进行:

findContours(edges, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);

...

// Prune contours
vector<vector<Point> > prunedContours;
for (size_t i = 0; i< contours.size(); i++)
     {
         if (contourArea(contours[i]) > minArea)
         {
           prunedContours.push_back(contours[i]);
         }
     }

如果“循环”或无关轮廓区域是感兴趣的较大轮廓的一部分,请查看approxPolyDP。原始轮廓的粗略近似可能会忽略无关特征。

【讨论】:

  • 如果你看到图像,你可以看到近似值也有不需要的线条。
  • 我假设您增加了 approxPolyDP 的 epsilon 值?绿色轮廓应在足够高的 epsilon 处“退化”为四边多边形。此外,蓝色轮廓的左下角似乎有一个环。这表明您没有按区域修剪原始轮廓列表。
猜你喜欢
  • 2020-06-14
  • 1970-01-01
  • 2016-09-25
  • 2021-07-26
  • 2011-08-18
  • 2019-03-20
  • 2014-08-23
  • 2020-07-11
  • 1970-01-01
相关资源
最近更新 更多