OpenCV连通域分析

OpenCV连通域分析

输入一张二值图,输出图像中的各个连通域

连通域分析函数

int Imglabelnum = cv::connectedComponents(
	cv::InputArrayn image,   // 输入一张二值图
	cv::OutputArray labels,  // 输出标签图(和二值图一样大,每个标签值代表连通域的ID)
	int connectivity = 8,    // 4连通或是8连通方式
	int ltype = CV_32S       // 标签值类型(CV_32S or CV_16U)
);
int Imglabelnum = int cv::connectedComponentsWithStats (
	cv::InputArrayn image,      // 输入一张二值图
	cv::OutputArray labels,     // 输出标签图(和二值图一样大,每个标签值代表连通域的ID)
    cv::OutputArray stats,      // 状态矩阵
    cv::OutputArray centroids,  // 各个连通域的中心点:
	int connectivity = 8,       // 4连通或是8连通方式
	int ltype = CV_32S          // 标签值类型(CV_32S or CV_16U)
);

其中:

Imglabelnum 表示连通域的个数;

stats包含了一些信息:
	stats.at<int>(i, CC_STAT_AREA)                  //连通域的面积
	double left = stats.at<int>(i, CC_STAT_LEFT);   //连通域的boundingbox的最左边
	double top = stats.at<int>(i, CC_STAT_TOP);     //连通域的boundingbox的最上边
	double width= stats.at<int>(i, CC_STAT_WIDTH);  //连通域的宽
	double height stats.at<int>(i, CC_STAT_HEIGHT); //连通域的高

各个连通域的中心点获取方式(i表示连通域的ID):
	Point2f center;
	center.x = Imgcentriods.at<double>(i, 0);
	center.y = Imgcentriods.at<double>(i, 1);

注意:背景点,也就是二值图像中像素值为0的点的标签值为0

使用示例

cv::Mat lable;
cv::Mat labels, stats, centroids;
//连通域计算
int nccomps = cv::connectedComponentsWithStats(
	imBin,       //二值图像
	labels,      //和原图一样大的标记图
	stats,       //nccomps×5的矩阵 表示每个连通区域的外接矩形和面积(pixel)
	centroids    //nccomps×2的矩阵 表示每个连通区域的质心
);

float maxArea = (imBin.rows - 1)*(imBin.cols - 1);
for (int y = 0; y < imBin.rows; y++)
{
	for (int x = 0; x < imBin.cols; x++)
	{
		int label = labels.at<int>(y, x);
		if (label > 0)
		{
			//去除面积占比小于3%的连通域
			if (stats.at<int>(label, cv::CC_STAT_AREA) / maxArea < 0.03)
				imBin.at<uchar>(y, x) = 0;
		}
	}
}

二值图:
在这里插入图片描述
连通域分析后,删除较小连通域后的二值图:
在这里插入图片描述
做个形态学闭运算处理:
在这里插入图片描述
删除突出部分(注意,删除点不能改变其连通性):
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV提供了一些用于连通域分析的函数,可以帮助我们找到图像中的连通域(也称为连通组件)。连通域是由具有相同像素值或特定属性的像素组成的区域。下面是使用OpenCV进行连通域分析的一般步骤: 1. 首先,将图像转换为二进制形式,确保要分析的对象是白色,背景是黑色。可以使用阈值化或其他图像分割方法来实现这一点。 2. 使用OpenCV的`connectedComponents`函数执行连通域分析。该函数将返回一个标记图像和对象数量。标记图像中的每个对象都被分配一个唯一的整数值,背景像素为0。 3. 如果需要获取每个连通域的属性(如面积、边界框、中心点等),可以使用OpenCV的`connectedComponentsWithStats`函数。该函数除了返回标记图像和对象数量外,还返回一个状态矩阵,其中包含每个对象的属性。 下面是一个使用OpenCV进行连通域分析的示例代码: ```pythonimport cv2#读取图像image = cv2.imread('image.png',0) #二值化图像_, binary_image = cv2.threshold(image,127,255, cv2.THRESH_BINARY) # 连通域分析num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(binary_image) # 打印对象数量print("Number of objects:", num_labels -1) # 遍历每个对象的属性for i in range(1, num_labels): # 获取对象的面积 area = stats[i, cv2.CC_STAT_AREA] # 获取对象的边界框 x, y, width, height = stats[i, cv2.CC_STAT_LEFT], stats[i, cv2.CC_STAT_TOP], stats[i, cv2.CC_STAT_WIDTH], stats[i, cv2.CC_STAT_HEIGHT] # 获取对象的中心点 centroid_x, centroid_y = centroids[i] # 打印对象属性 print(f"Object {i}: Area={area}, Bounding Box=({x}, {y}, {width}, {height}), Centroid=({centroid_x}, {centroid_y})") ``` 请注意,此示例假设输入图像为灰度图像,如果使用彩色图像,需要进行适当的色彩空间转换。另外,该示例仅打印了对象的一些基本属性,你可以根据需要扩展代码以满足特定的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值