十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Ubuntu 20.04安装配置Tesseract-OCR:从环境搭建到图像预处理实战

Ubuntu 20.04安装配置Tesseract-OCR:从环境搭建到图像预处理实战 1. 项目概述为什么在Ubuntu上折腾Tesseract-OCR如果你在Linux环境下处理过图片转文字、PDF文档信息提取或者想给某个自动化脚本加上“眼睛”来识别屏幕上的文字那你大概率听说过Tesseract-OCR。它是个老牌的开源光学字符识别引擎由谷歌赞助维护识别精度在开源领域算是第一梯队关键是免费、可定制。我最早接触它是在做文档数字化归档项目时需要在服务器端批量处理扫描件Windows下配置环境依赖总出幺蛾子后来索性全迁移到Ubuntu上发现这才是它的“主场”尤其是像Ubuntu 20.04 LTS这种长期支持版本系统稳定软件源丰富配置起来一路绿灯。这次咱们不聊那些高深的训练自定义字库就从最实在的出发怎么在Ubuntu 20.04这个依然被广泛使用的系统上把Tesseract-OCR稳稳当当地装好、配好并且让它能干活。你会发现虽然网上教程很多但有些细节没讲透比如不同安装方式对后续使用的影响、语言包到底怎么管理、遇到常见的图片预处理问题怎么办。我把自己在多个项目里趟过的路、踩过的坑都揉在这里目标就是让你看完之后能在自己的Ubuntu 20.04机器上一条龙搞定从安装到基础使用的全过程遇到常见问题也知道去哪儿找答案。2. 环境准备与安装方案选型在Ubuntu上安装软件我们有好几条路可以走直接用系统自带的apt包管理器、下载源码自己编译、或者用Python的pip安装针对Python的封装。选哪条路取决于你想怎么用Tesseract。2.1 系统与依赖检查首先确认你的系统确实是Ubuntu 20.04。打开终端输入lsb_release -a你会看到类似Description: Ubuntu 20.04.6 LTS的输出。LTS代表长期支持系统基础库比较稳定这是我们顺利安装的前提。接下来更新软件包列表确保我们获取的是最新的源信息sudo apt update这个操作本身不升级任何已安装的软件只是刷新本地软件包索引。我建议在安装任何新软件前都做一下能避免很多因源信息过期导致的依赖问题。2.2 三种安装路径深度解析方案一通过APT安装推荐给大多数用户这是最省心、最主流的方式。Ubuntu官方源里就包含了Tesseract-OCR。sudo apt install tesseract-ocr执行这个命令apt会自动处理所有依赖包括图像处理库libtiff、libpng、libjpeg等。安装完成后可以通过tesseract --version查看版本。在Ubuntu 20.04的默认源里通常安装的是Tesseract 4.x版本比如4.1.1。这个版本已经包含了基于LSTM长短期记忆网络的识别引擎对印刷体文字的识别率相比古老的3.x版本有质的提升。注意通过apt安装的Tesseract其可执行文件、库文件都会放在系统标准路径如/usr/bin/tesseract管理起来最规范。后续如果你想用Python来调用通常会选择安装pytesseract这个包它本质上是一个调用命令行tesseract的封装。方案二从源码编译安装适合需要最新特性或深度定制者如果你需要Tesseract 5.x版本支持新的神经网络架构如基于Vision Transformer的识别器或者你想启用某些实验性功能、修改源码那就得自己编译。首先安装编译工具和依赖库sudo apt install autoconf automake libtool pkg-config libpng-dev libjpeg-dev libtiff-dev zlib1g-dev libicu-dev libpango1.0-dev libcairo2-dev从GitHub克隆源码并编译git clone https://github.com/tesseract-ocr/tesseract.git cd tesseract ./autogen.sh ./configure make sudo make install sudo ldconfig这种方式灵活性最高但过程繁琐且容易因依赖版本问题编译失败。对于绝大多数应用场景APT安装的4.x版本完全够用。方案三通过pip安装pytesseract仅限Python环境如果你只用Python且不想在系统层面安装Tesseract可以试试pip install pytesseract但请注意pytesseract只是一个Python接口它仍然需要系统安装Tesseract-OCR引擎。它会在运行时尝试调用系统的tesseract命令。所以这通常是与方案一结合使用的即用apt安装引擎用pip安装Python绑定这样在Python脚本里调用最方便。我的选择与建议对于95%的情况我强烈推荐方案一。它简单、稳定、易于维护。系统级安装让所有用户、所有脚本都能方便地调用。后续的讲解也主要基于通过APT安装的Tesseract。3. 语言包管理与核心配置安装好引擎只是第一步就像买了一台打印机还没装墨盒语言数据。Tesseract默认只安装了英文eng数据包。要识别其他语言必须额外安装对应的语言包。3.1 语言包的安装与选择语言包的命名规则是tesseract-ocr-{语言代码}。你可以用apt search tesseract-ocr-来查看所有可用的语言包。安装简体中文和英文sudo apt install tesseract-ocr-chi-sim tesseract-ocr-eng这里chi-sim代表简体中文eng是英文。通常中英文混排的文档识别这两个包是基础。安装所有语言包不推荐sudo apt install tesseract-ocr-all这会安装上百种语言占用近1GB磁盘空间。除非你有明确的多种语言识别需求否则没必要。安装后语言数据文件通常位于/usr/share/tesseract-ocr/4.00/tessdata/目录下。你可以用ls命令查看已安装的.traineddata文件。3.2 多语言识别与配置技巧在命令行中使用多语言识别用-l参数指定语言代码多个语言用连接tesseract image.png output -l chi_simeng这条命令会同时使用中文和英文语言模型进行识别对于包含中英文混合内容的图片效果更好。实操心得语言代码的书写要注意。在包名中是chi-sim带横杠但在-l参数中使用时需要写成chi_sim带下划线。这是一个常见的坑点。有时候你可能需要识别一些特定领域的文档比如财务表格、古书籍等通用的语言包识别率可能不高。这时可以考虑使用社区训练的语言包。你可以在 Tesseract的GitHub Wiki 上找到更多由社区训练和贡献的语言数据文件。下载后将其放入/usr/share/tesseract-ocr/4.00/tessdata/目录即可使用。4. 基础使用与命令行参数详解Tesseract最基本的使用方式就是命令行格式很简单tesseract 输入图像文件 输出文本文件基础名 [选项...]4.1 核心命令行参数解析除了上面提到的-l还有几个参数至关重要--psm N页面分割模式这个参数告诉Tesseract如何分析图片中的文本布局。默认是3全自动页面分割但不进行方向检测。我常用的几个模式--psm 6假设图像为单个文本块。适用于截图、标语、单行文字。--psm 7假设图像为单个文本行。适用于车牌、验证码。--psm 11将图像视为稀疏文本尽可能按顺序查找文本。适用于不规则排列的文字。--psm 13原始行。将图像视为单个文本行绕过特定于块的hacks。这是处理截图里一行命令或网址的利器。 例如识别一个手机截图中的单行验证码tesseract captcha.png result --psm 7 -l eng--oem NOCR引擎模式0仅限传统引擎Tesseract 3.x风格。1仅限神经网络LSTM引擎Tesseract 4.x默认。2传统 LSTM引擎。3默认基于可用的内容自动选择。 对于现代印刷体坚持使用--oem 1LSTM即可它的识别率远高于传统模式。-c CONFIGVARVALUE用于设置Tesseract内部的配置变量。最有用的是设置白名单或黑名单。白名单只识别特定字符。例如只识别数字tesseract image.png output -c tessedit_char_whitelist0123456789黑名单排除特定字符。例如排除字母o和O容易与数字0混淆tesseract image.png output -c tessedit_char_blacklistoO这在处理身份证号、发票号等格式固定的内容时能极大提升准确率。4.2 输出格式控制默认输出是纯文本.txt。Tesseract还支持其他输出格式通过指定输出文件后缀或使用-c参数TSV制表符分隔值输出包含每个识别出的单词、其坐标、置信度等丰富信息的结构化文件。tesseract image.png output tsv生成的output.tsv文件可以用Excel打开方便进行进一步的数据分析和处理比如根据坐标信息还原版面。PDF生成可搜索的PDF文件。这需要Tesseract编译时支持PDF功能APT安装的版本通常支持。tesseract image.png output pdfHOCR输出包含位置信息的HTML格式文件可用于在网页上高亮显示识别出的文字区域。5. 图像预处理识别率提升的关键一步直接拿手机拍的歪歪扭扭、有阴影、带噪点的图片给Tesseract识别率肯定惨不忍睹。图像预处理是OCR流程中性价比最高的环节。我们不需要复杂的深度学习模型用一些经典的图像处理技术就能让识别效果脱胎换骨。5.1 使用ImageMagick进行自动化预处理ImageMagick是Linux下的图像处理瑞士军刀。我们可以写一个简单的Bash脚本将预处理流程自动化#!/bin/bash input_image$1 output_imagepreprocessed_${input_image} # 1. 转换为灰度图减少颜色信息干扰 convert $input_image -colorspace Gray temp_gray.png # 2. 提高对比度让文字更突出 convert temp_gray.png -contrast-stretch 1% temp_contrast.png # 3. 降噪去除细小斑点 convert temp_contrast.png -despeckle temp_despeckle.png # 4. 二值化阈值处理将图像转为纯黑白 convert temp_despeckle.png -threshold 60% $output_image # 5. 清理临时文件 rm temp_gray.png temp_contrast.png temp_despeckle.png echo 预处理完成输出文件: $output_image将上述脚本保存为preprocess.sh并赋予执行权限chmod x preprocess.sh。使用方式./preprocess.sh your_image.png。这个脚本依次执行了灰度化、对比度拉伸、降噪和二值化能解决大部分光照不均、背景杂乱的问题。5.2 使用OpenCV进行更精细的控制Python示例如果你熟悉PythonOpenCV提供了更强大的控制能力。下面是一个示例函数import cv2 import numpy as np def preprocess_image_for_ocr(image_path): # 读取图像 img cv2.imread(image_path) # 转换为灰度图 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 高斯模糊轻微降噪 blurred cv2.GaussianBlur(gray, (3, 3), 0) # 自适应阈值二值化能更好地处理光照不均 binary cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) # 形态学操作闭运算填充文字内部小孔 kernel np.ones((2,2), np.uint8) closed cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel) # 保存处理后的图像 output_path preprocessed_ image_path cv2.imwrite(output_path, closed) return output_path # 使用函数 processed_img preprocess_image_for_ocr(document.jpg)OpenCV的adaptiveThreshold方法比简单的全局阈值更智能特别适合处理背景亮度不均匀的文档照片。6. 通过Python集成与自动化在真实项目中我们很少手动敲命令行而是将OCR集成到自动化脚本或应用里。Python的pytesseract库和PillowPIL库是黄金搭档。6.1 基础Python调用示例首先确保已安装pytesseract和Pillowpip install pytesseract pillow然后编写脚本from PIL import Image import pytesseract import sys # 指定Tesseract可执行文件路径如果不在系统PATH中 # pytesseract.pytesseract.tesseract_cmd r/usr/bin/tesseract def ocr_image(image_path, langchi_simeng): 对指定图片进行OCR识别 Args: image_path: 图片路径 lang: 语言代码默认中英文混合 Returns: 识别出的文本字符串 try: # 使用Pillow打开图片 img Image.open(image_path) # 调用Tesseract进行识别 text pytesseract.image_to_string(img, langlang, config--psm 6 --oem 1) return text.strip() except Exception as e: print(f识别图像 {image_path} 时出错: {e}) return if __name__ __main__: if len(sys.argv) 1: result ocr_image(sys.argv[1]) print(识别结果) print(result) else: print(请提供图片路径作为参数。)6.2 批量处理与结构化信息提取自动化处理的威力在于批量操作。假设我们有一个文件夹./invoices/里面全是需要提取金额的发票截图import os import re from PIL import Image import pytesseract def extract_amount_from_invoice(image_path): 从发票图片中提取金额一个简单的示例 img Image.open(image_path) # 使用只包含数字的白名单提高数字识别准确率 custom_config r-c tessedit_char_whitelist0123456789., --psm 6 text pytesseract.image_to_string(img, configcustom_config) # 使用正则表达式查找金额模式例如1234.56 amount_pattern r\d{1,3}(?:,\d{3})*\.\d{2} # 匹配如1,234.56的格式 matches re.findall(amount_pattern, text) if matches: # 取第一个匹配项并移除逗号 amount matches[0].replace(,, ) return float(amount) return None def batch_process_invoices(directory): 批量处理目录下的所有图片 supported_formats (.png, .jpg, .jpeg, .bmp, .tiff) for filename in os.listdir(directory): if filename.lower().endswith(supported_formats): filepath os.path.join(directory, filename) amount extract_amount_from_invoice(filepath) if amount: print(f{filename}: 提取到金额 {amount}) else: print(f{filename}: 未找到金额信息) # 执行批量处理 batch_process_invoices(./invoices/)这个脚本展示了如何将OCR与简单的规则正则表达式结合从非结构化的文本中提取出结构化的数据金额。在实际项目中你可能需要根据文档的具体布局设计更复杂的文本解析逻辑。7. 常见问题排查与性能优化即使按照步骤操作也难免会遇到问题。下面是我总结的一些高频问题和解决方法。7.1 安装与运行问题问题1执行tesseract命令提示“未找到命令”或“command not found”。原因通常是因为安装失败或可执行文件路径不在系统的PATH环境变量中。解决首先确认是否安装成功dpkg -l | grep tesseract-ocr。如果已安装尝试使用绝对路径/usr/bin/tesseract --version。如果绝对路径可以说明是PATH问题。可以编辑~/.bashrc文件添加export PATH$PATH:/usr/bin如果/usr/bin不在PATH中的话但这种情况极少见。更可能的原因是安装过程被中断。问题2识别中文时全是乱码或空白。原因没有安装中文语言包或者安装的语言包损坏。解决确认语言包已安装apt list --installed | grep tesseract-ocr-chi-sim。检查语言数据文件是否存在ls -l /usr/share/tesseract-ocr/4.00/tessdata/chi_sim.traineddata。如果文件存在但识别仍失败尝试从 Tesseract官方GitHub tessdata仓库 手动下载chi_sim.traineddata文件替换或放置到上述tessdata目录中。问题3识别速度非常慢。原因图片分辨率过高使用了过于复杂的页面分割模式PSM或者系统资源不足。解决缩放图片在预处理阶段将图片的宽度缩放到1500像素左右如果原图很大。对于OCR来说300-400 DPI已经足够过高的分辨率只会增加计算量对精度提升有限。convert large_image.jpg -resize 1500x output.jpg选择合适的PSM如果图片内容简单如单行文字使用--psm 7或--psm 13会比默认的--psm 3快很多。关闭不必要的功能通过-c参数关闭一些耗时的功能例如-c textord_heavy_nr0禁用繁重的噪声消除。7.2 识别准确率问题问题4数字0和字母O、1和字母l经常混淆。原因这是OCR的经典难题因为字体中这些字符形状相似。解决使用白名单/黑名单如果明确知道区域只包含数字使用白名单-c tessedit_char_whitelist0123456789。如果知道不包含易混淆字母使用黑名单排除。后期字典校正对于英文单词Tesseract内部有字典校正。但对于无意义的字符串如产品编码此功能可能帮倒忙。可以通过-c load_system_dawg0和-c load_freq_dawg0关闭字典加载让它只做纯粹的字符识别。字体训练如果文档使用特定字体如收据打印机字体可以考虑为该字体训练一个专属的语言数据文件这是从根本上解决问题的方法但过程较复杂。问题5图片有倾斜导致识别率下降。原因Tesseract对文本行的水平度有一定要求。解决在预处理阶段加入图像纠偏Deskew。可以使用OpenCV的minAreaRect函数来检测文本区域的角度并进行旋转校正。也有现成的工具如scikit-image的radon变换可以用来检测倾斜角度。7.3 高级技巧与性能优化表下表汇总了一些提升特定场景下识别效果的高级配置参数配置变量含义与作用适用场景示例用法tessedit_pageseg_mode同--psm参数设置页面分割模式。所有场景根据图片内容选择。-c tessedit_pageseg_mode6tessedit_ocr_engine_mode同--oem参数选择OCR引擎。现代印刷体推荐LSTM引擎。-c tessedit_ocr_engine_mode1preserve_interword_spaces保留单词间的空格。识别代码、保留格式的文本。-c preserve_interword_spaces1user_defined_dpi手动设置图像DPI。当图像元数据中缺少或DPI信息错误时。-c user_defined_dpi300textord_min_linesize文本行的最小尺寸像素。过滤掉图像中过小的噪声点非文本。-c textord_min_linesize10chop_enable启用字符分割。对于字符粘连严重的图像可以尝试关闭。-c chop_enable0要查看Tesseract所有可用的配置变量及其默认值可以使用命令tesseract --print-parameters。最后记住一个核心原则给Tesseract的图片越干净、越接近扫描的黑白文档它的表现就越好。大量的时间应该花在图像预处理上而不是盲目调整OCR引擎的参数。当识别结果不理想时先别急着怀疑Tesseract的能力把中间处理后的图片拿出来看一眼往往问题就一目了然了。
返回列表