2 找图像连通域_图像连通域提取(基于OpenCV3)

主要基于connectedComponents()函数;

int cv::connectedComponents	(InputArray image, 
                                 OutputArray 	labels,
                                 int 	connectivity,
                                 int 	ltype,
                                 int 	ccltype 
)	

输入图像必须是二值图像,如果不是,请先进行二值化。

connectivity:可选择4连通或8连通,即 connectivity = 4或8;

ltype:输出label图像的type

return N,代表共有N-1个标签,其中0为背景标签,注意默认原图黑色的为背景。

示例:

        string file_name("C:/Users/XXXX.png");//路径,改成自己的
	Mat image = imread(file_name, 0);
	Mat imageShold;
	threshold(image, imageShold, 100, 255, THRESH_BINARY);//二值化

	Mat labels;
	int n_comps = connectedComponents(imageShold, labels, 4, CV_16U);
	cout << "轮廓数" << n_comps << endl;

        //draw
	int rows = image.rows;
	int cols = image.cols;
	Mat src_color;// = Mat::zeros(imageShold.size(), CV_8UC3);
	src_color.create(rows, cols, CV_8UC3);
	src_color = Scalar::all(0);
	for (int x = 0; x < rows; x++)
       {
             for (int y = 0; y < cols; y++)
		{
			int label = labels.at<__int16>(x, y);//注意labels是CV_16U类型
			if (label == 0)
			{
				src_color.at<Vec3b>(x, y) = Vec3b(255, 255, 255);
				continue;
			}
			src_color.at<Vec3b>(x, y)[0] = (label*10*10*10) % 255;
			src_color.at<Vec3b>(x, y)[1] = (label*10*10) % 255;
			src_color.at<Vec3b>(x, y)[2] = (label*10) % 255;
		}
        }	
	imwrite("C:/Users/XXXXXXX.png", src_color);//路径,改成自己的

输入:

908be6cf7d8a08a79cd1e23c9169b467.png

输出:

449ba2dc3f2a8edc4830f886bcc9995a.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值