如何检测Tesseract 5.2图像中文本方向并正确提取文本?
解决Tesseract 5.2处理多方向文本识别问题
针对你遇到的文本方向不一致导致识别错误的问题,可以利用Tesseract的**OSD(Orientation and Script Detection,方向与脚本检测)**功能先识别文本旋转角度,再将图像旋转至正确方向后进行文本提取,具体实现如下:
1. 启用OSD检测文本旋转角度
首先需要初始化包含OSD语言包的Tesseract引擎,通过OsdOnly模式检测图像中文本的旋转角度:
using (var engine = new Tesseract.TesseractEngine(path, "eng+osd", Tesseract.EngineMode.Default)) { // 仅执行方向检测 using (var osdPage = engine.Process(img, Tesseract.PageSegMode.OsdOnly)) { var osdResult = osdPage.GetOSD(); // 获取文本旋转角度(通常为0、90、180、270度) int rotationAngle = osdResult.Rotation; // 旋转图像至正确方向 Bitmap rotatedImage = RotateImage(img, rotationAngle); // 用校正后的图像提取文本 using (var textPage = engine.Process(rotatedImage, Tesseract.PageSegMode.Auto)) { return textPage.GetText(); } } }
2. 实现图像旋转辅助方法
添加一个用于根据角度旋转图像的工具方法:
private static Bitmap RotateImage(Image originalImg, int angle) { // 根据旋转角度调整位图尺寸 Bitmap rotatedBitmap; if (angle == 90 || angle == 270) { rotatedBitmap = new Bitmap(originalImg.Height, originalImg.Width); } else { rotatedBitmap = new Bitmap(originalImg.Width, originalImg.Height); } // 执行图像旋转 using (Graphics g = Graphics.FromImage(rotatedBitmap)) { g.TranslateTransform(rotatedBitmap.Width / 2f, rotatedBitmap.Height / 2f); g.RotateTransform(angle); g.TranslateTransform(-originalImg.Width / 2f, -originalImg.Height / 2f); g.DrawImage(originalImg, 0, 0); } return rotatedBitmap; }
关键说明
- 引擎初始化时需指定
eng+osd语言组合,确保加载方向检测所需的训练数据(osd.traineddata),如果你的Tesseract环境中没有该文件,需要单独下载并放入tessdata目录。 - 使用
PageSegMode.OsdOnly模式可以跳过文本识别,仅高效完成方向检测,获取角度后再旋转图像,避免无效识别。 - 你的示例图像文本均为90度倍数旋转,上述方法可完美适配;若遇到非整数倍倾斜的文本,可额外添加倾斜校正逻辑(如利用霍夫变换检测文本行角度)。
内容的提问来源于stack exchange,提问作者Ibrahim shaikh
相关产品推荐
相关产品推荐

