opencv 图像连通域分析 -金沙1005

opencv 图像连通域分析一、简介图像的连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域,连通域分析是指在图像中寻找出彼此互相独立的连通域并将其标记出来。提取图像中不同的连通域是图像处理中较为常用的方法,例如在车牌识别、文字识别、目标检测等领域对感兴趣区域分割与识别。一般情况下,一个连通域内只包含一个像素值,因此为了防止像素值波动对提取不同连通域的影响,连通域分析常处理的是二值化后的图像。二、connectedcomponents()函数intcv::connectedcomponents(input..

图像的连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域,连通域分析是指在图像中寻找出彼此互相独立的连通域并将其标记出来。提取图像中不同的连通域是图像处理中较为常用的方法,例如在车牌识别、文字识别、目标检测等领域对感兴趣区域分割与识别。一般情况下,一个连通域内只包含一个像素值,因此为了防止像素值波动对提取不同连通域的影响,连通域分析常处理的是二值化后的图像。opencv 图像连通域分析 

int cv::connectedcomponents(
inputarray  image,//待标记不同连通域的单通道图像,数据类型必须为cv_8u。
outputarray  labels,//标记不同连通域后的输出图像,与输入图像具有相同的尺寸。
nt  connectivity,//标记连通域时使用的邻域种类,4表示4-邻域,8表示8-邻域。
int  ltype,//输出图像的数据类型,目前支持cv_32s和cv_16u两种数据类型。
int  ccltype //标记连通域时使用的算法类型标志
)
opencv 图像连通域分析

为防止网络爬虫,请关注公众号回复”口令”

激活idea 激活clion
datagrip dataspell
dotcover dotmemory
dottrace goland
phpstorm pycharm
resharper reshac
rider rubymine
webstorm 全家桶

opencv 图像连通域分析

#if  1// 连通域
int main()
{
	//对图像进行距离变换
	mat img = imread("c:\\users\473\\desktop\\opencv_images\8.png");
	if (img.empty())
	{
		printf("could not  load  image....\n");
		return -1;
	}
	mat rice, ricebw;
	//将图像转成二值图像,用于统计连通域
	cvtcolor(img, rice, color_bgr2gray);
	threshold(rice, ricebw, 50, 255, thresh_binary);
	//生成随机颜色,用于区分不同连通域
	rng rng(12345);
	mat out;
	//统计图像中连通域的个数
	int number = connectedcomponents(ricebw, out, 8, cv_16u);
	
	vector colors;
	for (int i = 0; i < number; i  )
	{
		//使用均匀分布的随机数确定颜色
		vec3b vec3 = vec3b(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256));
		colors.push_back(vec3);
	}
	//以不同颜色标记出不同的连通域
	mat result = mat::zeros(rice.size(), img.type());
	int w = result.cols;
	int h = result.rows;
	for (int row = 0; row < h; row  )
	{
		for (int col = 0; col < w; col  )
		{
			int label = out.at(row, col);
			if (label == 0)  //背景的黑色不改变
			{
				continue;
			}
			result.at(row, col) = colors[label];
		}
	}
	//显示结果
	imshow("原图", img);
	imshow("标记后的图像", result);
	waitkey(0);
	return 0;
}
#endif
int cv::connectedcomponentswithstats(
inputarray  image,//必须为cv_8u
 outputarray  labels,//标记不同连通域后的输出图像,与输入图像具有相同的尺寸。
 outputarray  stats,//不同连通域的统计信息矩阵,矩阵的数据类型为cv_32s。矩阵中第i行是标签为i的连通域的统计特性,
 outputarray  centroids,//每个连通域的质心坐标,数据类型为cv_64f
 int  connectivity = 8,//标记连通域时使用的邻域种类,4表示4-邻域,8表示8-邻域,默认参数值为8
 int  ltype = cv_32s //输出图像的数据类型,目前只支持cv_32s和cv_16u这两种数据类型,默认参数值为cv_32s
)

 opencv 图像连通域分析

#if  1 // 1.1连通域 connectedcomponentswithstats
int main()
{
	//对图像进行距离变换
	mat img = imread("c:\\users\473\\desktop\\opencv_images\8.png");
	if (img.empty())
	{
		printf("could not  load  image....\n");
		return -1;
	}
	imshow("原图", img);
	mat rice, ricebw;
	//将图像转成二值图像,用于统计连通域
	cvtcolor(img, rice, color_bgr2gray);
	threshold(rice, ricebw, 50, 255, thresh_binary);
	//生成随机颜色,用于区分不同连通域
	rng rng(10086);
	mat out, stats, centroids;
	//统计图像中连通域的个数
	int number = connectedcomponentswithstats(ricebw, out, stats, centroids, 8, cv_16u);
	vector colors;
	for (int i = 0; i < number; i  )
	{
		//使用均匀分布的随机数确定颜色
		vec3b vec3 = vec3b(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256));
		colors.push_back(vec3);
	}
	//以不同颜色标记出不同的连通域
	mat result = mat::zeros(rice.size(), img.type());
	int w = result.cols;
	int h = result.rows;
	for (int i = 1; i < number; i  )
	{
		// 中心位置
		int center_x = centroids.at(i, 0);
		int center_y = centroids.at(i, 1);
		//矩形边框
		int x = stats.at(i, cc_stat_left);
		int y = stats.at(i, cc_stat_top);
		int w = stats.at(i, cc_stat_width);
		int h = stats.at(i, cc_stat_height);
		int area = stats.at(i, cc_stat_area);
		// 中心位置绘制
		circle(img, point(center_x, center_y), 2, scalar(0, 255, 0), 2, 8, 0);
		// 外接矩形
		rect rect(x, y, w, h);
		rectangle(img, rect, colors[i], 1, 8, 0);
		puttext(img, format("%d", i), point(center_x, center_y),
			font_hershey_simplex, 0.5, scalar(0, 0, 255), 1);
		cout << "number: " << i << ",area: " << area << endl;
	}
	//显示结果
	imshow("标记后的图像", img);
	waitkey(0);
	return 0;
}
#endif

 

这文章的所属全归上面知乎的作者所有,我个人只是做个学习记录 

js555888金沙老品牌的版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由思创斯整理,转载请注明出处:https://ispacesoft.com/162948.html

(0)

相关推荐

  • uniapp中globaldata刷新后会丢失「建议收藏」globaldata只是一种变量缓存,刷新后就会丢失。解决办法:使用uniapp本地缓存

  • python 数字转换成字符串「建议收藏」数字转成字符串,使用格式化字符串:如tt=322tem=’%d’%tttem即为tt转换成的字符串 常用的格式化字符串:%d      整数%f%f    浮点数%e%e   科学计数%g%g    e和%f/%e和%f的简写 %%       输出%

  • 关于变换编码算法的(blocking artifacts)和(ringing artifacts)(一)今天再读henriques.marlvar的”biorthgonalandnonuniformlappedtransformsfortransformcodingwithreducedblockingandringingartifacts”,决定一定要做点记录不能学点忘点。关于henriques.malver的简介再开博写吧。。。。。1.变换编码的…

  • 基于stm32的智能小车(远程控制、避障、循迹)学完stm32,总是想做点东西“大显身手”一下,智能小车就成了首选项目,其核心只是就是pwm输出,i/o口引脚电平判断。制作智能小车的硬件名单:制作智能小车的硬件列表: (1)stm32c8t6核心板 一块 (2)l298n电机驱动 两个 (3)2.4g无线通讯模块 一个 (4)红外壁障模块 两个 (5)红外循迹模块 两个 (6)电源转换模块 一个 (7)18650供电电池

    2022年10月21日
  • 分组密码的工作模式中可用于认证的有哪几种_cma标识前言cmac(基于分组加密的消息认证码),一般用作消息的签名。与hmac相同的是都需要一把秘钥来加密内容得到mac,只是mac的产生方法不同,一个是用hash算法,一个是用分组加密算法。两种方法具体原理参见:https://blog.csdn.net/kkxgx/article/details/10307663实际上,cmac-128的计算结果是128位的,而aes的密钥也是128位的…

  • 如何用计算机函数来求加权总分,excel小技巧-使用函数「sumproduct」计算加权后的总和及平均值…[通俗易懂]通常小学、初中的成绩单里出现的平均分数都不需要加权,甚至也不需要用到函数,高中以上可能是因为考试制度的关系,有时候会需要用到加权分数,例如要上的大学比较重视的科目,利用「sumproduct」可以计算出加权后的分数,就算每一科所占的比例不同也能轻松算出,再配合「sum」算出平均值,不管有几个项目要算、加权的总和是多少都没问题,来看我的示范。如何使用函数「sumproduct」计算平均值?我做了一个…

  • php运算符_php中包含运算符算数运算符 '; // 换行 echo ($x – $y); //

  • python的变量命名规则有哪些_python中的变量类型thereareonlytwohardthingsincomputerscience:cacheinvalidationandnamingthings.在计算机科学领域只有两件难事:缓存失效和给东西起名字变量用的好或不好,和代码质量有着非常重要的联系,合理的使用变量,可以让你的代码可读性更高并且更加简洁。python中的变量命名规则1.变量命名2.变量命名的描述性3.变量名尽量短,但是不要太短4.合理使用变量5.变量定义尽量靠近使用6.合理使用namedtuple/

发表回复

您的电子邮箱地址不会被公开。

联系金沙1005

关注“java架构师必看”公众号

回复4,添加站长微信。

附言:ispacesoft.com网而来。

关注微信
网站地图