工业CT断层序列图像直接生成数控加工代码的方法
技术领域
本发明涉及属于图像处理和计算机辅助制造领域,特别涉及一种工业CT断层序列图像直接生成数控加工代码的方法。
背景技术
随着工业CT系统检测精度的提高,工业CT在逆向工程中的研究和应用得到了越来越广泛的关注与重视。将工件的工业CT断层序列图像转换为数控代码,通常的方法是先建立该工件的三维模型,然后导入CAM软件自动生成数控代码,三维模型的品质直接关系到数控加工的效果。目前,基于工业CT断层序列图像的三维建模主要集中在三维表面建模和三维实体模型重构这两个方面。三维表面模型一般以STL格式保存,可以直接用来快速原型,也可以用来数控加工,但是STL模型常会有些缺陷,例如,表面存在孔洞、顶点未相连、法向向量反向、面重叠等,这些缺陷会使自动数控编程系统产生错误的刀路规划路径,从而影响加工效果。三维实体模型重构可以通过专业的逆向软件进行重构或者是针对工业CT断层序列图像自主开发的实体建模软件进行重构,但是模型重构方法现在还存在很多问题,例如,曲面构建过程中,对曲线和曲面的拟合误差的分配问题,多曲面连接问题,边缘提取精度问题等。虽然可以通过修复解决STL的缺陷问题,通过大量人机交互操作解决实体重构问题,但是这些修复操作带来了误差累积、模型变形等诸多新的问题。要完全解决上述这些问题将花费大量时间和精力,严重影响了后续的数控加工进度。因此如何将工业CT断层序列图像快速有效的转换为数控加工代码,是当前急需解决的问题。
发明内容
有鉴于此,为了解决上述问题,本发明提出一种不需要进行三维建模,由工件的工业CT断层序列图像直接生成数控加工代码的方法。
本发明的目的是这样实现的:
本发明提供的工业CT断层序列图像直接生成数控加工代码的方法,包括以下步骤:
S1:提取工业CT断层序列图像的轮廓点数据;
S2:针对工业CT断层图像特征,在阈值分割图中根据轮廓点所围部分的灰度值设置标识位,并依据一个轮廓点的标识位进行判定,确定内外轮廓;
S3:将单层图像的各个轮廓向内或向外偏移进行刀具半径补偿和加工余量预留;
S4:划分加工区域,生成各断层的刀具路径;
S5:连接各层的刀具路径并生成整个工件的数控加工代码。
进一步,所述步骤S1,具体步骤如下:
S11:对工业CT断层序列图像进行图像处理得到二值化的阈值分割图像,设黑点代表的是工件实体部分,白点代表的是加工区域;
S12:提取轮廓边缘,所述轮廓边缘用黑点表示;
S13:对轮廓边缘进行去噪、细化、连接,轮廓跟踪;
S14:得到工业CT断层序列图像的轮廓点数据;
进一步,所述步骤S2,具体步骤如下:
S21:设置断层图像各轮廓点的标识位flag1,并初始化所有轮廓点的标识位flag1;取标识位flag1为0;
S22:将轮廓点数据按xy坐标系划分,x坐标相同的轮廓点划分到一列,按照y坐标从小到大的顺序排序,并存入以向量形式建立的某一层图像的列数据结构Ri,其中i表示第i列;将每列第一个和最后一个点存入列数据结构Ri中;
S23:将列数据结构Ri的起始位置和结束位置作为轮廓点数据的标识位flag1并保存在列数据结构Ri中;
S24:若同一列数据结构Ri中有3个以上连续轮廓点数据,则只保留连续轮廓点数据的两端的轮廓点,删除连续轮廓点数据中位于中间部分的轮廓点数据;
S25:对每列数据结构Ri自下往上逐对判断,若两相邻轮廓点之间,白点数多于黑点数,则两点之间为加工区域段,将第一个点的标识位flag1设置为1;反之,将第一个点的标识位flag1设置为0;每列数据结构Ri的最后一个轮廓点的标识位flag1为0;
其中,标识位flag1=1表示该轮廓点是其所在列的一段加工区域的起始点,标识位flag1=0表示该轮廓点是其所在列的一段加工区域的终点;
S26:将当前的轮廓点数据对应到二值化图像中,在二值化图像中判断对应列数据结构Ri的逐对轮廓点之间是否为加工区域段,并设置轮廓点的标识位flag1;若轮廓点对应到二值化图像中的部分对应为加工区域,则将该段区域的起始点的标识位flag1设为1;同理,若轮廓点对应到二值化图像中的部分对应为为非加工区域,则将该段区域的起始点的标识位flag1设置为0;
S27:修正轮廓点数据的标识位flag1:
S28:根据修正后的轮廓点数据标识位flag1来判断内外轮廓,将经轮廓点标识位flag1设置后的列数据结构Ri按照y值从小到大顺序进行查找,直到找到第一个属于该轮廓的轮廓点,即寻找该轮廓在本列数据结构Ri的下轮廓点;若此点的标识位flag1为1,则该点为本列的一段加工区域的起始点,可认定此轮廓为内轮廓,所围的为加工区域;反之若此点的标识位flag1为0,则此轮廓为外轮廓;
进一步,所述步骤S27中修正轮廓点数据的标识位flag1,具体步骤如下:
S271:若标识位flag1出现“11”时,将第2个轮廓点作为白点加工区域,将处理后的数据保存在列数据结构Ri;
S272:若标识位flag1出现“00”时,将第3个轮廓点作为白点加工区域,将处理后的数据保存在列数据结构Ri;
S273:若标识位flag1出现“000”时,将第3和第4个轮廓点作为白点加工区域,将处理后的数据保存在列数据结构Ri;
进一步,所述步骤S3,具体步骤如下:
对各个轮廓进行偏移,偏移量是刀具半径与加工余量之和,偏移量反映在断层图像上是所对应的像素数量;
进一步,所述步骤S4,具体步骤如下:
S41:对各轮廓点数据设置用以标识轮廓点是否已被划分到加工区域的标识位flag2,并将其初始化为0;
S42:逐列查找相邻轮廓点的标识位flag1是否为加工区域,且标识位flag2是否为未划分的加工区域,如果否,则该层的所有轮廓点都已经被划分到各个加工区域,将所有轮廓点的标识位flag2设置为1;
S43:如果是,判断两相邻列的点PQ和P′Q′是否属于同一加工区域的点,同时,将标识位flag2设置为1;
S44:如果是,则进入步骤S46;
S45:如果否,返回步骤S42继续寻找新的加工区域;直到所有加工区域判定结束;
S46:将加工区域的点按照双向铣削的走刀方式存储在刀具路径数据结构Areai中,其中,i表示该断层图像的第i个加工区域;
进一步,所述步骤S43判断两相邻列的点是否属于同一加工区域的点,具体包括以下步骤:
S431:若两相邻列的点PQ和P′Q′满足Py<Qy′且Py′<Qy,则PQ和P′Q′四点属于同一加工区域,将P′Q′的标识位flag2置1;其中,Py、Qy、Py′和Qy′分别表示两相邻列的点PQ和P′Q′的y坐标;
S432:若两相邻列的点PQ和P′Q′满足Py>Qy′或Qy<Py′,则PQ和P′Q′不属于同一加工区域;
进一步,所述步骤S5,具体步骤如下:
S51:将单层的各个加工区域连接起来可以生成单层图像的刀具路径数据结构Areai;
S52:将各层的刀具路径连接起来生成整个工件的整体刀具路径数据结构;
S53:采用直线插补的方式将整体刀具路径数据结构转换为数控加工代码;
进一步,所述S53中将刀具路径数据结构Areai转换为数控加工代码,具体步骤如下:
S531:输入工艺参数,包括切削参数、机床类型、刀具参数的设置;
S532:依次读取各个加工区域Areai中点的信息,将刀具退到安全高度,然后在安全高度将其平移到Areai+1的第一个点上方,接下来垂直向下进刀,走到Areai+1的第一个点的位置,将同一层的各个加工区域连接起来生成单层的刀具路径,得到Areai+1的数控加工代码;
S533:当本层图像所有加工区域的数控加工代码都已生成以后,将刀具退到安全高度,并将其在安全高度平移到下一层图像的起始位置上方,为下一层图像的数控加工代码生成做好准备;
S534:将各层的刀具路径连接起来生成整个工件的走刀路径,并将其转换成数控加工代码的形式输出;
进一步,所述加工区域的点存储在刀具路径数据结构Areai中,具体步骤如下:
检查加工区域对应的刀具路径数据结构Areai中最后的标识位flag1是否为1,如果是,则先存储标识位flag1为1的点,后存储标识位flag1为0的点;如果否,则先存储标识位flag1为0的点,后存储标识位flag1为1的点。
本发明的优点在于:本发明提出的由工业CT断层序列图像直接生成数控加工代码的方法,避开了繁琐的三维表面建模或三维实体建模,缩短了数控加工代码生成的时间,而且避免了误差的积累。只需要输入工件的工业CT断层序列图像,经过简单设置就可以直接输出该工件的数控加工代码。本发明具有操作方便、处理效率高等优点。
本发明的其它优点、目标和特征在某种程度上将在随后的说明书中进行阐述,并且在某种程度上,基于对下文的考察研究对本领域技术人员而言将是显而易见的,或者可以从本发明的实践中得到教导。本发明的目标和其它优点可以通过下面的说明书,权利要求书,以及附图中所特别指出的结构来实现和获得。
附图说明
为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步的详细描述,其中:
图1是工业CT断层序列图像直接生成数控加工代码的方法流程图;
图2是单层图像轮廓点的标识位flag1设置的流程图;
图3是单层图像的二值化图以及边缘轮廓示意图;
图4是第i列轮廓点的标识位flag1设置示意图;
图5是修正第i列轮廓点的标识位flag1示意图;
图6是内外轮廓判定示意图;
图7是加工区域划分;其中7a是设置标识位flag1示意图,7b是划分加工区域示意图,7c是完成的加工区域示意图;
图8是两相邻列的点是否属于同一加工区域的判定原则示意图;
图9是单层图像的刀具路径示意图;
图10是茶壶的工业CT断层序列图像;
图11是数控加工茶壶的仿真图;
图12是数控加工茶壶效果图。
具体实施方式
以下将结合附图,对本发明的优选实施例进行详细的描述;应当理解,优选实施例仅为了说明本发明,而不是为了限制本发明的保护范围。
图1是工业CT断层序列图像直接生成数控加工代码的方法流程图,如图所示:本发明提供的工业CT断层序列图像直接生成数控加工代码的方法,包括如下步骤:
S1:对工业CT断层序列图像进行图像处理得到二值化的阈值分割图像,然后提取轮廓边缘,并且对边缘进行去噪、细化、连接,得到无噪声、单像素边缘、封闭的轮廓,最后通过轮廓跟踪得到所有工业CT断层序列图像的轮廓点数据。
S2:针对工业CT断层图像特征,在阈值分割图中根据轮廓点所围部分的灰度值设置标识位,并依据一个轮廓点的标识位进行判定,确定了内外轮廓。为单层图像的各个轮廓点设置一个标识位flag1,其中标识位“flag1=1”表示该轮廓点是其所在列的一段加工区域的起始点,标识位“flag1=0”表示该轮廓点是其所在列的一段加工区域的终点;然后通过轮廓的一个下轮廓点来判断该轮廓是内轮廓还是外轮廓。从列的角度来处理一层的所有轮廓点,在各列中来判断加工区域段,所有轮廓点的标识位flag1都初始化为0。单层图像轮廓点的标识位flag1设置的流程,如图2所示。图3为单层工业CT图像的二值化图以及边缘轮廓。结合图2和图3说明具体步骤如下:
假设某工件的某一层图像的二值化结果如图3a所示,且其边缘图如图3b所示,并以此工件的第i列为例逐步进行处理。
1)轮廓点的按列划分
对于每层图像,采用的是逐列的双向铣削的加工方式,所以要从列的角度来处理本层图像的所有轮廓点。将x坐标相同的轮廓点划分为一列,按照y坐标值从小到大排序,并存入以向量形式建立的本层图像列的数据结构Ri,其中i表示第i列。由于CT扫描视场大于工件尺寸,那么所有断层序列图像最上面一行和最下面一行的点必定为加工区域段的边界点,将其作为轮廓点分别添加到各列Ri的起始和结束位置,此时每一列的轮廓点数都大于等于2,即每列至少包含一段加工区域。
图4为第i列轮廓点的标识位flag1设置示意图,图4a为图3a二值图中的第i列;图4b为图3b轮廓图中的第i列,Pi0~Pi5为本列的轮廓点,将其存储在本列的列结构Ri中;图4c中,添加了本列最上面和最下面的点,更新了Ri。
2)同一列中3个以上连续轮廓点的处理
对于一列中有3个以上连续轮廓点的情况,只保留连续轮廓点的两端点,即可确定加工区域段的位置。
在图4c中,Pi1Pi2Pi3与Pi4Pi5Pi6分别是连续的轮廓点,删除Pi2、Pi5,只保留连续轮廓的端点,最后的处理结果,如图4d所示。
3)各轮廓点的标识位flag1的设置
二值化图像中,本方法假设黑点代表的是工件实体部分,而白点代表的是加工区域,由于图像上噪声等影响,在加工区域段中可能存在少数黑点,也有可能在非加工区域中存在少数白点。对于上述情形,根据占多数的点的类型,每列自下往上逐对判断。若两相邻轮廓点之间,白点数多于黑点数,则认为两点之间为加工区域段,将第一个点的标识位flag1设置为1。反之,将第一个点的标识位flag1设置为0。每列的最后一个轮廓点必定为本列最后一个加工区域段的终点,所以其标识位flag1必为0,无需再进行设置。将当前的轮廓点对应到二值化图像中,在二值化图像中判断对应列的逐对轮廓点之间是否为加工区域段,以此来设置轮廓点的标识位flag1。将图4d中的轮廓点对应到图4a中,Pi0到Pi1之间、Pi4到Pi5之间的部分对应在图4a中为白点,即加工区域,则将两段区域的起始点Pi0和Pi4的flaf1设为1;同理,在图4a中,Pi1到Pi2之间、Pi2到Pi3之间、Pi3到Pi4之间为黑点,即非加工区域,则将这三段区域的起始点Pi1Pi2Pi3的flag1设置为0。设置完毕,本列Ri的各轮廓点的标识位flag1分别为100010,如图4d所示。这里出现了连续三个点的标识位flag1都为0的情况,并不像预期的那样,各点的标识位flag1呈现“1010…”交替的变化规律。
4)轮廓点标识位flag1的修正
按照产生原因来划分,可归纳为以下三种情况,按照将连续边界认定为非加工区域的原则,分别对这三种情况进行修正。
修正第i列轮廓点的标识位flag1,如图5所示,每幅图中包含三列,左列所示的为二值化图像中对应的列,中列所示的为轮廓图的一列;右列所示的为经过修正后所剩的轮廓点。
①出现“11”情况
此时,本列三个轮廓点的标识位flag1分别为1、1、0,出现了“11”的情况,此时可以不考虑第2个轮廓点,即把两个连续的加工区域段连成一个,修正以后的轮廓点如图5a右列所示,用处理后的结果更新本列的Ri。
②出现“00”情况
当一个非加工区域段的上轮廓或下轮廓为连续轮廓点时,5个轮廓点的标识位flag1分别为1、0、0、1、0,出现了“00”的情况。此时可以不考虑第3个轮廓点,即把连续的边界与非加工区域段连在一起,修正后的结果如图5b、5c中的右列所示,用处理后的结果更新本列的Ri。
③出现“000”情况
当两个非加工区域段之间为一段连续轮廓点时,6个轮廓点的标识位flag1分别为1、0、0、0、1、0,出现了“000”的情况,此时可以不考虑第3和第4个轮廓点,即把连续的边界与非加工区域段连在一起,修正后的结果如图5d右列或图4e所示,用处理后的结果更新本列的Ri。
通过以上设置,每列轮廓点的标识位flag1均呈“1010…”交替变化,每一对“10”间的点则是本列的一段加工区域。
5)内外轮廓判断
针对各个轮廓contour(i),在其横坐标范围(xmin,xmax)内取一列,将经轮廓点标识位设置后的列数据按照y值从小到大进行查找,直到找到第一个属于该轮廓的轮廓点,即寻找该轮廓在本列的下轮廓点。若此点的标识位flag1为1,则该点为本列的一段加工区域的起始点,可认定此轮廓为内轮廓,所围的为加工区域;反之若此点的标识位flag1为0,则此轮廓为外轮廓。如图6所示,第i列经轮廓点标识位设置后,本列Ri中的各轮廓点按照y坐标从小到大的顺序排列分别为Pi1、Pi2、Pi3、Pi4、Pi5、Pi6、Pi7、Pi8、Pi9,其flag1分别为0、1、0、1、0、1、0、1、0。以contour1为例,按照y坐标值从小到大的顺序寻找,本列第一个属于contour1的点为Pi2,这是contour1在本列的下轮廓点,而Pi2点的flag1为1,标志着Pi2点是本列的一段加工区域的起始点,即contour1所包围的是一片加工区域,所以将contour1判定为内轮廓。同理对其他三条轮廓线contour2、contour3、contour4进行判断,其对应的下轮廓点分别为Pi4、Pi5、Pi8,此四点的flag1分别为1、0、1,则contour2、contour4为内轮廓,contour3为外轮廓。
S3:将单层图像的各个轮廓向内或向外偏移进行刀具半径补偿和加工余量预留,偏移量反映在断层图像上是所对应的像素数量。
S4:划分加工区域,生成各断层的刀具路径,采用的是双向铣削的方式规划刀具路径,首先生成每一层的刀具路径,然后将其有序连接起来。单层图像刀具路径的生成步骤为:首先对偏移后的图像轮廓点重新设置标识位,如图7a所示,其中要考虑到偏移量影响,然后根据标识位划分加工区域,并把属于同一加工区域的点按照双向铣削的顺序存储,生成如图7b所示的刀具路径;最后把各个加工区域有序连接起来,即可得到本层的刀具路径。加工区域示意图,如图7c所示。
单张图像加工区域划分的方法:
第一步,通过逐列查找是否还有尚未划分加工区域的轮廓点,来寻找新的加工区域。
为各个轮廓点设置标识位flag2,并将其初始化为0,用以标志轮廓点是否已被划分到某个加工区域。当某点被划分到一个加工区域时,将其标识位flag2改为1。因此可以通过查找是否有标识位“flag2=0”的轮廓点,来查找新的加工区域。
从第一列开始查找,若存在两相邻点P、Q,其中P的标识位flag1为1,Q的flag1为0,也就是说PQ为这一列的一段加工区域,且P、Q的标识位flag2均为0,也就是说PQ这段加工区域还未划分到任何一片加工区域中,那么就设置一个新的向量Areai用来存储这个新加工区域的轮廓点,其中i表示这是这层图像的第i个加工区域。同时,将P、Q的标识位flag2置1,并将其存入Areai中。若本层的所有轮廓点都已经被划分到各个加工区域,那么所有轮廓点的标识位flag2皆为1,则找不到满足上述条件的点,本层划分加工区域的工作结束。
第二步,通过查找下一列是否存在属于同一加工区域的点,来判定此加工区域是否结束。
查找P、Q的下一列,是否存在两相邻点P′、Q′,其中它们的标识位flag1分别为1和0,且他们的标识位flag2皆为0,那么按照图8所示的两相邻列的点是否属于同一加工区域的判定原则来判定PQ、P′Q′是否属于同一加工区域。如图8所示的3组点,对于y坐标来讲,若两相邻列的点PQ和P′Q′满足Py<Qy′且Py′<Qy,则PQ和P′Q′四点属于同一加工区域,将P′Q′的标识位flag2置1;其中,Py、Qy、Py′和Qy′分别表示两相邻列的点PQ和P′Q′的y坐标;即如下所述:P1<Q1′且P1′<Q1那么认为P1Q1P1′Q1′四点属于同一加工区域;而若两相邻列的点PQ和P′Q′满足Py>Qy′或Qy<Py′,则PQ和P′Q′不属于同一加工区域,即如下所述:认为P2>Q2′的P2Q2P2′Q2′和Q3<P3′的P3Q3P3′Q3′不属于同一加工区域。
因此若在P、Q的下一列,若存在两相邻点P′、Q′,除了标识位flag1和flag2满足上述要求外,其y坐标满足P<Q′和P′<Q,那么认为PQP′Q′四点属于同一加工区域,将P′、Q′的标识位flag2置1,并进行存储。若找不到满足条件的P′、Q′,则表示此加工区域已经结束,转向第一步,继续寻找新的加工区域。
第三步,将第二步找到的点按照双向铣削的走刀顺序进行存储,重复第二步,直到此加工区域结束。
检查本加工区域对应的刀具路径数据结构Areai当前所存储的最后一点的标识位flag1,若此点的标识位flag1为1,则先存储标识位flag1同样为1的P′,后存储Q′;反之则先存储Q′,后存储P′。形成如图7b所示的双向铣削走刀路径。
S5:连接各层的刀具路径并生成整个工件的数控加工代码。具体步骤如下:
1)输入工艺参数,包括切削参数、机床类型、刀具参数等参数的设置;
2)生成单层图像的数控加工代码。按照直线插补的方式,依次读取各个加工区域Areai中点的信息,即可得到此加工区域的数控加工代码。一个Areai中的点读取完毕之后,将刀具退到安全高度,然后在安全高度将其平移到Areai+1的第一个点上方,接下来垂直向下进刀,走到Areai+1的第一个点的位置,接下来用同样的方法得到Areai+1的数控加工代码;
3)所述加工区域的点存储在刀具路径数据结构Areai中,具体步骤如下:
检查加工区域对应的刀具路径数据结构Areai中最后的标识位flag1是否为1,如果是,则先存储标识位flag1为1的点,后存储标识位flag1为0的点;如果否,则先存储标识位flag1为0的点,后存储标识位flag1为1的点。
4)生成所有层的数控加工代码。当本层所有加工区域的数控加工代码都已生成以后,将刀具退到安全高度,并将其在安全高度平移到下一层图像的起始位置上方,为下一层图像的数控加工代码生成做好准备。将一层的各个加工区域连接起来可以生成一层图像的刀具路径,将各层的刀具路径连接起来可以生成整个工件的刀具路径,采用直线插补的方式可以将其转换为数控加工代码。单层图像的走刀路径如图9所示,其中箭头表示进刀和退刀的方向,多层图像走刀路径与此类似。经过这样逐层铣削,得到带有余量的粗加工结果。最后将同一层的各个加工区域连接起来生成单层的刀具路径,将各层的刀具路径连接起来生成整个工件的走刀路径,并将其转换成数控加工代码的形式输出。
本发明提出的方法,可以将工业CT断层序列图像直接生成数控加工代码,避开了繁琐的三维表面建模或三维实体建模,明显缩短了数控加工代码生成的时间,而且避免了误差的积累。图10是茶壶的工业CT断层序列图像,图11是数控加工茶壶的仿真图,图12是数控加工茶壶效果图,茶壶断层序列图像直接生成的数控加工代码,经过简单设置就可以直接输出该工件的数控加工代码,通过了仿真软件的验证,加工后的效果,如图12所示。避开了繁琐的三维表面建模或三维实体建模,缩短了数控加工代码生成的时间。
以上所述仅为本发明的优选实施例,并不用于限制本发明,显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。