细化算法作为数学形态学在图像处理上的典型应用对应,可以求取图像基本形状特征,去除多余不相关数据。
细化算法比较多,这里只对3种算法进行分析。
1. 算法一:查询删除————————引自 吕凤军《数字图像处理编程入门》
对应3*3局部数据,有1)内部点不删 2)孤立点不删 3)直线端点不删 4)去除后连通域增加不删。
依据事先的判断做出从0~255的元素表,每个元素,为1 获 0 ,并依据处理八个相连点的情况,对应查表结果若为1则可删除。
查表方法 设从左上方开始到右下方结束 num=nw/255+n/255*2+ne/255*4+w/255*8+e/255*16+sw/255*32+s/255*64+se/255*125;
原文核心代码为:1 元素表
2 处理代码
对应代码中所插入的x++及y++需要注意。
由于已经存在元素表,算法简单容易实现。实际细化效果,对应环型的细化不是很好
2. 一般书上的细化算法:对于8个相连接数据取
3 2 0
4 1 6
5 8 7
如果p1对下面四条件均满足则可以删除
1)2<=NZ(P1)<=6:即统计区域内的黑点大于等2,小于等于6
2)Z0(P1)=1; 统计区域边缘情况如果存在2中以上情况则点不能删
1 0 x 0 x x x x x x x x x x x x x x x x 1 x 1 0
x x x 1 x x 0 x x x x x x x x x x 1 x x 0 x x x
x x x x x x 1 x x 0 1 x x 0 1 x x 0 x x x x x x
如果存在2种以上情况删除将分割区域。
3)P2*P4*P8!=0 或 Z0(P2)!=1;
4)P2*P4*P6!=0 或 Z0(P4)!=1; //作用没看明白
原代码:
该代码是从书上直接截取的,需要注意的是上述代码对应像素点代码处理时有问题的 在实际处理上每一行的实际宽度为
lineBytes=(wide*biBitCount/8+3)/4*4;
实际处理情况:对应环型的形状处理效果不怎么好。
3 引自 《visual c++数字图像处理典型算法及实》
在对环形图形的细化效果最好 (基于什么思想没看明白只对代码进行简单的解释)
数据依据
5 6 7
4 8
1 2 3 来进行处理
1 对图像进行预处理,黑点取1,背景取0
2 判断8数据中的黑点数必须大于1
3 代码中8种情况不能删外,其他情况均可删除
原文核心代码
上述代码中的cond的作用一直没搞明白,如果哪位大侠干好看了本文同时知道其作用的,希望留意解释一下。
上述三种代码在实际操作中对于不同的图形,处理的细化结果的好坏不一样。在实际应用中需要根据具体情况处理。