简介:本文详细介绍如何通过 Tesseract OCR 引擎与 C# 结合,实现图像文字的精准识别。涵盖环境配置、核心代码实现、性能优化及实际应用场景,为开发者提供一站式解决方案。
光学字符识别(OCR)技术已成为数字化文档处理的核心工具,尤其在发票识别、档案数字化、自动化表单处理等场景中发挥着关键作用。Tesseract 作为开源 OCR 引擎的标杆,凭借其高精度、多语言支持和可扩展性,成为 C# 开发者实现 OCR 功能的首选方案。本文将系统阐述如何通过 C# 调用 Tesseract 完成图像到文本的转换,涵盖环境搭建、核心代码实现、性能优化及典型应用场景。
Tesseract 由 Google 维护,支持超过 100 种语言,具备以下特性:
在 C# 中使用 Tesseract 主要有两种方式:
下载 Tesseract 主程序:
choco install tesseract
安装语言数据包:
eng),中文需单独下载:chi_sim.traineddatachi_tra.traineddatatessdata 文件夹Tesseract 包:
Install-Package Tesseract
using Tesseract;using System;using System.Drawing;class Program{static void Main(){try{// 1. 指定 Tesseract 数据路径(包含 tessdata 文件夹)string tessDataPath = @"C:\Program Files\Tesseract-OCR\tessdata";// 2. 创建引擎实例(参数:语言包、数据路径)using (var engine = new TesseractEngine(tessDataPath, "eng", EngineMode.Default)){// 3. 加载图像using (var img = Pix.LoadFromFile("test.png")){// 4. 创建页面对象using (var page = engine.Process(img)){// 5. 获取识别结果string text = page.GetText();Console.WriteLine("识别结果:\n" + text);// 6. 获取置信度(可选)float confidence = page.GetMeanConfidence();Console.WriteLine($"平均置信度:{confidence:F2}");}}}}catch (Exception ex){Console.WriteLine($"错误:{ex.Message}");}}}
修改语言参数为 "chi_sim"(简体中文)或 "chi_tra"(繁体中文):
using (var engine = new TesseractEngine(tessDataPath, "chi_sim", EngineMode.Default))
OCR 前对图像进行预处理可显著提升识别率:
// 使用 System.Drawing 进行基础预处理public static Bitmap PreprocessImage(string inputPath, string outputPath){using (var original = new Bitmap(inputPath)){// 转换为灰度图var grayImage = new Bitmap(original.Width, original.Height);using (var g = Graphics.FromImage(grayImage)){var colorMatrix = new System.Drawing.Imaging.ColorMatrix(new float[][]{new float[] {0.299f, 0.299f, 0.299f, 0, 0},new float[] {0.587f, 0.587f, 0.587f, 0, 0},new float[] {0.114f, 0.114f, 0.114f, 0, 0},new float[] {0, 0, 0, 1, 0},new float[] {0, 0, 0, 0, 1}});var attributes = new System.Drawing.Imaging.ImageAttributes();attributes.SetColorMatrix(colorMatrix);g.DrawImage(original,new Rectangle(0, 0, original.Width, original.Height),0, 0, original.Width, original.Height,GraphicsUnit.Pixel, attributes);}// 二值化(可选)grayImage.Save(outputPath, System.Drawing.Imaging.ImageFormat.Png);return grayImage;}}
Parallel.For(0, 10, i =>{using (var engine = new TesseractEngine(tessDataPath, "eng")){var img = Pix.LoadFromFile($"image_{i}.png");var page = engine.Process(img);// 处理结果...}});
// 定义识别区域(左上角X,Y,宽度,高度)var rect = new Rect(100, 50, 300, 200);using (var img = Pix.LoadFromFile("test.png")){// 裁剪图像using (var subImg = img.Crop(rect.ToRectangle())){using (var page = engine.Process(subImg)){// 处理局部区域...}}}
jtessboxeditor 生成训练数据tesseract.exe 训练模型:
tesseract eng.training_text.tif eng.training_text nobatch box.trainunicharset_extractor eng.training_text.boxmftraining -F font_properties -U unicharset -O eng.unicharset eng.training_text.tr
// 识别发票关键字段public class InvoiceOCR{public static (string Number, string Date, decimal Amount) ExtractData(string imagePath){using (var engine = new TesseractEngine(@"tessdata", "chi_sim")){using (var img = Pix.LoadFromFile(imagePath)){var page = engine.Process(img);var text = page.GetText();// 正则表达式提取关键信息var numberMatch = Regex.Match(text, @"发票号码[::]?\s*(\w+)");var dateMatch = Regex.Match(text, @"开票日期[::]?\s*(\d{4}-\d{2}-\d{2})");var amountMatch = Regex.Match(text, @"金额[::]?\s*(\d+\.\d{2})");return (numberMatch.Success ? numberMatch.Groups[1].Value : "",dateMatch.Success ? dateMatch.Groups[1].Value : "",amountMatch.Success ? decimal.Parse(amountMatch.Groups[1].Value) : 0);}}}}
结合 PDF 库(如 iTextSharp)实现 PDF 表单的 OCR 提取:
public static Dictionary<string, string> ExtractFormData(string pdfPath){var result = new Dictionary<string, string>();using (var reader = new PdfReader(pdfPath)){for (int i = 1; i <= reader.NumberOfPages; i++){var strategy = new SimpleTextExtractionStrategy();var currentText = PdfTextExtractor.GetTextFromPage(reader, i, strategy);// 解析键值对var lines = currentText.Split('\n');foreach (var line in lines){if (line.Contains(":")){var parts = line.Split(new[] { ':' }, 2);if (parts.Length == 2){result[parts[0].Trim()] = parts[1].Trim();}}}}}return result;}
psm 参数调整页面分割模式:
var engine = new TesseractEngine(tessDataPath, "eng", EngineMode.Default){DefaultPageSegMode = PageSegMode.AutoOsd // 自动检测布局};
Pix 和 Page 对象
using (var img = Pix.LoadFromFile("test.png"))using (var page = engine.Process(img)){// 处理逻辑...} // 自动释放资源
Tesseract 与 C# 的结合为开发者提供了强大且灵活的 OCR 解决方案。通过合理配置环境、优化图像预处理、利用多线程技术,可实现高效准确的文字识别。未来,随着深度学习模型的持续优化,Tesseract 的识别精度和速度将进一步提升。建议开发者关注以下方向:
本文提供的代码示例和优化策略可直接应用于实际项目,帮助开发者快速构建稳定的 OCR 功能。”