本章我们在学习一下基于索引表的细化算法。
假设要处理的图像为二值图,前景值为1,背景值为0。
索引表细化算法使用下面的8邻域表示法:
一个像素的8邻域,我们可以用8位二进制表示,比如下面的8邻域,表示为00111000=0x38=56
我们可以枚举出各种情况下,当前像素能否删除的表,该表大小为256。它的索引即为8邻域表示的值,表中存的值为0或1,0表示当前像素不能删除,1表示可以删除。deletemark[256]
比如下图第一个表示,索引值为0,它表示孤立点,不能删除,所以deletemark[0]=0,第二个表示索引值为17,它表示端点,也不能删除,所以deletemark[17]=0,第三个表示索引为21,删除的话会改变连通域数量,所以deletemark[21]=0,第四个表示索引值为96,此时可以删除,所以deletemark[96]=1。
最终我们会定义一张完整的表来表示当前像素能否删除。
索引表细化算法描述很简单。
1.找到轮廓,其值用4表示
2.查找值为4的轮廓,查找索引表判断能否删除,能删除的话把它置为0。
循环迭代1,2直到再也没有可以删除的点为止。
下面的算法的代码:
break;
}
}
上面的算法可以看到细化后的轮廓偏右了,我们可以更改删除的循环条件,把循环拆分成三个,修改后的代码如下:
break;
}
}
修改后的结果:
程序源代码:工程FirstOpenCV11