APP下载

基于干涉条纹骨架的毛刺去除算法

2020-06-04梅启升梁秀玲

应用光学 2020年2期
关键词:端点毛刺邻域

梅启升,王 敏,梁秀玲

(福建师范大学 医学光电科学与技术教育部重点实验室 福建省光子技术重点实验室,福建 福州 350007)

引言

毛刺去除是将骨架的主干保留,去除骨架中的毛刺部分,在图像处理领域应用广泛,常用于干涉条纹检测、指纹识别、字符检测等多个领域。干涉条纹骨架记录了干涉场的所有干涉条纹的分布特征与状态特征。传统的骨架去除算法[1-2]需要设定阈值来判断毛刺去除条件,但是对于部分毛刺可能会出现不满足阈值设定的条件,无法消除干涉条纹骨架的毛刺部分,且毛刺可能出现较为复杂的情况,传统算法也可能无法解决这些情况的干涉条纹骨架图像处理问题[3]。

干涉条纹图像是两束相干性较强的光波(多用于激光)进行干涉行为产生的现象,而干涉条纹骨架最大程度细化了干涉条纹,保留了干涉条纹最基础的信息:分布与状态。骨架分布表示干涉条纹的分布情况,骨架状态表示干涉条纹的长度、拓扑性[4]等特征。在图像分割算法正确的前提下,大部分的毛刺是由于背景噪声的干扰而产生的,而且毛刺的长度是无法确定的。另外,主干、毛刺的顶端也有可能存在其他毛刺,这种情况使得传统的去除毛刺方案非常不理想,甚至出现方案错误处理的情况。因此,本文针对单像素骨架图像提出一种基于骨架结构的毛刺去除算法,以适应各种不同状态、特征的毛刺,并在去除毛刺的同时保留骨架主干部分。本文提出的算法包含2 个方面:1)通过干涉条纹骨架图,利用骨架特征点对图像区域进行分类;2)利用骨架特征点追踪出所有毛刺点并予以删除处理,当出现较为复杂的骨架特征时,利用多种类型综合定义该特征并予以区分。毛刺去除的难点在于需要保留主干部分、去除毛刺部分,这里需要考虑到多种复杂类型毛刺的层次关系,避免出现毛刺处理错误的情况。本文利用迭代算法逐次去除某一层次毛刺,确保复杂情况下的干涉条纹骨架毛刺能够通过正确的顺序进行去除。最后基于OpenCV 库对多个毛刺样本进行同时仿真处理,并依据最终处理的结果提出合理的改进意见。

1 干涉条纹骨架毛刺去除算法原理

本文算法主要框架:分析拓扑特征、毛刺分组、去除毛刺、迭代判断。第1 步,对图像进行预处理并根据预处理后的骨架毛刺特征选取出端点、节点。第2 步,通过端点与方向链码遍历出所有毛刺点,并根据节点对毛刺分组。第3 步,对同一节点的所有毛刺组进行差分运算并去除毛刺,保留主干部分。第4 步,对处理后的图像重新进行拓扑分析,判断是否完全除去了毛刺点。

1.1 骨架毛刺特征分析

在单像素骨架图像中,根据八邻域范围内的特征对骨架图像进行拓扑分析。定义本身是骨架点而且在八邻域中有且只有1 个相连点的像素为端点,定义本身是骨架点而且在八邻域有且只有2 个不相邻点的像素为骨架点。对于其他简单骨架毛刺情况,定义本身是骨架点且八邻域中有大于等于3 个相连点的像素为可疑节点,如果可疑节点的八邻域中没有其他可疑节点,那么该点定义为真节点,否则将一个八邻域中有4 个或4 个以上的可疑点的像素作为真节点,其他作为假节点。一般骨架毛刺的情况如图1所示。

图1 干涉条纹骨架毛刺的特征点Fig.1 Characteristic points of interference fringe skeleton burrs

图1中:G 为骨架点,D 为端点,F 为假节点,P 为真节点,整个干涉条纹都可以通过这些干涉条纹骨架特征点进行划分。而毛刺点、骨架主干点都可以通过拓扑特征与这些特征点相关联。面对多种其他的复杂毛刺情况,根据对蔡超等[5]的文献进行研究,加入了多种其他复杂的骨架毛刺特征样本,如图2所示。

图2中:F 为假节点,P 为真节点,其他数值为1 的是骨架点。图1、图2能够比较详细地表示毛刺的大部分状态。本文基于迭代模式进行多级去除骨架毛刺,但是只有基于骨架毛刺的特征点选取正确,才能有效去除毛刺。

图2 复杂毛刺的特征结构Fig.2 Characteristic structure of complex burrs

1.2 去除毛刺算法

本文提出一种基于节点的迭代去除毛刺算法,需要考虑以下几个方案。

1)判断迭代终止条件。迭代终止意味着一条干涉条纹骨架处理完毕。如果一个干涉条纹骨架只有一条主干、多个毛刺组成,不存在骨架主干分支部分,那么迭代终止条件为

式中:flag为迭代判断变量;endpoint为端点个数。当一条干涉条纹骨架只有2 个端点时,则一条干涉条纹处理完毕,否则接着循环处理当前的干涉条纹骨架直到满足判断条件。

2)选取毛刺并去除的方法。毛刺是由节点引出的一条细线,该细线是由干涉条纹图像的背景噪声造成的。通过端点可以利用方向链码[6]将毛刺追踪至节点,然后将同一节点下的所有毛刺、主干进行差分比较。当端点数个数大于3 个时,保留像素点个数最多的骨架部分作为第一次处理结果;当端点个数等于3 个时,删除像素点个数最少的毛刺;当对不同节点下的毛刺时,不进行差分比较处理。

式中:Trunk为保留下来的骨架;Max为取最大骨架的函数;Delete为删除处理的函数;Min为取最小毛刺的函数;burr1、burr2、trunk为所有毛刺与主干;P为节点;endpoint为端点个数。该算法是基于干涉条纹骨架主干部分只有2 个端点,其他端点是毛刺产生的。

3)骨架主干与毛刺分类问题。如果存在复杂骨架的情况,在存在3 个以上端点的情况下出现两个主干部分进行比较,采用阈值判断条件。阈值判断条件设置如下:

式中:Trunk为保留下来的骨架;Max为取最大骨架的函数;Skip processing为跳过本次处理;burr1、burr2、trunk为同一节点下的所有毛刺与主干;TN为骨架主干个数。这种阈值判断的目的不是选取毛刺而是保存骨架主干。

4)修复单条骨架断点部分的方案。如果干涉条纹骨架主干部分产生了断点,本文用基于八邻域的简单修复,修补方案如下:如果本身像素点不是骨架点,而且八邻域内存在2 个对称的骨架点,则将本身像素点设置为骨架点(见图3)。

图中K 周围存在2 个对称的骨架点,这种情况将K 点设置为骨架点,数值设置为1。这种基于模板的修补方案能够有效提升算法的容错性,并提升骨架样本进行仿真的鲁棒性。

5)多条干涉条纹骨架毛刺处理方法。干涉条纹图像可能存在多个干涉条纹,细化得到的图像依旧是多个干涉骨架。多个干涉条纹骨架需要分级处理,首先对不同干涉条纹简单标定级次,提取不同级次的骨架图进行独立处理,单条骨架处理结果单独保存,直到所有骨架处理完毕之后将所有骨架图合并输出。

图3 基于八邻域模板的修复方案Fig.3 Repair scheme based on 8 neighborhood template

根据以上所有方案,本文基于节点的迭代去除毛刺算法步骤如下:

1)对干涉条纹骨架进行级次标记,对不同级次的骨架单独处理,并进行循环准备;

2)首先设置迭代条件,并正确判断图内的所有干涉条纹骨架、端点、节点、断点;

3)修补断点,并根据端点利用八邻域模板进行毛刺追踪到节点终止,并以节点保存所有毛刺、主干的长度与骨架点坐标;

4)设置主干阈值条件,防止出现错误去除主干部分,并根据节点逐级对毛刺进行删除;

5)去除毛刺结束后进行迭代判断,如果满足条件,跳出当前骨架处理进入下一条骨架进行处理,否则骨架没有处理完毕还存在其他毛刺接着跳至第3 步进行迭代;

6)所有干涉条纹骨架处理完毕,一起输出当前所有条纹骨架图片。

2 去除毛刺算法的仿真实验

实验采用Visual Studio 2017 平台,采用OpenCV库[6]对图像进行形态学骨架提取,软件环境Windows7,硬件环境CPU 为i7 处理器。首先建立一个C++项目,并包含OpenCV 的库目录,最后建立一个头文件和主程序文件。用imread 函数[7]读取待处理的图像,并通过imshow 函数进行复现[8]。

首先对干涉条纹进行级次标定,单次级次标定采用种子点膨胀算法如下:

式中:H为单条骨架提取图像;F为骨架的原图像;I为设置的种子点;D为dilate 膨胀处理;RDF(I)表示对种子点D进行迭代膨胀处理,直到与种子点膨胀到与对应干涉条纹相同,一个种子点可以膨胀一条骨架,提取出一条骨架之后,要把原图像中的对应骨架去除以便进行下一次提取。种子膨胀提取算法如图4所示。

图4 种子膨胀提取算法Fig.4 Seed expansion extraction algorithm

选取出单条骨架之后,需要对骨架进行预处理防止出现非单像素宽度的问题,这里采用的是Zhang氏细化算法[9]、Rosen 细化算法[10]。在此之后,进行图像骨架特征点[11]提取,根据本文第1 节的骨架特征提取出端点、假节点、真节点。端点、节点的选取需要通过全图扫描逐点判断并标记,直到全图扫描完毕,如图5所示。

特征点选取出来之后,对所有端点进行链表追踪,追踪时面对复杂图像可能出现追踪过度或者追踪不足的情况,本文根据节点的特性[12],在追踪的算法中加入了以下判定条件:如果追踪点的八邻域中存在真节点,那么循环终止。这里有效利用了节点的特征,同时也为毛刺分类端点打下基础。

图5 特征点提取Fig.5 Feature points extraction

根据节点对端点追踪到的毛刺、主干进行分类,如果多个毛刺、主干追踪到同一个节点那么多个毛刺、主干分步保存至OpenCV 中的vector<vector>Point 类中,这个类表示一个二重元胞[13],其中元胞内保存的是追踪毛刺点、主干点的坐标。根据节点与毛刺、主干的位置关系将毛刺、主干点的所有坐标保存在vector 类的多维元胞中。然后根据第1 章的方案进行差分比较去除毛刺,如图6所示。

单个条纹处理完毕之后,进行多个骨架迭代处理[14]直到所有干涉骨架都去除毛刺完毕才最终输出到最终结果上,如图7所示。

图6 去除毛刺Fig.6 Deburring

图7 最终处理结果Fig.7 Final processing results

3 结果分析

干涉条纹获取的实验装置有632.8 nm 半导体激光器、扩束镜、偏振元件、分光棱镜、1/4 玻片、待测元件、标准样板等。采用的算法是基于干涉条纹骨架的特征进行的毛刺去除算法,为了保证提出的算法具有合理性与普适性,本文用了多个样本进行算法处理,处理结果如图8所示。

对实例样本进行毛刺去除处理,对其处理结果进行验证:扫描处理结果图中的所有断点、分叉点(节点)、端点,如果处理结果图中每一条骨架主干只包含2 个端点,没有断点、分叉点(节点),则处理结果正确,否则处理的结果错误。根据上述的验证方案,本文给出的实例测试结果都满足要求。为了验证算法的普遍性,对样本库中所有毛刺图像进行处理和验证,发现毛刺去除算法的正确率为94%。剩余6%的毛刺图像中包含了更加复杂的黏连情况,多条毛刺与其他骨架主干部分存在“黏连”,需要进行节点扫描,并运用八邻域追踪的处理,将毛刺黏连部分提取出来,再予以处理[15]。

图8 多个样本的处理结果Fig.8 Processing results of multiple samples

通过上面多种骨架的验证,不难发现该种算法具有合理性与普适性。为了在保证处理结果不变的前提下,提升算法的容错性,防止出现主干中的单个像素识别错误当做毛刺处理了,本文添加了骨架修复[16]部分。传统的毛刺去除算法简单地将分叉点(节点)以外的主干、毛刺部分同时进行删减阈值长度,这种方案简便但具有盲目性,而本文中介绍的算法保留了骨架主干部分,具有较高的针对性,只去除骨架中的毛刺部分。

4 结论

本文根据骨架结构特征对干涉条纹骨架的主干、毛刺部分进行提取并差分比较,通过差分比较的结果进行骨架毛刺去除处理,提出一种识别多种特征点的思路,基于该思路进行毛刺图像分析。由于干涉条纹骨架可能存在多级毛刺且毛刺长度有长有短,本文基于节点分类的多个毛刺、骨架差分算法处理,相较于传统的阈值法去除毛刺更具有合理性。本文为预防处理不完整的情况设定了迭代循环去除毛刺,为预防处理过度的情况设定了主干修补模块,相较于传统固定模板的处理方案更加具有灵活应变能力与容错能力。不足之处在于骨架特征点的提取是否能够应对更为复杂的干涉条纹骨架毛刺样本,这个有待验证与提升。其次在于如果存在毛刺部分、主干部分长度相同但是形态不同的部分需要如何处理,这也有待新的算法提出。但是总体来说,本文算法能够处理大多数干涉条纹骨架毛刺图片,是一种行之有效的处理算法。

猜你喜欢

端点毛刺邻域
基于混合变邻域的自动化滴灌轮灌分组算法
非特征端点条件下PM函数的迭代根
阀芯去毛刺工艺研究
一种铸铁钻孔新型去毛刺刀具的应用
稀疏图平方图的染色数上界
一种筒类零件孔口去毛刺工具
不等式求解过程中端点的确定
基于邻域竞赛的多目标优化算法
可抑制毛刺的钻头结构
关于-型邻域空间