所谓细化,就是从原来的图形中去掉一些点,但还是要保持原来的形状,也就是保持原来图形的骨架,所谓骨架,可以理解为图像的中轴,例如一个长方形的骨架是它的长方向上的中轴线,正方形的骨架是它的中心点,圆形的骨架是它的圆心,直线的骨架还是它自身,孤立点的骨架还是它自身。文本的骨架是它笔画的中心线。可是怎样判断一个点能否被去掉呢?显然,要根据它的上下左右的8个相邻点的情况来判断。例如下图:
下面来分析一下,如图所示,(1)图中,相邻的8个点都是依附与中心点的,也就是中心点是一个内部点,所以,要是内部点删除了,骨架就会架空了,所以,这点不能够删除。(2)对于的点也不能够删除,原理和(1)是一样的;(3)可以删除,因为它不是骨架;(4)不能够删除,否则原来连接的就会断掉了;(5)可以删除,因为也不是骨架;(6)不能够删除,因为它关系到直线的端点,删除以后,线就不完整了。
所以,总结出来以后,就有以下这样的因素了:内部点不能够删除,孤立点不能够删除,直线端点不能够删除,另外对于某个边界点,如果去掉以后,连通分量没有增加,则该点也可以删除。
由于计算机很难处理空间的判断问题,所以,现在把一个点的相邻点所出现的所有几率都列举出来,并从中标识出哪些情况可以删除,哪些情况不能够删除,这样,计算机在处理的时候好比就有了一个参照,所以,程序中要先制作出这样的一个表,在表中,列举出可能出现的情况最多就是256种,这里设置一个数组记录下来。在表中,如果某个元素是0,就不能够删除,如果是1,表示可以删除掉。
下面看一下查表的方法,假设白点是1,黑的点是0,左上方点对应一个8位数的第一位(最低位)正上方点对应第二位,右上方点对应第三位,左边相邻点对应第四位,右边相邻点对应第五位,左下方点对应第六位,正下方点对应第七位,右下方点对应第八位,也就是如果看到编码是0000 0000八个零的就是某点上下左右全是0,这样的点在表中直接找第0个元素(就是表里的第一个元素),也就是对应了上图中的第(1)中的情况,它是不可以删除的。上图的第(2)种情况的编码是:0010 0101,也就是对应十进制的37,该项不可以删除,在表中就应该是0;第(3)种情况编码是:1010 1101,对应到137,表中就是1,说明可以删除;(4)编码:11100111,对应231,表中是0,不可以删除;(5)编码:1110 1101,对应237,表中是1,可以删除;(6)编码是:1111 1110,对应254,表中是0,不可以删除。
下边是对应的表:
这个表出来以后,计算机就可以根据具体情况作出判断了,每次的处理就可以一行一行的把整个图像扫描一遍,对于每一个点(不包括边界点),先计算机出它在表中的索引,找到以后,发现是0的,就保留下来,如果是1,表示可以删除,如果本次扫描没有一个点被删除,则循环就结束了,剩下的就是骨架点了,如果有点被删除,则进行下一轮的新的扫描,如果反复,直到没有点被删除为止。
其中细化处理的过程具体算法如下:
(1)生成边界:假如一个被标志的点的四周有任何一个点未标志,则此点就是边界点,也可以使用八方向进行判断,就是假如一个被标志的点的八方向邻接点有任何一个未标志,则此点是边界点。
(2)如果被标志的点的连通区域中有任何一个非边界点(被标志了但是不是边界点),则去掉边界(相当于细化),否则将所有的边界点,也就是整个的连通区域标志为临时中心点。
(3)重复(1)(2)两个步骤,直到所有的点都被访问过为止。
为了取得最终的中心点,还需要对所有被标志为临时中心点并且连通的像素取坐标的平均值,将平均值作为最终中心点。
对于圆形或者接近圆形的椭圆来说,一次的细化则半径就减去1,因此根据细化的次数就可以得到半径的值。