保定学校网站建设,网站建设费 大创,效果图设计,自己做的网站标题文章目录 概要图像预处理阶段默认反转图像重新缩放二值化噪音消除膨胀/腐蚀旋转/偏移校正边框缺少边框边框太大扫描边框去除 透明度/Alpha通道 引擎处理阶段语言模型配置提高识别速度词典、单词列表和模式表格识别 使用 Tesseract OCR 的 GUI 和其他项目 原文如下#xff1a; … 文章目录 概要图像预处理阶段默认反转图像重新缩放二值化噪音消除膨胀/腐蚀旋转/偏移校正边框缺少边框边框太大扫描边框去除 透明度/Alpha通道 引擎处理阶段语言模型配置提高识别速度词典、单词列表和模式表格识别 使用 Tesseract OCR 的 GUI 和其他项目 原文如下 https://github.com/tesseract-ocr/tessdoc/blob/main/ImproveQuality.md 概要
在优化Tesseract OCR识别效果的过程中我们可以分为三个关键阶段分别是图像预处理阶段、引擎处理阶段和后处理阶段。通过在每个阶段采取适当的措施我们可以显著提高识别的准确性和效率。
图像预处理阶段在这一阶段我们通过多种手段优化输入图像以确保Tesseract能够更好地理解文本。以下是一些建议的预处理步骤 重新缩放 将图像缩放到适当的大小以减少计算负担并提高识别速度。二值化 将图像转换为黑白二值图像以突出文本轮廓。去噪 使用滤波器或其他去噪技术消除图像中的不必要细节。膨胀/腐蚀 通过膨胀和腐蚀操作强调和连接字符轮廓提高字符识别准确性。旋转/偏移矫正 识别前对图像进行旋转和偏移矫正确保文本水平且居中。边框 添加适当的边框以帮助Tesseract正确识别文本。透明度/Alpha通道 根据需要处理图像透明度或Alpha通道。 引擎处理阶段在这个阶段我们针对Tesseract OCR引擎进行优化以提高其识别效果。 配置选项 使用Tesseract提供的配置选项调整引擎参数例如指定语言模型、字符宽度的阈值等。页面分割方法 选择适当的页面分割方法确保Tesseract能够正确识别文本的边界。引擎和tessdata 确保使用最新版本的Tesseract引擎和适当的tessdata文件以获取最佳性能和支持最新的语言模型。模式 针对不同类型的文本选择适当的Tesseract识别模式例如文本、数字等。 后处理阶段
图像预处理阶段
Tesseract在执行实际的OCR之前内部使用Leptonica库进行各种图像处理操作。它通常做得很好但不可避免地会有一些情况不够好这可能导致准确性显著降低。
您可以通过在运行Tesseract时将配置变量tessedit_write_images设置为true或使用configfile get.images来查看Tesseract如何处理图像。
重点如果生成的tessinput.tif文件看起来有问题请在将图像传递给Tesseract之前尝试一些这些图像处理操作。 重新缩放 二值化 去噪 膨胀/腐蚀 旋转/偏移矫正 边框 透明度/Alpha通道 获取tessinput.tif文件方式一: tesseract.ProcessPage import org.bytedeco.javacpp.BytePointer;
import org.bytedeco.leptonica.PIX;
import org.bytedeco.tesseract.TessBaseAPI;
import org.bytedeco.tesseract.TessResultRenderer;import static org.bytedeco.leptonica.global.leptonica.pixDestroy;
import static org.bytedeco.leptonica.global.leptonica.pixRead;
import static org.bytedeco.tesseract.global.tesseract.PSM_AUTO;public class TesseractExample {public static void main(String[] args) {// 创建 Tesseract 实例TessBaseAPI tesseract new TessBaseAPI();String dataPath C:\\tess4j\\tessdata;// 初始化 Tesseract 实例你需要将 path/to/tessdata 替换为你的 tessdata 文件夹的路径if (tesseract.Init(dataPath, eng, OEM_LSTM_ONLY) ! 0) {System.err.println(无法初始化 Tesseract。);System.exit(1);}String fileName C:\\laker\\demo3\\69c7f2a6-3f0e-4ced-86c3-4ea42dcb7c34.PNG;// 读取图像文件并转换为 Leptonica PIX 对象PIX image pixRead(fileName);// 设置输出文件名这是一个示例你需要根据实际情况进行调整String outputFileName output_file;// 设置页面索引如果有多页int pageIndex 0; // Note: Page index starts from 0// 设置重试配置可以为nullString retryConfig null;// 设置超时时间毫秒int timeoutMillisec 5000;// 设置渲染器可以为nullTessResultRenderer renderer null;// 设置变量这里是为了将识别结果写为图像文件你可以根据需要进行调整tesseract.SetVariable(tessedit_write_images, 1);// 设置 OCR Engine Mode这里设置为 Oem.TESSERACT_ONLY你可以根据需要进行调整tesseract.SetPageSegMode(PSM_AUTO);// 调用 ProcessPage 方法tesseract.SetImage(image);tesseract.ProcessPage(image, pageIndex, outputFileName, null, timeoutMillisec, renderer);// 打印识别结果BytePointer outText tesseract.GetUTF8Text();System.out.println(识别结果 outText.getString());// 释放 Leptonica PIX 对象内存pixDestroy(image);// 结束 Tesseract 实例tesseract.End();}
}方式二也可以用api.GetThresholdedImage()直接获取跟设置一样的效果。 // 获取二值化图像
PIX thresholdedImage api.GetThresholdedImage();// 将二值化图像保存到文件
String thresholdedImageFilePath C:\\thresholded_image.tif;
pixWrite(thresholdedImageFilePath, thresholdedImage, IFF_TIFF_G4);内部源码 https://github.com/tesseract-ocr/tesseract/blob/637be531f649832032fc477fd7f82249bb7d776b/src/api/baseapi.cpp#L1292 if (tesseract_-tessedit_write_images) {Pix *page_pix GetThresholdedImage();std::string output_filename output_file_ .processed;if (page_index 0) {output_filename std::to_string(page_index);}output_filename .tif;pixWrite(output_filename.c_str(), page_pix, IFF_TIFF_G4);pixDestroy(page_pix);
}默认
原始图片 内部生成的tessinput.tif文件 当前识别结果为
int timeoutMillisec 5000;
TessResultRenderer renderer null;tesseract.SetVariable( name: write_images, value: 1v); // 这一行错误tesseract.SetPageSegHode (PSH_AUTO) ; // 这一行错误tesseract.SetImage (image);tesseract.ProcessPage (image, pageIndex, outputFileName, retry config: null, timeoutMillisec, renderer);
CSDN lakernote反转图像
在Tesseract版本3.05以及更早版本中处理反转图像暗色背景和亮色文本时没有问题但在4.x版本中请使用亮色背景上的暗色文本。
重新缩放
Tesseract在至少300 dpi的图像上效果最佳因此调整图像大小可能是有益的。
二值化
Tesseract在内部使用Otsu算法执行图像转为黑白的操作但结果可能不理想特别是当页面背景的暗度不均匀时。
Tesseract 5.0.0版本新增了两种基于Leptonica的二值化方法自适应Otsu和Sauvola。您可以使用命令 tesseract --print-parameters | grep thresholding_ 查看相关的可配置参数。
如果您无法通过提供更好的输入图像来解决问题可以尝试使用不同的算法。请参考ImageJ自动阈值Java、OpenCV图像阈值处理Python或scikit-image阈值处理文档Python。
噪音消除
噪声是图像中亮度或颜色的随机变化它会使图像的文本更难以阅读。在二值化步骤中Tesseract 无法消除某些类型的噪声这可能会导致准确率下降
膨胀/腐蚀
粗体字符或细体字符尤其是带有衬线的字符可能会影响细节的识别降低识别准确率。许多图像处理程序允许在公共背景下对字符边缘进行膨胀和腐蚀以扩大或增大膨胀或缩小腐蚀。
历史文献中的大量墨水渗色可以通过使用侵蚀技术来补偿。侵蚀可用于将字符缩小回其正常的字形结构。
旋转/偏移校正
倾斜的图像是指扫描的页面不直。如果页面太倾斜Tesseract 的线分割质量会显着降低这会严重影响 OCR 的质量。要解决此问题请旋转页面图像使文本行处于水平位置。
边框
缺少边框
如果您仅对没有任何边框的文本区域进行 OCR则 tesseract 可能会出现问题。请参阅tesseract 用户论坛#427中的一些详细信息。您可以使用ImageMagick®轻松添加小边框例如 10 px
convert 427-1.jpg -bordercolor White -border 10x10 427-1b.jpg边框太大
大边框尤其是在大背景上处理单个字母/数字或一个单词时可能会导致问题“空页”。请尝试将您输入的图像裁剪到具有合理边框例如10像素的文本区域。
扫描边框去除
扫描的页面周围通常有黑色边框。这些可能会被错误地视为额外字符特别是当它们的形状和渐变不同时。
透明度/Alpha通道
某些图像格式例如 png可以具有用于提供透明度功能的Alpha 通道。
Tesseract 3.0x 期望用户在 tesseract 中使用图像之前从图像中删除 alpha 通道。这可以通过 ImageMagick 命令来完成
convert input.png -alpha off output.pngTesseract 4.00 使用 leptonica 函数pixRemoveAlpha()删除 alpha 通道它通过将 alpha 分量与白色背景混合来删除它。在某些情况下例如电影字幕的 OCR 这可能会导致问题因此用户需要自行删除 Alpha 通道或通过反转图像颜色来预处理图像。
引擎处理阶段
语言模型
tessdata_best这个仓库包含了Tesseract 4.0的最高精度训练数据这些数据的识别精度更高但是运行速度较慢。如果你的应用场景对识别精度有很高的要求可以使用这个仓库的数据。
配置
tessBaseAPI.SetVariable(tessedit_char_whitelist,ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789); // 识别白名单
tessBaseAPI.SetVariable(tessedit_char_blacklist, ®!#$%^*()_-[]}{;:\\\|~,./?); // 识别黑名单tessBaseAPI.setPageSegMode(TessBaseAPI.PageSegMode.PSM_AUTO_OSD);//设置识模式
// 设置dpi 300如果不设置老打印 Estimating resolution as xxx
tessBaseAPI.SetVariable(user_defined_dpi,300);如果名称查找失败则返回 false。例如使用 SetVariable(“tessedit_char_blacklist”, “xyz”); 可以忽略 x、y 和 z。 或者使用 SetVariable(“classify_bln_numeric_mode”, “1”); 可以设置为仅数字模式。 SetVariable 可以在 Init 之前使用但设置将在 End() 时恢复为默认值。注意必须在 Init 之后调用。仅适用于非初始化变量初始化变量应该在 Init() 中传递。 –dpi N 在DPI中为输入图像指定分辨率N.N的典型值为300.如果没有此选项则从图像中包含的元数据中读取分辨率。如果图像不包含该信息Tesseract会尝试猜测它。 –psm N
将Tesseract设置为仅运行分析的某个子集并假设某种形式的图像。N的选项是
0 仅限方向和脚本检测OSD。
1 使用OSD自动分页。
2 自动页面分割但没有OSD或OCR。
3 全自动页面分割但没有OSD。默认
4 假设一列可变大小的文本。
5 假设一个垂直对齐文本的统一块。
6 假设一个统一的文本块。
7 将图像视为单个文本行。
8 将图像视为单个单词。
9 将图像视为圆形中的单个单词。
10 将图像视为单个字符。
11 稀疏文本。找到尽可能多的文本没有特定的顺序。
12 带OSD的稀疏文本。
13 原始线。将图像视为单个文本行绕过特定于Tesseract的黑客攻击。–oem N
指定OCR引擎模式。N的选项是
0 仅原始Tesseract。
1 神经网络仅限LSTM。
2 Tesseract LSTM。
3 默认基于可用的内容。–user-patterns FILE 指定用户模式文件的位置, 用于某种“正则表达式”.如果我们假设您正在扫描具有相同格式的数据的书籍,则可以使用它. –user-words FILE 指定用户词文件的位置。 提高识别速度
如果您正在运行 Tesseract 4则可以使用“快速”整数模型。
Tesseract 4 在处理一个页面时还使用最多四个 CPU 线程因此对于单个页面来说它会比 Tesseract 3 更快。
如果您的计算机只有两个 CPU 核心那么运行四个线程会显着减慢速度最好使用单个线程或最多两个线程使用单线程消除了多线程的计算开销也是通过每个 CPU 核心运行一个 Tesseract 进程来处理大量图像的最佳解决方案。
使用环境变量设置最大线程数OMP_THREAD_LIMIT。
要禁用多线程请使用OMP_THREAD_LIMIT1.
更新 2019-10-06最近的 tesseract 代码允许使用-c tessedit_do_invert0带来额外速度的选项。
词典、单词列表和模式
默认情况下Tesseract 经过优化以识别单词句子。如果您尝试识别其他内容例如收据、价目表或代码您可以采取一些措施来提高结果的准确性并仔细检查是否选择了适当的细分方法。
如果您的大部分文本不是字典单词则禁用 Tesseract 使用的字典应该会提高识别度。可以通过将配置变量 load_system_dawg和设置load_freq_dawg为 来禁用它们false。
还可以将单词添加到 Tesseract 用于帮助识别的单词列表中或者添加常见的字符模式如果您对期望的输入类型有很好的了解这可以进一步帮助提高准确性。Tesseract 手册对此进行了更详细的解释。
如果您知道只会遇到该语言中可用字符的子集例如仅数字则可以使用tessedit_char_whitelist 配置变量。请参阅常见问题解答以获取示例。
表格识别
众所周知tesseract 在没有自定义分段/布局分析的情况下识别表中的文本/数据存在问题请参阅问题跟踪器。您可以尝试使用/测试Sintun 提案或者使用 PyTesseract 和 OpenCV / Text-Extraction-Table-Image 代码从表格图像中的文本提取中获得一些想法
使用 Tesseract OCR 的 GUI 和其他项目
https://github.com/tesseract-ocr/tessdoc/blob/main/User-Projects-%E2%80%93-3rdParty.md
可以从 https://github.com/tesseract-ocr/tessdata_best 获得相同的语言和脚本。tessdata_best提供慢速语言和脚本模型。训练需要这些模型。它们也可以提供更好的OCR结果但识别需要更多时间。
tessdata_fast和tessdata_best都只支持LSTM OCR引擎。
还有第三个存储库https://github.com/tesseract-ocr/tessdata 其模型支持Tesseract 3传统OCR引擎和Tesseract 4 LSTM OCR引擎。