grassfire算法

 这个算法是做图像处理的抽骨架处理(文后附抽骨架的简介),目的是求出图像的骨架,可以想象一片与物体形状相同的草,沿其外围各点同时点火。当火势向内蔓延,向前推进的火线相遇处各点的轨迹就是中轴。

该处理有很多种不同的算法,从你提供的程序来看,它属于距离矩阵的算法。它要求计算对象必须是体表示的模型(对平面来说,就是二维矩阵),通过计算每个体元素到边界的最小距离来求取模型的脊点、骨架点.

程序中freespace是输入矩阵,freespaceX和freespaceY是输入矩阵的宽和高,navi用来保存输出矩阵(既矩阵每个元素记录的是该点到达边界的最小距离。

freespace输入矩阵中,值-1代表障碍物边界,值0代表空白空间。

基本算法:

1.建立一个用矩形边界包裹freespace的新临时矩阵tmpNavi。注意,对于边界节点,其值仍然为-1,而

对于非边界节点,给予了一个固定增量(freespaceX*freespaceY*d1)。

2.用多重处理算法处理临时矩阵tmpNavi,直至tmpNavi稳定下来,不再发生改变。

3.多重处理中的每次处理的算法:遍历每个非边界节点,计算它经由它的8个相邻节点分别到达边界的距离值(既到相邻节点的距离+相邻节点自身值),取其中最小值作为它自身新值。这样周而复始,就能得到一个稳定的数值矩阵。

(程序中用了一些优化的手法,但基本的算法原理就是这样的)

4.将临时矩阵tmpNavi的内容拷贝到输出矩阵navi,并统计其中的骨点值(最大值)到m_maxValue。

希望以上回答对你有帮助。

抽骨架(Skeletonization)

    一个与细化有关的运算是抽骨架,也称为中轴变换(Medialaxis transform)或焚烧草地技术(grass-fire technigue)。中轴是所有与物体在两个或更多非邻接边界点处相切的圆心的轨迹。但抽骨架很少通过在物体内拟合圆来实现。

    概念上,中轴可设想成按如下方式形成。想象一片与物体形状相同的草,沿其外围各点同时点火。当火势向内蔓延,向前推进的火线相遇处各点的轨迹就是中轴。

      抽骨架的实现与细化相似,可采用一个两步有条件腐蚀实现,但是删除像素的规则略有不同。

    下图将细化与抽骨架进行比较。二者的主要的差别在于抽骨架在拐角处延伸到了边界,而由细化得到的骨架却没有。

上面图a是细化的效果,下面的图b是抽骨架的效果。

(左边是处理一个均匀的矩形区域,右边是处理一个均匀的圆形区域)



 

猜你喜欢

转载自benworld.iteye.com/blog/1920217