使用OpenCV查找二值图中最大连通区域

上一篇博文中介绍了matlab查找最大连通区域的方法,OpenCV函数中也有类似的函数与之对应,findCoutours。下面代码为使用示例:

 cv::Mat bwImg;
	vector<vector<cv::Point>> contours ;  

	// 二值化图像
	cv::threshold(srcImg, bwImg, 0.0, 255.0, CV_THRESH_BINARY | CV_THRESH_OTSU);

	cv::imshow("binary image", bwImg);
	cv::waitKey();

	// 查找轮廓,对应连通域
	cv::findContours(bwImg,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);

	// 寻找最大连通域
	double maxArea = 0;
	vector<cv::Point> maxContour;
	for(size_t i = 0; i < contours.size(); i++)
	{
		double area = cv::contourArea(contours[i]);
		if (area > maxArea)
		{
			maxArea = area;
			maxContour = contours[i];
		}
	}

	// 将轮廓转为矩形框
	cv::Rect maxRect = cv::boundingRect(maxContour);

	// 显示连通域
	cv::Mat result1, result2;

	bwImg.copyTo(result1);
	bwImg.copyTo(result2);
	
	for (size_t i = 0; i < contours.size(); i++)
	{
		cv::Rect r = cv::boundingRect(contours[i]);
		cv::rectangle(result1, r, cv::Scalar(255));
	}
	cv::imshow("all regions", result1) ;
	cv::waitKey();

	cv::rectangle(result2, maxRect, cv::Scalar(255));
	cv::imshow("largest region", result2) ;
	cv::waitKey();
 

 


  • 15
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要找到图像中的最大连通区域,可以使用 OpenCV 中的连通组件分析函数 `cv::connectedComponents()`。 首先,将图像二值化,使得需要查找区域为白色(值为 255),其他区域为黑色(值为 0)。然后,可以使用 `cv::connectedComponents()` 函数查找图像中的所有连通区域,并标记它们的像素值。 然后,可以遍历所有的连通区域查找最大的那个。遍历时,可以使用 `cv::connectedComponentsWithStats()` 函数,它可以返回每个连通区域的一些统计信息,包括面积。通过比较面积,可以找到最大连通区域。 以下是一个示例代码,演示如何找到图像中的最大连通区域: ```cpp cv::Mat image = cv::imread("image.png", cv::IMREAD_GRAYSCALE); cv::threshold(image, image, 0, 255, cv::THRESH_BINARY); // Find connected components cv::Mat labels, stats, centroids; cv::connectedComponentsWithStats(image, labels, stats, centroids); // Find largest component int maxArea = 0; int maxLabel = 0; for (int i = 1; i < stats.rows; i++) { int area = stats.at<int>(i, cv::CC_STAT_AREA); if (area > maxArea) { maxArea = area; maxLabel = i; } } // Draw largest component cv::Mat largestComponent = cv::Mat::zeros(image.size(), CV_8UC1); for (int y = 0; y < labels.rows; y++) { for (int x = 0; x < labels.cols; x++) { if (labels.at<int>(y, x) == maxLabel) { largestComponent.at<uchar>(y, x) = 255; } } } cv::imshow("Largest Component", largestComponent); cv::waitKey(0); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值