OPENCV学习笔记 提取连通区域的轮廓

方法取自Opencv2计算机视觉编程手册

图像分析的其中目标是识别并提取出这些物体。在物体检测中,我们首先要生成图像的二值图像,下一步则是提取连通区域。

二值图像的获取我们通过简单的阀值化操作和形态学开闭运算得到。

实验代码:

Matimage=imread("E:\\group.jpg",0);//提取二值图像

Mat thresholded;

Mat result;

threshold(image,thresholded,60,255,THRESH_BINARY);

bitwise_not(thresholded,result,Mat());

保存thresholded图像,命名为binary.png。
//形态学闭运算与开运算

Mat image=imread("E:\\binary.png");

Mat eroded;

Mat element(5,5,CV_8U,Scalar(1));

morphologyEx(image,eroded,MORPH_OPEN,element);

namedWindow(" Eroded Image");

imshow("Eroded Image",eroded);

Mat dilated;

dilate(image,dilated,Mat());

erode(dilated,dilated,Mat());

namedWindow("Dilated Image");

imshow("Dilated Image",dilated);
以上可以得到我们所需的二值图像
opencv中给我们提供了findContours这个函数用于提取连通区域轮廓。我们可以设置我们想要得到的轮廓大小,进行删减。
代码如下:
Mat image=imread("E:\\Dilated.png",0);

vector<std::vector<cv::Point> >contours;

findContours(image,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);

Mat result(image.size(),CV_8U,Scalar(255));

drawContours(result,contours,-1,Scalar(0),2);

imshow("Contours",result);

int cmin=100;

int cmax=1000;

vector<std::vector<cv::Point> >::iterator itc = contours.begin();

while(itc!=contours.end())

{

    if(itc->size()<cmin||itc->size()>cmax)

        itc =contours.erase(itc);

    else

        itc++;

}

Mat image2=imread("E:\\group.jpg");

drawContours(image2,contours,-1,Scalar(255,255,255),2);

imshow("image",image2);


生成的图像如下:(图像上方还是有点瑕疵的,不过可以调整二值图像优化)




  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值