关于行驶证的几种鉴别方法:
行驶证应符合《中华人民共和国机动车行驶证》标准,使用国务院公布的简化字,颜色为黑色。主页正面“中华人民共和国机动车行驶证”字体为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);
c=1
而对于ddata=1-cdata=
执行如下的命令:
[l,c]=bwlabel(ddata,4);
C=2;
再调用:>> RGB = label2rgb(l);
>> imshow(RGB)
则显示结果为:
再执行如下的命令:
[l,c]=bwlabel(ddata,8);
c=1
再看有个封闭环的例子:
执行:[l1,c]=bwlabel(l,4);
得到:l1=
C=2。
执行:[l2,c]=bwlabel(l,8);
C=1。
执行:l3=1-l;后
执行:[l4,c]=bwlabel(l3,4);
得到l4=
C=8;
执行:[l5,c]=bwlabel(l3,8);
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.