Tesract OCR(光学字符识别)引擎概述
一:Tesract OCR 简介
Tesract是惠普布里斯托实验室在1985到1995年间开发的一个开源的小学四年级应用题OCR引擎,曾经在1995 UNLV精确度测试中名列前茅。但1996年后基本停止了开发。2005年,惠普将其对外开源,2006由Google对Tesract进行改进、消除Bug、优化工作。项目地址为:/p/tesract-ocr
二: Tsract OCR 架构
Tesract的识别步骤大致如下:
1. 连通区域分析,检测出字符区域区域(轮廓外形),以及子轮廓。在此阶段轮廓线集成为块区域。
2. 由字符轮廓和块区域得出文本行,以及通过空格识别出单词。固定字宽文本通过字符单元分割出单个字符,而对百分号的文本(Proportional text)通过一定的间隔和模糊间隔就(fuzzy spaces)来分割;
3. 依次对每个单词进行分析,采用自适应分类器,分类器有学习能力,先分析的且满足条件的单词也作为训练样本,所以后面的字符(比如页尾)识别更准确;此时,页首的字符识别比较不准确,所以tesract会再次对识别不太好的字符识别是其精度得到提高。
4.最后,识别含糊不清的空格,及用其他方法,如由笔画高度(x-height),识别小写字母(small-cap)的文本。
三:文本行和单词的查找(Line and Word Finding)
a. 假设页面布局分析(page layout analysis)大致确定了文本区域和文本尺寸,一个简单百分位高度过滤器(percentile height filter)可以将跨行大写字母及纵向粘连一起的字符过滤掉,利用字符的高度信息,选取所有字符的中值高度,通过高度的比例调节去掉一些无关的块,比如标点符号,变音符和噪声等;
b. 对块区域的x坐标排序,利用坐标拟合直线(baline),拟合方法:中位数最小方差拟合(least median of squares fit)
c. 进一步,拟合文本行的形状,利用四次多项式,将文本行看成螺线形,采用最小二乘法拟合
d. 检测出等距文本(fixed pitch text),对粘连的文本进行分割(chopping)
e. 对非等距字体如百分号,斜体等问题,利用中线、基准线之间的空白大小,来分割字符
有关函数:
1.PageIterator * tesract::TessBaAPI::AnalyLayout()页面结构分析
2. Boxa * tesract::TessBaAPI::GetRegions(Pixa ** pixa) 获取页面结构分析结果
3. Boxa * tesract::TessBaAPI::GetConnectedComponents | ( | Pixa ** | pixa | ) | |
| | | | | |
连通域分析
4.
|
void tesract::TessBaAPI::GetBlockTextOrientations | ( | int ** | block_orientation, |
| | bool ** | vertical_writing |
| ) | | |
| | | | 扔沙包游戏玩法
获取每一块(block由页面结构分析获得)中的文字方向。
5.
Boxa * tesract::TessBaAPI::GetStrips | ( | Pixa ** | pixa, |
| | int ** | blockids |
| ) | | 获得strip区域 |
| | | |
6.
Boxa * tesract::TessBaAPI::GetTextlines | ( | Pixa ** | pixa, |
腿痛是怎么回事 | | int ** | blockids |
| ) | | 孕早期腰酸获得文本行 |
| | | |
7. Boxa * tesract::TessBaAPI::GetWords(Pixa ** pixa) 以Boxa格式获取文字。
8.
Boxa *tesract::TessBaAPI::GetComponentImages | ( | PageIteratorLevel | level, |
| | bool | text_only, |
| | ps椭圆工具周末快乐祝福语Pixa ** | pixa, |
| | int ** | blockids |
| ) | | |
土豆泥 | | | |
获得指定级别的元素(block,textline, word)
9.
void tesract::TessBaAPI::DeleteBlockList(BLOCK_LIST * block_list)
删除Block
四:单词的识别(word recognition)
a. 分割粘连的字符,将凹进去的轮廓点作为备选分割点,分割后,进行识别,如果都失败,就认为字符破损不全,修补字符
b. 对破碎的字符,利用A*算法搜索最优的字符组合,直到达到满意的识别结果。(识别成功的基本是字符分类器可以很好的识别破碎的字符)
1.int tesract::TessBaAPI::Recognize(ETEXT_DESC * monitor)
识别 来自SetAndThresholdImage的图像, 产生Tesract 内部结构数据。
2.int tesract::TessBaAPI::RecognizeForChopTest(ETEXT_DESC * monitor)
识别 来自SetAndThresholdImage,Recognize() or TesractRect().的图像,测试chopper.
3.
bool tesract::TessBaAPI::ProcessPages | ( | const char * | filename, |
中考动员大会 | | const char * | retry_config, |
| | int | timeout_millic, |
| | STRING * | text_out |
| ) | | |
| | | |
识别指定文件的所有页面
4.
bool tesract::TessBaAPI::ProcessPage | ( | Pix * | pix, |
| | int | page_index, |
| | const char * | filename, |
| | const char * | retry_config, |
| | int | timeout_millic, |
| | STRING * | text_out |
| ) | | |
| | | |
识别指定文件的单张页面
5.
int tesract::TessBaAPI::IsValidWord(const char * word)