对连通域的总结

 

关于行驶证的几种鉴别方法:

行驶证应符合《中华人民共和国机动车行驶证》标准,使用国务院公布的简化字,颜色为黑色。主页正面中华人民共和国机动车行驶证字体为12P黑体,位置居中;号牌号码车辆类型所有人住址品牌型号使用性质车辆识别代号发动机号注册登记号码发证日期等其他文字的字体为7.5P宋体。英文“Vehicle license of the People′s Republic of China”字体为7P罗马字体,位置居中;其他英文的字体为6P罗马字体。

 

最近做模式识别的一个项目,涉及到字符识别。我首先根据字符的孔洞数把字符(ABCDEFGHJKLMNOPQRSTUVWXYZ,0123456789)分成三组:

1)              没有孔洞数(CEFGHJKLMNSTUVWXYZ,12357)

2)              有一个孔洞数(ADOPQR, 469)

3)              有两个孔洞数(B08).

其实对孔洞数的识别,也就是对字符二值图像的连通域识别。例如:

《对连通域的总结》

的连通域数量是:1(背景)+1(字符笔迹)+1(字符笔迹内部包含的1个孔洞数)=3.

那么如何识别连通域呢?

在数字图像中,连通域有两种定义:4连通域、8连通域。

在谈具体的实现之前,先把我在具体实现这些代码前所做的准备工作或所看的资料总结下。

1)          windows画图板

大家肯定都用过windows画图板的,那么你对windows画图板中的颜色填充功能了解多少呢?下面看我的经历。下面是一幅对角线是黑点的图像。

《对连通域的总结》

当你在把颜色填充图案放在黑色点上时,填充的仅仅是当前一个黑点,填充颜色为红色。如:

《对连通域的总结》

当你在把颜色填充图案放在上方白色任意处时,填充颜色为蓝色,填充的效果为:

《对连通域的总结》

从这里可以看出:

   Windos画图板中颜色填充中用的是4连通域,而不是八连通域。再看下一例:如果给的图形是:

《对连通域的总结》

当你在把颜色填充图案放在新添加的黑色点上时,则效果是

《对连通域的总结》

为什么把三个点都填充了红色呢?因为他们是4连通域的。

1)          Matlab软件

在Matlab环境中,实现连通域标记算法的函数通常有:

[C,L]=bwlabel(I,t);I是二值化的图像举证,t是4和8.C是连通域个数,L是标记的矩阵。如果想把不同的连通域标记成不同的颜色,则调用label2rgb(L)。看下面的矩阵:

《对连通域的总结》

对于这样的一个矩阵cdata,执行如下的命令:

[l,c]=bwlabel(cdata,4);

得到l=

《对连通域的总结》

C=20;即20个连通域。

再调用:>> RGB = label2rgb(l);

>> imshow(RGB)

则显示结果为:《对连通域的总结》

再执行如下的命令:

[l,c]=bwlabel(cdata,8);

则l=《对连通域的总结》

c=1

而对于ddata=1-cdata=《对连通域的总结》

执行如下的命令:

[l,c]=bwlabel(ddata,4);

则l=《对连通域的总结》

C=2;

再调用:>> RGB = label2rgb(l);

>> imshow(RGB)

则显示结果为:《对连通域的总结》

再执行如下的命令:

[l,c]=bwlabel(ddata,8);

则l=《对连通域的总结》

c=1

再看有个封闭环的例子:

对于矩阵l=《对连通域的总结》

执行:[l1,c]=bwlabel(l,4);

得到:l1=《对连通域的总结》

C=2。

执行:[l2,c]=bwlabel(l,8);

得到l2=《对连通域的总结》

C=1。

 

执行:l3=1-l;后

得到l3=《对连通域的总结》

执行:[l4,c]=bwlabel(l3,4);

得到l4=《对连通域的总结》

C=8;

执行:[l5,c]=bwlabel(l3,8);

得到l5=《对连通域的总结》

C=1.

再看图片:

该图片导入到matlab后就变为矩阵:

L=

《对连通域的总结》

执行:[L1,c]=bwlabel(L,4);

L1=

1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1   1   1   1   0   0   0   1   1   1   1   1   1

1   1   1   1   1   1   1   1   1   0   0   3   3   3   0   1   1   1   1   1

1   1   1   1   1   1   1   1   0   0   3   3   3   3   0   1   1   1   1   1

1   1   1   1   1   1   1   0   0   3   3   3   3   3   3   0   1   1   1   1

1   1   1   1   1   1   1   0   3   3   3   3   3   3   3   0   1   1   1   1

1   1   1   1   1   1   0   3   3   3   3   3   3   3   3   0   1   1   1   1

1   1   1   1   1   1   0   3   3   3   3   3   3   3   3   0   1   1   1   1

1   1   1   1   1   0   3   3   3   3   3   3   3   3   3   0   1   1   1   1

1   1   1   1   1   0   3   3   3   3   3   3   3   3   3   0   1   1   1   1

1   1   1   1   0   3   3   3   3   3   3   3   3   3   3   0   1   1   1   1

1   1   1   1   0   3   3   3   3   3   3   3   3   3   3   0   1   1   1   1

1   1   1   1   0   3   3   3   3   3   3   3   3   3   3   3   0   1   1   1

1   1   1   1   0   3   3   3   3   3   3   3   3   3   3   3   0   1   1   1

1   1   1   1   0   3   3   3   3   3   3   3   3   3   3   3   0   1   1   1

1   1   1   1   0   3   3   3   3   0   0   0   0   0   0   0   0   1   1   1

1   1   1   1   0   0   0   0   0   2   2   2   2   2   2   2   0   1   1   1

1   1   1   1   0   2   2   2   2   2   2   2   2   2   2   2   0   1   1   1

1   1   1   1   0   2   2   2   2   2   2   2   2   2   2   2   0   1   1   1

1   1   1   0   2   2   2   2   2   2   2   2   2   2   2   2   0   1   1   1

1   1   1   0   2   2   2   2   2   2   2   2   2   2   2   2   0   1   1   1

1   1   1   0   2   2   2   2   2   2   2   2   2   2   2   2   0   1   1   1

1   1   1   0   2   2   2   2   2   2   2   2   2   2   2   0   1   1   1   1

1   1   1   0   2   2   2   2   2   2   2   2   2   2   2   0   1   1   1   1

1   1   1   0   2   2   2   2   2   2   2   2   2   2   2   0   1   1   1   1

1   1   1   0   2   2   2   2   2   2   2   2   2   2   0   0   1   1   1   1

1   1   1   0   2   2   2   2   2   2   2   2   2   2   0   1   1   1   1   1

1   1   1   0   2   2   2   2   2   2   2   2   2   2   0   1   1   1   1   1

1   1   1   0   0   2   2   2   2   2   2   2   2   0   0   1   1   1   1   1

1   1   1   1   0   2   2   2   2   2   2   2   2   0   1   1   1   1   1   1

1   1   1   1   1   0   2   2   2   2   2   2   0   1   1   1   1   1   1   1

1   1   1   1   1   0   2   2   2   2   2   0   0   1   1   1   1   1   1   1

1   1   1   1   1   1   0   0   2   0   0   0   1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1   0   1   1   1   1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

C=3.

执行:[L1,c]=bwlabel(L,8);

L1=

1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1   1   1   1   0   0   0   1   1   1   1   1   1

1   1   1   1   1   1   1   1   1   0   0   1   1   1   0   1   1   1   1   1

1   1   1   1   1   1   1   1   0   0   1   1   1   1   0   1   1   1   1   1

1   1   1   1   1   1   1   0   0   1   1   1   1   1   1   0   1   1   1   1

1   1   1   1   1   1   1   0   1   1   1   1   1   1   1   0   1   1   1   1

1   1   1   1   1   1   0   1   1   1   1   1   1   1   1   0   1   1   1   1

1   1   1   1   1   1   0   1   1   1   1   1   1   1   1   0   1   1   1   1

1   1   1   1   1   0   1   1   1   1   1   1   1   1   1   0   1   1   1   1

1   1   1   1   1   0   1   1   1   1   1   1   1   1   1   0   1   1   1   1

1   1   1   1   0   1   1   1   1   1   1   1   1   1   1   0   1   1   1   1

1   1   1   1   0   1   1   1   1   1   1   1   1   1   1   0   1   1   1   1

1   1   1   1   0   1   1   1   1   1   1   1   1   1   1   1   0   1   1   1

1   1   1   1   0   1   1   1   1   1   1   1   1   1   1   1   0   1   1   1

1   1   1   1   0   1   1   1   1   1   1   1   1   1   1   1   0   1   1   1

1   1   1   1   0   1   1   1   1   0   0   0   0   0   0   0   0   1   1   1

1   1   1   1   0   0   0   0   0   1   1   1   1   1   1   1   0   1   1   1

1   1   1   1   0   1   1   1   1   1   1   1   1   1   1   1   0   1   1   1

1   1   1   1   0   1   1   1   1   1   1   1   1   1   1   1   0   1   1   1

1   1   1   0   1   1   1   1   1   1   1   1   1   1   1   1   0   1   1   1

1   1   1   0   1   1   1   1   1   1   1   1   1   1   1   1   0   1   1   1

1   1   1   0   1   1   1   1   1   1   1   1   1   1   1   1   0   1   1   1

1   1   1   0   1   1   1   1   1   1   1   1   1   1   1   0   1   1   1   1

1   1   1   0   1   1   1   1   1   1   1   1   1   1   1   0   1   1   1   1

1   1   1   0   1   1   1   1   1   1   1   1   1   1   1   0   1   1   1   1

1   1   1   0   1   1   1   1   1   1   1   1   1   1   0   0   1   1   1   1

1   1   1   0   1   1   1   1   1   1   1   1   1   1   0   1   1   1   1   1

1   1   1   0   1   1   1   1   1   1   1   1   1   1   0   1   1   1   1   1

1   1   1   0   0   1   1   1   1   1   1   1   1   0   0   1   1   1   1   1

1   1   1   1   0   1   1   1   1   1   1   1   1   0   1   1   1   1   1   1

1   1   1   1   1   0   1   1   1   1   1   1   0   1   1   1   1   1   1   1

1   1   1   1   1   0   1   1   1   1   1   0   0   1   1   1   1   1   1   1

1   1   1   1   1   1   0   0   1   0   0   0   1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1   0   1   1   1   1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

C=1.

当执行:L=255-L;

得到L=《对连通域的总结》

执行:[L1,c]=bwlabel(L,4);

L1=

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   11  11  11  0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   7   7   0   0   0   13  0   0   0   0   0

0   0   0   0   0   0   0   0   7   7   0   0   0   0   13  0   0   0   0   0

0   0   0   0   0   0   0   7   7   0   0   0   0   0   0   14  0   0   0   0

0   0   0   0   0   0   0   7   0   0   0   0   0   0   0   14  0   0   0   0

0   0   0   0   0   0   5   0   0   0   0   0   0   0   0   14  0   0   0   0

0   0   0   0   0   0   5   0   0   0   0   0   0   0   0   14  0   0   0   0

0   0   0   0   0   3   0   0   0   0   0   0   0   0   0   14  0   0   0   0

0   0   0   0   0   3   0   0   0   0   0   0   0   0   0   14  0   0   0   0

0   0   0   0   2   0   0   0   0   0   0   0   0   0   0   14  0   0   0   0

0   0   0   0   2   0   0   0   0   0   0   0   0   0   0   14  0   0   0   0

0   0   0   0   2   0   0   0   0   0   0   0   0   0   0   0   9   0   0   0

0   0   0   0   2   0   0   0   0   0   0   0   0   0   0   0   9   0   0   0

0   0   0   0   2   0   0   0   0   0   0   0   0   0   0   0   9   0   0   0

0   0   0   0   2   0   0   0   0   9   9   9   9   9   9   9   9   0   0   0

0   0   0   0   2   2   2   2   2   0   0   0   0   0   0   0   9   0   0   0

0   0   0   0   2   0   0   0   0   0   0   0   0   0   0   0   9   0   0   0

0   0   0   0   2   0   0   0   0   0   0   0   0   0   0   0   9   0   0   0

0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   9   0   0   0

0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   9   0   0   0

0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   9   0   0   0

0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   12  0   0   0   0

0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   12  0   0   0   0

0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   12  0   0   0   0

0   0   0   1   0   0   0   0   0   0   0   0   0   0   12  12  0   0   0   0

0   0   0   1   0   0   0   0   0   0   0   0   0   0   12  0   0   0   0   0

0   0   0   1   0   0   0   0   0   0   0   0   0   0   12  0   0   0   0   0

0   0   0   1   1   0   0   0   0   0   0   0   0   12  12  0   0   0   0   0

0   0   0   0   1   0   0   0   0   0   0   0   0   12  0   0   0   0   0   0

0   0   0   0   0   4   0   0   0   0   0   0   10  0   0   0   0   0   0   0

0   0   0   0   0   4   0   0   0   0   0   10  10  0   0   0   0   0   0   0

0   0   0   0   0   0   6   6   0   10  10  10  0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   8   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

C=14.

执行:执行:[L1,c]=bwlabel(L,8);

L1=

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   1   1   1   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   1   1   0   0   0   1   0   0   0   0   0

0   0   0   0   0   0   0   0   1   1   0   0   0   0   1   0   0   0   0   0

0   0   0   0   0   0   0   1   1   0   0   0   0   0   0   1   0   0   0   0

0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   1   0   0   0   0

0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   1   0   0   0   0

0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   1   0   0   0   0

0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   1   0   0   0   0

0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   1   0   0   0   0

0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0

0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0

0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0

0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0

0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0

0   0   0   0   1   0   0   0   0   1   1   1   1   1   1   1   1   0   0   0

0   0   0   0   1   1   1   1   1   0   0   0   0   0   0   0   1   0   0   0

0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0

0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0

0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0

0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0

0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0

0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0

0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0

0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0

0   0   0   1   0   0   0   0   0   0   0   0   0   0   1   1   0   0   0   0

0   0   0   1   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0

0   0   0   1   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0

0   0   0   1   1   0   0   0   0   0   0   0   0   1   1   0   0   0   0   0

0   0   0   0   1   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0

0   0   0   0   0   1   0   0   0   0   0   0   1   0   0   0   0   0   0   0

0   0   0   0   0   1   0   0   0   0   0   1   1   0   0   0   0   0   0   0

0   0   0   0   0   0   1   1   0   1   1   1   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

C=1.

所以从上面的例子可以看出:

a)    bwlabel函数,是求出非零值的连通域,对0不考虑他的连通域。

b)    所以用bwlabel求出字符的孔洞数。一定让背景变为非0,而让字符笔迹变为0.

c)    为了严格求出字符孔洞数,对于经过细化的,且笔迹没有因细化而中断的字符图像,一定要以背景作为目标像素,用4连通域保险。而对于归一化后,但未被细化的字符图像,用4连通域肯定可以。但用8连通域有时可以,有时候不一定可以。所以无论什么情况,用4连通域保险!!!

在切割字符时,要保证字符周围一圈像素为背景色。否则结果就不对。如:

《对连通域的总结》

字符A外围就有一圈白色的背景像素。如果是:

《对连通域的总结》

则执行:

[l,c]=bwlabel(cdata,4);后;

l=

《对连通域的总结》

c=4.

而我们为了得到孔洞数应该是1.

点赞