本章我们看下Pavlidis细化算法,参考资料http://www.imageprocessingplace.com/downloads_V3/root_downloads/tutorials/contour_tracing_Abeer_George_Ghuneim/theo.html
Computer VisiAlgorithms in Image Algebra,second edition
该算法最初是做前景轮廓跟踪的。
假设使用下面的8邻域,且前景像素值为1,背景像素值为0。
下面是该算法的描述:
1. 求出前景像素的轮廓,并用2表示,如果轮廓点是孤立点,端点或者其它不可删除的点,标记其为3。
2. 在第1步求出的轮廓中判断那些是可以删除的,那些是不可删除的,不可删除的点标记为4。
3. 再次扫描值为2的轮廓点,标记可以删除的点为5。
4. 对值为2和5的点执行删除操作。
重复上述步骤,直到图像中没有可以删除的像素为止。结果如想就是我们要的骨架结构。
第一步是求轮廓的过程,对于一个值为1的像素点。如果它的p0,p2,p4,p6四个点都为1,则该点是内部点,继续循环,判断其它像素。
如果该像素是孤立点或端点,则其像素值标记为3。
如果像素是其它可能改变8连通性的点。比如以下的情况: p3, p7为0,但p4,p5,p6和p0,p1,p2中有非零值,如果删除p点,则连通性会改变。此时都标记当前像素值为3。
第一步后,我们会得到轮廓
第2步对不等于0的像素进行处理
如果像素周围全是2,则标记其为4(不删除)。
还有对于其它不可删除情况,比如下面这种情况,置当前像素为4。
第三步对于值为2的轮廓点再次进行判断,对于可删除的点,标记为5。
第四步删除值为2和5的点。
最终值为4的点为细化后的轮廓点。
算法实现的代码:
}
}
程序源代码:参加工程FirstOpenCV11