微信公众号“dotNET跨平台”的文章《c#实现图片文体提取》(参考文献3)介绍了C#图像文本识别模块Tesseract,后者是tesseract-ocr(参考文献2) 的C#封装版本,目前版本为5.2,关于Tesseract的详细介绍请见参考文献1和5,本文主要测试Tesseract模块的基本用法。
之前测试过IronOCR和PaddleSharp,本文复用IronOCR的测试代码,在NuGet包管理器中安装Tesseract包,如下图所示:
主要调用TesseractEngine类加载语言包、设置识别语言等,其构造函数原型如下所示。其中输入参数中的datapath指定语言包路径,安装NuGet包时不会安装语言包,需要单独下载,可以在参考文献2或者Tesseract官网中下载,language参数指定识别语言,语言名称对应语言包中文件名的开头部分(如chi_sim.traineddata对应的简体中文语言为chi_sim,eng.traineddata对应的英文为eng),engineMode参数对应的是识别引擎类型,其可选值如下所示。
public TesseractEngine(string datapath, string language, EngineMode engineMode)public enum EngineMode
{//// 摘要:// Only the legacy tesseract OCR engine is used.TesseractOnly,//// 摘要:// Only the new LSTM-based OCR engine is used.LstmOnly,//// 摘要:// Both the legacy and new LSTM based OCR engine is used.TesseractAndLstm,//// 摘要:// The default OCR engine is used (currently LSTM-ased OCR engine).Default
}
调用TesseractEngine类中的Process函数识别图片内容,其函数原型如下,第一个参数指定待识别的图片(Pix类为Tesseract模块自带类,可以调用Pix.LoadFromFile函数生成实例对象),第二个参数为图片处理方式,取值见下面代码所示。Process函数返回Page类实例对象,从中可以获取识别结果。
public Page Process(Pix image, PageSegMode? pageSegMode = null)public enum PageSegMode
{//// 摘要:// Orientation and script detection (OSD) only.OsdOnly,//// 摘要:// Automatic page sementation with orientantion and script detection (OSD).AutoOsd,//// 摘要:// Automatic page segmentation, but no OSD, or OCR.AutoOnly,//// 摘要:// Fully automatic page segmentation, but no OSD.Auto,//// 摘要:// Assume a single column of text of variable sizes.SingleColumn,//// 摘要:// Assume a single uniform block of vertically aligned text.SingleBlockVertText,//// 摘要:// Assume a single uniform block of text.SingleBlock,//// 摘要:// Treat the image as a single text line.SingleLine,//// 摘要:// Treat the image as a single word.SingleWord,//// 摘要:// Treat the image as a single word in a circle.CircleWord,//// 摘要:// Treat the image as a single character.SingleChar,SparseText,//// 摘要:// Sparse text with orientation and script detection.SparseTextOsd,//// 摘要:// Treat the image as a single text line, bypassing hacks that are specific to Tesseract.RawLine,//// 摘要:// Number of enum entries.Count
}
Page类中通过调用GetText函数获取图片中所有识别出的汇总的文本,其还支持如下函数获取文本内容或文本区域信息,后续会继续学习其用法。
采用Tesseract模块的基本用法得到的图片文字识别效果如下所示。大部分可以识别出来,但是识别带车牌的图片不管是Tesseract,还是之前的IronOCR和PaddleSharp,效果都比较差,不清楚是设置的问题,还是语言包用得不对。
参考文献
[1]https://github.com/charlesw/tesseract/
[2]https://github.com/tesseract-ocr/tesseract/tree/main/src
[3]https://www.sohu.com/a/722507167_121124363
[4]https://github.com/tesseract-ocr/tessdata/
[5]https://zhuanlan.zhihu.com/p/578700314