OCR图像一般有两种:有格式的近距离图像或者扫描件,如身份证,名片,人民币、美元;无格式的图像,如 使用Tesseract OCR 提取复杂图像中的文字。
最近 有格式的近距离图像识别项目比较多,因此积累了一套版式分析(Layout Analysis)的算法,快速、可抗强干扰(光线、阴影)和噪音(污染、遮挡、背景)。特别适合证件,钱币等格式比较固定,内容较少但字比较分散的图像OCR。
终于把www.physoft.net 搬迁到了http://www.fatcow.com/. 之前托管在 万旭 http://www.wanxu.com/ 上,那个服务啊,访问速度真是受不了。网站经常down掉,找售后,要么不理你,要么说自己下班了,放周末。实在禁不起折磨。
Fatcow 从国内访问呢,速度一般,也不比万旭慢,不过我的客户基本是国外的,速度就很有优势了。而且Fatcow空间没上限,可以创建任意多个数据库!任意多个网站。价格也和万旭差不多。搞不清楚国内的公司为什么都这么牛,服务和质量如此的差,价格倒是不比别人低。
前面提到了如何使用Tesseract OCR 从复杂图像中提取文字,关键在于将图像分割,局部二值化后传给Tesseract识别,如从下图中提取每个物品的数量:

方法是先使用几何特征和颜色特征将物品分割为小的局域,再将每个区域二值化。这样,每个局域就对应一个子图,传给Tesseract。但是Tesseract识别一个图像速度还行,如果识别10个,20个,速度就很慢了。识别一个如上图( 400*600)的图像需要 10秒以上!!!这显然是太慢了。其实Tesseract 识别速度和子图的数目成正比,和图像的大小倒是没什么关系,也就是识别100*100的图和识别1024*1024的图,时间差不多太多。 所以,提升Tesseract 识别复杂图像速度的关键就在于把二值化的子图,重新拼回成一张图! 拼接的方法取决于识别目标的几何特征。 当然,拼接后,速度是极大提升了,但是后续output的继续也就会更加复杂。
Tesseract OCR 文字识别库识别率还是非常高的,但是前提是图像背景简单,如果有复杂的背景,识别率几乎为0.
下面介绍从具有复杂背景图像中应用 Tesseract OCR提取文字的关键技巧。以我做的提取运动员号码的项目为例。
测试图例:更多测试图例,请访问http://www.physoft.net/?p=554

1. 前处理。
前处理主要完成两个任务:
a. 定位:根据目标图像的特征定位目标的区域。如图例,需要定位每个运动员数字标签的标签区域。Tesseract 对以文字为主体的图像识别率还是非常不错的。所以我们需要将定位到的区域抠出来做后面的处理,再给Tesseract 识别。定位是非常困难的,涉及到目标图像的特征,一般来说是几何特征。但是因为图像复杂,特征常常也被其他物体破坏(物理上的破坏,或者光照、雾,遮挡破坏)。
b. 二值化:Tesseract 号称可以处理color图像,但是估计只有对二值化的图像,识别率才能达到可接受的程度。所以二值化可以极大的提高Tesseract识别率。将第一步定位到的局部图像二值化。这一步相对第一步要简单很多,但是仍然很具有挑战性。必定二值化的结果比较良好,否则 Tesseract 就有意见了。
前处理是成败的关键,也是最难的部分。前处理做好了,Tesseract 就听话了。前处理一般来说需要大量的图像处理技巧。
2. 错误文字的剔除:
a. 这一步相对简单,调用Tesseract,使用makebox参数,从output文件中获取提取到的结果,包括位置,大小。根据前处理中定位步骤中获取的几何特征,来过滤output中结果。如文字过宽,过小,顺序不对等。注意,Tesseract 输出的文字区域经常有区域重叠等现象,需要先使用程序重整。
b. 使用Tesseract的tord_display_ratings,根据准确度来淘汰低准确度的文字。
c. 多研究Tesseract配置
3. 除1,2外,Tesseract的training也是很重要的,而且train的样例越多越好。
最近竞标了农业部二维码的识别,感觉开发出来的二维码识别率还非常不错,速度也很快,这里分享下。
二维码已经开始普及起来。15-20年前设计的QR码和DM码仍然是主流码。国内也有不少码制出现,但其实详细看,也是换汤不换药,适应性还是很差。差的原因是很难适应复杂环境,比如自然环境下的二维码。农业部就是例子,二维码套在牲畜身上,摩擦严重,污染严重,采集的图像随意性非常大。物流二维码类似。
复杂环境下的二维码识别算法异常复杂,需要建立非常多的数学模型,而不是简单的套用代码。libdmtx 是一款非常不错的开源二维码识别库,写得也不错,但是识别率和识别时间还远远不能满足复杂环境的二维码识别。
通过几个月的调研和不断的算法优化,最终我开发出的二维码对复杂环境下的二维码识别率有了非常大的提升,识别时间提升20-30倍,采用了不少加速算法。
对农业部1000个样本的识别率大概在98%, 平均识别时间在10-30ms. 当然,这是PC机的时间,嵌入式采用ARM的初级芯片还不尽人意。但是如果稍微使用高级一点的芯片,加上视频采集时引入缓冲机制,还是可以达到3-10帧率。
测试结果
样本:农业部采集的大概1000个样本,包括大量暗室,复杂背景,污损,磨损,强光,遮挡等。
识别率: 总体识别率98%, 如果只考虑普通样本,识别率接近100% (没有详细统计过)
识别速度: 10-30ms/个样本 ( 4年前的普通PC机)
图片(非最新数据,稍后更新)



