OpenCV实现图像中相邻区域的连接并进行合并

这篇具有很好参考价值的文章主要介绍了OpenCV实现图像中相邻区域的连接并进行合并。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述:
在进行图像分割时,由于分割效果不够理想,使得两相邻区域间存在未分割的情况。如果使用合并boundingBox的方式来处理,势必又会引入更多无关的区域,从而增加了分割的难度。因此本文考虑对两区域进行连接并寻找连接后的凸包,从而实现相邻区域合并,以便于后续处理。
opencv 轮廓合并,OpenCV,C++学习,opencv,计算机视觉,图像处理,c++

图1 原始图像以及其boundingBox

算法思路:
提取轮廓->计算轮廓间的距离->连接小于阈值T的两个轮廓->寻找凸包并进行填充
opencv 轮廓合并,OpenCV,C++学习,opencv,计算机视觉,图像处理,c++

图2 连接相邻区域(蓝线)和相应的凸包

由图2显而易见,该方法相比与合并boundingBox的方式减小无关的区域。

完整实现代码如下:文章来源地址https://www.toymoban.com/news/detail-526196.html

vector<Point> GetPoint(vector<Point> contour)
{
	cv::Rect rect = cv::boundingRect(cv::Mat(contour));
	Point up, down, left, right;
	up.x = rect.x + rect.width / 2;
	up.y = rect.y;
	vector<Point> p1;
	p1.push_back(up);
	down.x = rect.x + rect.width / 2;
	down.y = rect.y + rect.height;
	p1.push_back(down);
	left.x = rect.x;
	left.y = rect.y + rect.height / 2;
	p1.push_back(left);
	right.x = rect.x + rect.width;
	right.y = rect.y + rect.height / 2;
	p1.push_back(right);
	return p1;
}
void ConnectNearRegion()
{
	Mat src = imread("D:\\PyProject01\\images\\metal.png");
	Mat gray, imageBw;
	cvtColor(src, gray, CV_BGR2GRAY);
	threshold(gray, imageBw, 0, 255, CV_THRESH_BINARY);
	//腐蚀
	/*cv::Mat element = cv::getStructuringElement(MORPH_RECT, Size(3, 3));
	Mat metalMask;
	cv::erode(imageBw, metalMask, element);*/
	vector<vector<Point>> boundingPoints;
	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;
	findContours(imageBw, contours, hierarchy, CV_RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());
	//每个轮廓都只提取四个点
	for (int i = 0; i < contours.size(); ++i)
	{
		vector<Point> p1 = GetPoint(contours[i]);
		boundingPoints.push_back(p1);
	}
	//计算轮廓间的距离
	for (int i = 0; i < contours.size(); ++i)
	{
		cv::Rect rect = cv::boundingRect(cv::Mat(contours[i]));
		//rectangle(imageBw, rect, Scalar(200,0,255), 1);
		vector<Point> p1 = contours[i]; // boundingPoints[i];
		for (int i1 = i+1; i1 < contours.size(); ++i1)
		{
			vector<Point> p2 = contours[i1];// boundingPoints[i1];
			//分别求p1和p2的四个点距离
			float T = 10;
			int flag = 0;
			for (int i2 = 0; i2 < p1.size(); i2++)
			{
				for (int i3 = 0; i3 < p2.size(); i3++)
				{
					float d = sqrt(pow(float(p1[i2].x - p2[i3].x), 2) + pow(float(p1[i2].y - p2[i3].y), 2));
					if (d < T)
					{
						line(imageBw, p1[i2], p2[i3], Scalar(255, 0, 0), 1, LINE_AA, 0);
						flag = 1;
						break;
					}
				}
				if (flag)
					break;
			}
		}
	}
	imshow("", imageBw);
	waitKey();
	//find convex
	vector<vector<Point>> contours2;
	vector<Vec4i> hierarchy2;
	//find image contours
	findContours(imageBw, contours2, hierarchy2, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());
	vector<vector<Point>>hull2(contours2.size());
	//get convex
	Mat filling = Mat::zeros(imageBw.size(), CV_8UC1);
	for (int i = 0; i < contours2.size(); i++)
	{
		convexHull(Mat(contours2[i]), hull2[i], false);
		fillPoly(filling, hull2[i], Scalar(255));
	}
	imshow("", filling);
	waitKey();
}

到了这里,关于OpenCV实现图像中相邻区域的连接并进行合并的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Opencv】图像分割——区域生长

    Python 3.8.8 PyCharm 2021 opencv-python   区域生长的基本思想是将具有相似性质的像素集合起来构成区域。具体先对每个需要分割的区域找一个种子像素作为生长的起点,然后将种子像素周围邻域中与种子像素具有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定

    2024年02月05日
    浏览(41)
  • Python+OpenCV 实现图像位平面分层进行图像信息隐藏

     闲言:这篇博客回归了传统图像处理领域,主要是在研究生的数字图像处理课程上接触到了新的知识–图像位平面,觉得还挺有意思的,可以用来做信息隐藏,索性记录一下。因为拖延的缘故,到学期末才赶出来一篇,后续可能还会有一篇消除图像摩尔纹的trick介绍(如果

    2024年02月11日
    浏览(36)
  • OpenCV实战(3)——图像感兴趣区域

    在实际应用场景下,图像处理函数有时只需要应用于图像的部分区域。 OpenCV 中使用了一种优雅而简单的机制来定义图像中的子区域并将可以将其视为常规图像进行操作。本节中,我们将学习如何定义图像内的感兴趣区域 ( region of interest , ROI )。 为了说明如何定义感兴趣区域

    2024年02月09日
    浏览(64)
  • OpenCV截取图像的某一区域

    案例:加载一张彩色图片,并截取其中的部分输出。  

    2024年02月12日
    浏览(48)
  • c++ OpenCV——提取图像的局部区域

    有时候整幅图像需要采取局部,如何进行采取呢。方案如下: 确定裁剪区域的大下 将原图copy一份,原图备用,防止损坏 将copy的图进行裁剪 原图: copy图及需要裁剪的部分: 裁剪图:

    2024年02月09日
    浏览(42)
  • 10---OpenCV:图像进阶操作之连通区域分析

    图像的连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域,连通域分析是指在图像中寻找出彼此互相独立的连通域并将其标记出来 。提取图像中不同的连通域是图像处理中较为常用的方法,例如在车牌识别、文字识别、目标检测等领域对感兴趣区域分割与识别

    2024年02月16日
    浏览(46)
  • 使用OpenCV对旋转矩形区域的内容进行裁剪

    再做OCR的时候,我想单独把矩形的区域裁剪出来,因此对这个问题进行了一些探索,最后得到的具体步骤如下: 使用cv2.minAreaRect()函数获取旋转矩形的中心点、宽度、高度和旋转角度信息。 使用cv2.getRotationMatrix2D()函数获取旋转矩阵。 使用cv2.warpAffine()函数根据旋转矩阵进行旋

    2024年02月15日
    浏览(41)
  • OpenCv (C++) 使用矩形 Rect 覆盖图像中某个区域

    推荐参考博客:OpenCV实现将任意形状ROI区域置黑(多边形区域置黑) 比较常用的是使用 Rect 矩形实现该功能,代码如下: 效果如下: 推荐参考博客:OpenCV 中 cv::Rect 矩形类用法 cv::Rect 用于创建矩形,API 参数如下: 源码如下:

    2024年02月16日
    浏览(34)
  • OpenCv案例(九): 基于OpenCvSharp图像分割提取目标区域和定位

    以下原图中,物体连靠在一起,目的是将其分割开,再提取轮廓和定位 原图:   最终效果: 麻烦的地方是,分割开右下角部分,两个连在一起的目标物体,下图所示:  基本方法:BoxFilter滤波、二值化、轮廓提取,凸包检测,图像的矩 代码如下: 灰度图像后图像二值化:

    2024年02月11日
    浏览(36)
  • 图像处理(二)之 基于OpenCV的水泥裂缝检测(区域延申)

    一、基本逻辑思路 1. 读取图形、修改尺寸、灰度图转换 2. 直方图均衡化 原理:         直方图均衡化通常是对图像灰度值进行归一化的方法,并且可以增强图像的对比度;         图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩

    2023年04月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包