骨架提取算法应用

1、引言
根据个人理解,骨架提取(顾名思义)就是根据各个连通区域,将其抽离出与其轮廓近似的单像素表示形态。以便于直观观察、图像的后继处理。因此可以将其视为图像处理中的预处理,其操作是基于二值图。为了更好的提取图像骨架,必要时需要对图像进行相应的预处理(比如去噪、滤波、形态学变换等)。
我的应用主要集中在对一些包含线条型的零件检测,除此之外,骨架提取的应用特别广泛,比如文字的检测/识别、道路观测等。

2、原理
Zhang和Suen提出了一种带有模板匹配的并行细化算法,生成一个像素宽的骨架,不仅保持图像的连通性,并且产生更薄的结果,保持快速的处理速度。
Zhang-Suen细化算法通常是一个迭代算法,整个迭代过程分为两步

第一步:循环所有前景像素点,对符合如下条件的像素点标记为删除:
1)2<=N(P1)<=6
2)S(P1)=1
3)P2P4P6=0
4)P4P6P8=0
其中N(P1)表示跟P1相邻的8个像素点中,为前景像素点的个数,S(P1)表示从P2-P9-P2像素中出现0-1的累积次数,其中0表示背景,1表示前景,完整的P1-P9的像素位置分布如表1:
在这里插入图片描述
第二步:
1)2<=N(P1)<=6
2)S(P1)=1
3)P2P4P8=0
4)P2P6P8=0
循环以上两个步骤,直到两步中没有像素被标记为删除为止,输出的结果即为二值图像细化后的骨架。

3、案例核心代码

//Zhang-Sun细化算法
void SkeletonExtraction()
{
   
   
	//原图像名称
	string Img_name = "TEST.png";
	//载入源图像
	Mat Src = imread(Img_name);
	Mat src = Src.clone();
	//灰度化
	cvtColor(src, src, COLOR_RGB2GRAY);
	//Otsu求阈值
	int thre = Otsu(src);
	Mat Img;
	//二值化
	threshold(src, Img, thre, 255, THRESH_BINARY_INV);
	namedWindow("原始二值化图像", 0);
	imshow("原始二值化图像", Img);

	Mat srcImg = Img.clone();
	/****************骨架提取算法:Zhang-Suen法*****检测焊条数量************************/
	vector<Point> deleteList;
	int neighbourhood[9];
	int row = srcImg.rows;
	int col = srcImg.cols;
	bool inOddIterations = true;
	while (true) {
   
   
		for (int j = 1; j < (row - 1); j++) {
   
   
			uchar* data_last = srcImg.ptr<uchar>(j - 1);
			uchar* data = srcImg.ptr<u
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忘·月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值