opencv提取骨架找端点,根据端点去掉毛刺

vector<vector<double>> FindSkeletonEndpoint(Mat src)
{
	vector<double> xp;
	vector<double> yp;
	vector<vector<double>> fxyp;
	for (int i = 0; i < src.rows; i++)
	{
		for (int j = 0; j < src.cols; j++)
		{
			uchar gray = src.at<uchar>(i, j);
			if (gray == 255)
			{
				yp.push_back(i);
				xp.push_back(j);

			}
		}
	}
	vector<double> xyp1(2);
	vector<double> xyp2(2);
	int xIndex = 0;
	int xMax = 0;
	
	for (int i = 0; i < xp.size(); i++)
	{
		if (xMax < xp[i])
		{
			xMax = xp[i];
		}
		xIndex = i;
	}
	xyp1[0] = xp[xIndex];
	xyp1[1] = yp[xIndex];
	fxyp.push_back(xyp1);
	
	while (true)
	{
		for (int i = 0; i < xp.size(); i++)
		{
			if (xMax < xp[i])
			{
				xMax = xp[i];
			}
			xIndex = i;
		}
		
		if (abs(xyp1[0] - xp[xIndex]) > 50)
		{

			xyp2[0] = xp[xIndex];
			xyp2[1] = yp[xIndex];
			fxyp.push_back(xyp2);
			break;
		}
		auto itx = xp.begin() + xIndex;
		xp.erase(itx);
		auto ity = yp.begin() + xIndex;
		yp.erase(ity);
	}
	return fxyp;
}

三个端点

 

 去掉毛刺

Mat DeburringSkeleton(Mat src)
{
	Mat marker = Mat::zeros(src.size(), src.type());
	vector<vector<double>> xyEndPoint = FindSkeletonEndpoint(src);
	
	vector<Point2i> endPoints;
	for (int i = 0; i < src.rows; i++)
	 {
		for (int j = 0; j < src.cols; j++)
		{
			uchar gray = src.at<uchar>(i, j);
			if (gray == 255)
			{
				if ((src.at<uchar>(i - 1, j) + src.at<uchar>(i + 1, j)+ src.at<uchar>(i, j - 1)
					+ src.at<uchar>(i, j + 1)+ src.at<uchar>(i - 1, j - 1)+ src.at<uchar>(i - 1, j + 1)
					+ src.at<uchar>(i + 1, j - 1)+ src.at<uchar>(i + 1, j + 1)) ==255)
				{
					Point2i endPoint = { 0,0 };
					Point2i fendPoint = { 0,0 };
					Point2i sendPoint = { 0,0 };
					if (j!=xyEndPoint[0][0] && j!=xyEndPoint[1][0])
					{
						fendPoint.x = xyEndPoint[0][1];
						fendPoint.y = xyEndPoint[0][0];
						endPoints.push_back(fendPoint);
						sendPoint.x = xyEndPoint[1][1];
						sendPoint.y = xyEndPoint[1][0];
						endPoints.push_back(sendPoint);
						endPoint.y = j;
						endPoint.x = i;
						endPoints.push_back(endPoint);
					}
				}
				
			}
		}
	}
	cout << endPoints << endl;
		while(endPoints.size() != 2){
			int j = endPoints[2].x;
			int i = endPoints[2].y;
			src.at<uchar>(j, i) = 0;
			uchar region0 = src.at<uchar>(j - 1, i);
			uchar region1 = src.at<uchar>(j + 1, i);
			uchar region2 = src.at<uchar>(j, i - 1);
			uchar region3 = src.at<uchar>(j, i + 1);
			uchar region4 = src.at<uchar>(j - 1, i - 1);
			uchar region5 = src.at<uchar>(j - 1, i + 1);
			uchar region6 = src.at<uchar>(j + 1, i - 1);
			uchar region7 = src.at<uchar>(j + 1, i + 1);

			vector<int> regions;
			regions.push_back((int)region0);
			regions.push_back((int)region1);
			regions.push_back((int)region2);
			regions.push_back((int)region3);
			regions.push_back((int)region4);
			regions.push_back((int)region5);
			regions.push_back((int)region6);
			regions.push_back((int)region7);

			vector<Point2i> ij;
			Point2i reg0 = { j - 1,i };
			Point2i reg1 = { j + 1, i };
			Point2i reg2 = { j, i - 1 };
			Point2i reg3 = { j, i + 1 };
			Point2i reg4 = { j - 1, i - 1 };
			Point2i reg5 = { j - 1, i + 1 };
			Point2i reg6 = { j + 1, i - 1 };
			Point2i reg7 = { j + 1, i + 1 };

			ij.push_back(reg0);
			ij.push_back(reg1);
			ij.push_back(reg2);
			ij.push_back(reg3);
			ij.push_back(reg4);
			ij.push_back(reg5);
			ij.push_back(reg6);
			ij.push_back(reg7);
			vector<int> count;
			for (int h = 0; h < regions.size(); h++)
			{
                if (regions[h] == 255)
				{
					count.push_back(h);
				}	
			}
			if (count.size() == 1)
				{
				endPoints.push_back(ij[count[0]]);
				auto itx = endPoints.begin() + 2;
				endPoints.erase(itx);
				}
			if (count.size() == 2)
			{
				auto itx = endPoints.begin() + 2;
				endPoints.erase(itx);
				break;
			}
		}
		src.copyTo(marker);
	return marker;
}

 

搞定 

  • 11
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com
骨架提取是一种常用的图像处理技术,可以将图像中的细节进行提取和突出。而去毛刺是一种需要去除图像中的毛刺或噪点的处理方法。在opencv中,我们可以结合使用骨架提取和去毛刺的方法来进行图像处理。 骨架提取可以通过使用opencv库中的函数来实现。首先,我们可以使用二值化方法将图像转化为黑白图像。然后,我们可以使用opencv中的函数进行骨架提取,例如“morphologyEx”函数中的“MORPH_SKELETON”参数。这将根据图像中的像素形状提取骨架。 然而,骨架提取可能会导致一些毛刺或噪点的出现。为了去除这些毛刺,我们可以使用图像处理中的滤波器,例如中值滤波器或高斯滤波器。中值滤波器能够根据像素周围的值计算出中间值,并将图像中的噪点减小。高斯滤波器能够根据像素周围的值计算出加权平均值,从而减小图像的噪点。 为了去除毛刺,我们可以在骨架提取后应用这些滤波器。首先,我们需要将骨架提取后的图像转化为灰度图像。然后,我们可以使用opencv中的函数来应用滤波器。例如,使用“medianBlur”函数来应用中值滤波器,或使用“GaussianBlur”函数来应用高斯滤波器。通过调整滤波器的参数,我们可以逐渐去除毛刺,从而得到一张更清晰的图像。 总而言之,通过结合opencv中的骨架提取和去毛刺的方法,我们可以对图像进行有效的处理,使得骨架突出并去除图像中的毛刺

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值