OPENCV C++(四)形态学操作+连通域统计

形态学操作

先得到一个卷积核

cpp 复制代码
Mat kernel = getStructuringElement(MORPH_RECT,Size(5,5));

第一个是形状 第二个是卷积核大小

依次为腐蚀 膨胀 开运算 闭运算

cpp 复制代码
Mat erodemat,dilatemat,openmat,closemat;
	morphologyEx(result1, erodemat, MORPH_ERODE, kernel);
	morphologyEx(result1, dilatemat, MORPH_DILATE, kernel);
	morphologyEx(result1, openmat, MORPH_OPEN, kernel);
	morphologyEx(result1, closemat, MORPH_CLOSE, kernel);

tips:这些都是针对于二值化图像操作的

单独的也有 例如腐蚀函数

cpp 复制代码
erode(thresh_Mat1, erode_Mat1, element, Point(-1, -1), 2);

这个-1 -1是默认的 不变

2是做两次腐蚀的意思

连通域标记

先定义返回的值

cpp 复制代码
Mat stats;
Mat centroids;
Mat labels;

stats:记录了每个连通区域的信息,是一个5列的矩阵,每一行对应一个连通区域,分别为连通区域外接矩形的x、y、width、height和面积,例如stats[0][4]就是第一个连通区域的面积

centroids:连通域的中心点,没什么大用

labels:输出的labels是一个和原图一样大小的矩阵,原图中检测到的连通图的位置,对应的labels矩阵值为1,其余值为0,算是一种特殊的标记

连通域函数

cpp 复制代码
int nComp = connectedComponentsWithStats(dilatemat, labels, stats, centroids, 8, CV_32S);

处理的图像(膨胀后的图一般是)

输出矩阵(上面有描述)

连通域信息

中心点

8代表8连通,4代表4连通

CV_32S默认参数

ncomp返回的是有几个连通域,但也包括了背景。

标记连通域方法

cpp 复制代码
for (int i = 1; i < nComp; i++)
	{
		//定义Rect类
		Rect bandbox;
		


		
		bandbox.x = stats.at<int>(i, 0);
		bandbox.y = stats.at<int>(i, 1);

		bandbox.width = stats.at<int>(i, 2);
		bandbox.height = stats.at<int>(i, 3);
		
		rectangle(image, bandbox, CV_RGB(255,255,255), 1, 8, 0);
	}

这里stats是连通域信息,为什么不能用stats[i][x]这样呢 因为stats是Mat类型,而不是数组类型,所以要按照规定来以后都这样写

焊点的统计

需要用腐蚀操作将线腐蚀掉

回形针的统计

需要利用开运算 膨胀一点图像

需要利用长宽比统计数目 因为图片中有瑕疵,左边有白色痕迹

cpp 复制代码
for (int i = 1; i < nComp5; i++)
	{
		int width = stats5.at<int>(i, 2);
		int height = stats5.at<int>(i, 3);
		int ratio = height / width;
		if (ratio > 10)
		{
			nComp5--;
		}
	}

一般很多都需要这样判断统计的,这是利用长宽比 还有面积等等等

相关推荐
Narutolxy2 小时前
大模型数据分析破局之路20250512
人工智能·chatgpt·数据分析
浊酒南街2 小时前
TensorFlow中数据集的创建
人工智能·tensorflow
2301_787552874 小时前
console-chat-gpt开源程序是用于 AI Chat API 的 Python CLI
人工智能·python·gpt·开源·自动化
layneyao4 小时前
AI与自然语言处理(NLP):从BERT到GPT的演进
人工智能·自然语言处理·bert
jndingxin5 小时前
OpenCV 的 CUDA 模块中用于将多个单通道的 GpuMat 图像合并成一个多通道的图像 函数cv::cuda::merge
人工智能·opencv·计算机视觉
格林威5 小时前
Baumer工业相机堡盟工业相机的工业视觉中为什么偏爱“黑白相机”
开发语言·c++·人工智能·数码相机·计算机视觉
灬0灬灬0灬6 小时前
深度学习---常用优化器
人工智能·深度学习
_Itachi__6 小时前
Model.eval() 与 torch.no_grad() PyTorch 中的区别与应用
人工智能·pytorch·python
白光白光6 小时前
大语言模型训练的两个阶段
人工智能·机器学习·语言模型
巷9557 小时前
OpenCV图像金字塔详解:原理、实现与应用
人工智能·opencv·计算机视觉