从零开发短视频电商 Tesseract OCR识别增强

文章目录

    • 概要
    • 图像预处理阶段
      • 默认
      • 反转图像
      • 重新缩放
      • 二值化
      • 噪音消除
      • 膨胀/腐蚀
      • 旋转/偏移校正
      • 边框
        • 缺少边框
        • 边框太大
        • 扫描边框去除
      • 透明度/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// 设置重试配置(可以为null)String retryConfig = null;// 设置超时时间(毫秒)int timeoutMillisec = 5000;// 设置渲染器(可以为null)TessResultRenderer 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.png

Tesseract 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 =神经网络仅限LSTM2 = Tesseract + LSTM3 =默认,基于可用的内容。

–user-patterns FILE

指定用户模式文件的位置,
用于某种“正则表达式”.如果我们假设您正在扫描具有相同格式的数据的书籍,则可以使用它.

–user-words FILE

指定用户词文件的位置。

提高识别速度

如果您正在运行 Tesseract 4,则可以使用“快速”整数模型。

Tesseract 4 在处理一个页面时还使用最多四个 CPU 线程,因此对于单个页面来说它会比 Tesseract 3 更快。

如果您的计算机只有两个 CPU 核心,那么运行四个线程会显着减慢速度,最好使用单个线程或最多两个线程!使用单线程消除了多线程的计算开销,也是通过每个 CPU 核心运行一个 Tesseract 进程来处理大量图像的最佳解决方案。

使用环境变量设置最大线程数OMP_THREAD_LIMIT

要禁用多线程,请使用OMP_THREAD_LIMIT=1.

更新 2019-10-06:最近的 tesseract 代码允许使用-c tessedit_do_invert=0带来额外速度的选项。

词典、单词列表和模式

默认情况下,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_fasttessdata_best都只支持LSTM OCR引擎。

还有第三个存储库,https://github.com/tesseract-ocr/tessdata, 其模型支持Tesseract 3传统OCR引擎和Tesseract 4 LSTM OCR引擎。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/654128.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TypeScript实战系列之合理运用类型

目录 介绍any 和 unknownerve 的用途断言type 和 interfacedeclare 关键字的作用联合类型 和 类型守卫交叉类型 介绍 这篇主要介绍下ts 常用的基本类型和一些常用的技巧性技能 any 和 unknow any 和 unknown 是两个类型关键字&#xff0c;它们用于处理类型不确定或未知的情况…

【Sql Server】新手一分钟看懂在已有表基础上修改字段默认值和数据类型

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

力扣日记1.28-【回溯算法篇】93. 复原 IP 地址

力扣日记&#xff1a;【回溯算法篇】93. 复原 IP 地址 日期&#xff1a;2023.1.28 参考&#xff1a;代码随想录、力扣 93. 复原 IP 地址 题目描述 难度&#xff1a;中等 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&…

IP地址定位技术的巧妙运用:企业网络安全的坚实防线

在当今数字时代&#xff0c;企业网络安全成为了至关重要的议题。面对不断增长的网络威胁&#xff0c;企业不得不采用创新性技术来保护其机密信息和关键系统。IP地址定位技术作为一种强大的工具&#xff0c;为企业提供了一种新颖而高效的网络安全保护手段。 IP地址定位技术简介 …

前端Vue v-for 的使用

目录 ​编辑 简介 使用方式 基本使用 v-for"(item, index)中item和index作用 示例 迭代对象 示例 结果 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入…

证券公司怎么选择?福州开股票账户佣金最低是多少?怎么开低佣金账户?

股票交易佣金是指投资者在进行股票交易时&#xff0c;需要向券商支付的手续费。具体的佣金费用根据券商的政策而有所不同&#xff0c;一般分为固定佣金和按比例佣金两种方式。 固定佣金是指交易每一笔固定收取一定金额的佣金&#xff0c;通常适用于较小交易量的投资者&#xf…

github ssh ssh-keygen

生成和使用 SSH 密钥对是一种安全的身份验证方式&#xff0c;用于在你的本地系统和 GitHub 之间进行身份验证。以下是在 GitHub 上生成和使用 SSH 密钥对的基本步骤&#xff1a; 1. 生成 SSH 密钥对 在命令行中执行以下命令来生成 SSH 密钥对&#xff1a; ssh-keygen -C &q…

ATT汇编

指令后缀 AT&T格式的汇编指令有不同的后缀 其中 b表示byte&#xff0c;字节 w表示word&#xff0c;字/两字节 l表示long&#xff0c;32位系统下的long是4字节 q表示quad&#xff0c;意味四重&#xff0c;表示4个字/8字节 寄存器用途 参见 AT&T的汇编世界 - Gemfield…

把数组中的key都取出来然后去重

今日接到一个小需求&#xff0c;一张表有类似这样的数据&#xff1a;&#xff08;下面是一行&#xff09; 但是每行的数据&#xff0c;主要是key不一样&#xff0c;我们想把所有的key取出来&#xff0c;并且做个去重。 首先我先在mysql中&#xff0c; SELECT GROUP_CONCAT(RE…

蓝桥杯---九数组分数

1,2,3 ... 9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 下面的程序实现了该功能,请填写划线部分缺失的代码。 注意,只能填写缺少的部分,不要重复抄写已有代码。不要填写任何多余的文字。 代码 public class _05九数组分数 {public static void test(int[] x){int a …

Linux, Certbot快速申请免费https证书

linux环境. 更新apt,为了能正确的下载certbot apt update 安装certbot apt install certbot 如果之前nginx已经开启着了,先关掉,防止端口占用 nginx -s stop 运行certbot开始获取证书文件 certbot certonly 输入1直接回车,意思就是让certbot模拟一个web服务器执行下面的…

探秘Photoshop | 一站式了解所有相关信息

Photoshop是迄今为止世界上最强大的图像编辑软件&#xff0c;它已成为许多涉及图像处理的行业标准。软件技术一天行千里&#xff0c; Photoshop也在不断更新&#xff0c;从1990年开始发布&#xff0c; photoshop1.0到最新的 2018Photoshop... 几乎每隔一年&#xff0c;Photosho…

Apache 辅助系统工具

一丶Apache Sqoop 1.Sqoop的介绍&#xff1a; Sqoop的工作机制是将导入或者导出的命令翻译成MapReduce实现&#xff0c;Sqoop可以理解为&#xff1a;SQL到Hadoop或者Hadoop到SQL 2.Sqoop的安装 配置文件修改&#xff1a; cd $SQOOP_HOME/conf mv sqoop-env-template.sh sqo…

Dubbo Consumer 对Provider的protocol选择逻辑

一、简介 dubbo consumer 如果没有指定protocol参数&#xff0c;默认会将provider注册的protocol provider url都获取并转换为Invoker放到Directory中。如果consumer指定了protocol则会在Directory中选择相应的protocol provider url转换为Invoker放在Directory中。 二、代码分…

力扣hot100 柱状图中最大的矩形 单调栈

Problem: 84. 柱状图中最大的矩形 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 参考地址 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) Code class Solution {public static int largestRectangleArea(int[] height){Stack&l…

【英语趣味游戏】填字谜(Crossword)第1天

谜题出处 柯林斯字谜大全&#xff08;6&#xff09;&#xff0c;Collins——Big Book of Crosswords&#xff08;Book 6&#xff09; Puzzle Number: 114 本期单词 横向 1、Situation involving danger (4) 包含危险的情境&#xff0c;4个字母 答案&#xff1a;Risk&#xff…

shell

目录 一.运行方式 二.编程习惯 三.变量 3.1变量的命名 3.3普通变量(局部变量) 3.4特殊变量 3.5变量子串 3.6变量赋值 四.运算方式 4.1$(( )) 4.2let 4.3expr 4.4bc(小数运算) 4.5$[ ] 4.6awk 4.7总结运算方式 五.条件测试语句 5.1文件 5.2条件测试表达式…

揭秘IP地址定位:了解如何通过IP地址追踪你的位置

在互联网时代&#xff0c;我们的每一次在线活动都留下了痕迹&#xff0c;而IP地址则是其中一个关键的标识。IP地址定位技术的发展使得我们能够通过IP地址追踪设备的位置&#xff0c;这在某些情况下对于服务提供商、广告商和甚至研究人员来说可能是有用的。本文将深入探讨IP地址…

webassembly003 whisper.cpp的python绑定实现+Cython+Setuptools的GUI程序

CODE python端的绑定和本文一样&#xff0c;还需要将cdef char* LANGUAGE b’en’改为中文zh&#xff08;也可以在函数中配置一个参数修改这个值&#xff09;。ps:本来想尝试cdef whisper_context* whisper_init_from_file_with_params_no_state(char*, whisper_full_params)…

构建中国人自己的私人GPT—支持中文

上一篇已经讲解了如何构建自己的私人GPT&#xff0c;这一篇主要讲如何让GPT支持中文。 privateGPT 本地部署目前只支持基于llama.cpp 的 gguf格式模型&#xff0c;GGUF 是 llama.cpp 团队于 2023 年 8 月 21 日推出的一种新格式。它是 GGML 的替代品&#xff0c;llama.cpp 不再…