轮廓opencv:如何消除二进制图像中的小轮廓
c
c++
image-processing
opencv
4
0

我目前正在从事图像处理项目。我在VC ++中使用Opencv2.3.1。我编写了这样的代码,使输入图像仅过滤为蓝色,然后转换为二进制图像。二进制映像中有一些我不想要的小对象。我想消除这些小物体,所以我使用了openCV的cvFindContours()方法来检测Binary图像中的轮廓。但问题是我无法消除图像输出中的小物体。我使用了cvContourArea()函数,但是没有正常工作..,侵蚀功能也没有正常工作。

所以请有人帮我解决这个问题。

我获得的二进制图像

在此处输入图片说明

我想要获得的结果/输出图像

在此处输入图片说明

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

好的,我相信您的问题可以通过OpenCV最近推出的包围盒演示解决。

在此处输入图片说明

您可能已经注意到,您感兴趣的对象应该在图片中最大的矩形画内。幸运的是,这段代码不是很复杂,我相信您可以通过研究和试验将其全部理解。

收藏
评论

这是我消除小轮廓的解决方案。基本思想是检查每个轮廓的长度/面积,然后从矢量容器中删除较小的轮廓。

通常你会得到这样的轮廓

Mat canny_output; //example from OpenCV Tutorial
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
Canny(src_img, canny_output, thresh, thresh*2, 3);//with or without, explained later.
findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0,0));

通过Canny()预处理,您将获得轮廓线段,但是每个线段都与边界像素一起存储为闭合环。在这种情况下,您可以检查长度并删除像

for (vector<vector<Point> >::iterator it = contours.begin(); it!=contours.end(); )
{
    if (it->size()<contour_length_threshold)
        it=contours.erase(it);
    else
        ++it;
}

没有Canny()预处理,您将获得对象的轮廓。相似,您还可以使用区域来定义消除小对象的阈值,如OpenCV教程所示

vector<Point> contour = contours[i];
double area0 = contourArea(contour);

此contourArea()是非零像素的数量

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号