开发者

使用Python的pytesseract库开发简易OCR图片文字识别工具

开发者 https://www.devze.com 2025-10-11 09:26 出处:网络 作者: xcLeigh
目录前言一、工具核心技术栈二、环境搭建(关键步骤)2.1 安装 Tesseract OCR 引擎(1)Windows 系统(2)MACOS 系统(3)linux 系统(以 Ubuntu 为例)2.2 安装 python 依赖库三、核心原理:为什么需要图片预处理?
目录
  • 前言
  • 一、工具核心技术栈
  • 二、环境搭建(关键步骤)
    • 2.1 安装 Tesseract OCR 引擎
      • (1)Windows 系统
      • (2)MACOS 系统
      • (3)linux 系统(以 Ubuntu 为例)
    • 2.2 安装 python 依赖库
    • 三、核心原理:为什么需要图片预处理?
      • 四、完整代码实现与详细解释
        • 4.1 完整代码
          • 4.2 运行效果
            • 4.3 代码逐模块详解
              • (1)图片预处理模块 image_preprocessing
              • (2)OCR 识别模块 ocr_recognize
              • (3)结果保存模块 save_result
              • (4)主函数 main 与命令行参数
          • 五、工具使用教程(实战演示)
            • 5.1 准备测试图片
              • 5.2 场景 1:识别英文图片
                • 执行流程与输出:
              • 5.3 场景 2:识别中文图片
                • 注意:
              • 5.4 场景 3:Windows 未配置环境变量时使用(补充完整)
              • 六、常见问题与优化方向
                • 6.1 识别准确率低?试试这些优化
                  • 6.2 扩展功能:支持批量识别图片
                    • 6.3 打包为可执行文件(方便非编程用户使用)
                    • 七、总结

                      前言

                      本文详细介绍了如何用Python的pytesseract库开发简易OCR识别工具,适用于提取图片文字。首先明确核心技术栈,包括依赖底层的Tesseract OCR引擎,以及pytesseract、OpenCV-Python、Pillow、argparse等库及其作用。接着分步骤指导环境搭建,重点说明不同系统下Tesseract OCR引擎的安装与配置,以及Python依赖库的安装。还解释了图片预处理的必要性及具体步骤,以提升识别准确率。随后提供完整代码,按图片预处理、OCR识别、结果保存、命令行交互模块逐段详解,并给出多场景使用教程。同时,针对常见报错(如找不到图片、Tesseract路径问题、中文语言包缺失)提供了具体排查和解决方法,帮助用户顺利实现中英文图片的文字识别与结果保存。

                      在日常工作和学习中,我们经常会遇到需要将图片中的文字提取出来的场景(如扫描件、截图文字提取),手动输入不仅效率低还容易出错。OCR(Optical Character Recognition,光学字符识别)技术可以帮我们快速解决这个问题。本文将带大家从零开始,使用 Python 的 pytesseract 库开发一个简易但实用的 OCR 识别工具,支持图片文字提取、多语言识别(中英文),并提供基础的图片预处理功能以提升识别准确率。

                      一、工具核心技术栈

                      在开始前,我们先明确实现这个 OCR 工具需要用到的技术和库,确保大家理解每个组件的作用:

                      库/工具作用说明
                      pytesseractPython 封装的 Tesseract OCR 引擎接口,是实现文字识别的核心库
                      Tesseract OCR EngineGoogle 开源的 OCR 引擎(pytesseract 依赖此引擎才能运行)
                      OpenCV-Python用于图片预处理(如灰度化、二值化、降噪),提升 OCR 识别准确率
                      Pillow (PIL)轻量级图片处理库,用于读取图片文件、转换图片格式(与 OpenCV 互补使用)
                      argparsePython 内置库,用于解析命令行参数(支持通过命令行传入图片路径、语言等)

                      二、环境搭建(关键步骤)

                      pytesseract 不是纯 Python 库,它需要依赖底层的 Tesseract OCR 引擎,因此环境搭建分为 “引擎安装”“Python 库安装” 两步,缺一不可。

                      2.1 安装 Tesseract OCR 引擎

                      根据你的操作系统选择对应的安装方式,务必记住安装路径(后续配置需要用到):

                      (1)Windows 系统

                      下载安装包:访问 Tesseract 官方 github Releases,下载最新的 Windows 安装包(如 tesseract-ocr-w64-setup-v5.3.3.20231005.exe)。

                      使用Python的pytesseract库开发简易OCR图片文字识别工具

                      运行安装:

                      • 点击“Next”直到“Choose Components”页面,勾选“Additional language data (download)”(默认只安装英文,勾选后会下载中文等其他语言包)。
                      • 记住安装路径(如 C:\Program Files\Tesseract-OCR),后续需要配置环境变量或在代码中指定路径。

                      配置环境变量(可选但推荐):

                      • 右键“此电脑”→“属性”→“高级系统设置”→“环境变量”。
                      • 在“系统变量”的“Path”中添加 Tesseract 安装路径(如 C:\Program Files\Tesseract-OCR)。

                      验证:打开 cmd,输入 tesseract --version,若显示版本信息则安装成功。

                      使用Python的pytesseract库开发简易OCR图片文字识别工具

                      (2)macOS 系统

                      通过 Homebrew 安装(需先安装 Homebrew):

                      # 安装 Tesseract 引擎(默认包含英文)
                      brew install tesseract
                      # 安装中文语言包(如需识别中文)
                      brew install tesseract-lang
                      

                      (3)Linux 系统(以 Ubuntu 为例)

                      # 安装 Tesseract 引擎
                      sudo apt-get install tesseract-ocr
                      # 安装中文语言包
                      sudo apt-get install tesseract-ocr-chi-sim  # 简体中文
                      sudo apt-get install tesseract-ocr-chi-tra  # 繁体中文
                      

                      2.2 安装 Python 依赖库

                      打开终端/命令行,执行以下命令安装所需的 Python 库:

                      pip install pytesseract opencv-python pillow argparse
                      
                      • pytesseract:Python 操作 Tesseract 引擎的接口。
                      • opencv-python:图片预处理核心库。
                      • pillow:辅助读取和处理图片。
                      • argparse:解析命令行参数(内置库,安装其他库时会自动兼容)。

                      三、核心原理:为什么需要图片预处理?

                      Tesseract OCR 引擎对 清晰、无噪音、高对比度 的图片识别准确率最高。如果直接识别带有背景噪音、倾斜或彩色的图片,很容易出现识别错误。因此,我们需要在识别前对图片进行预处理,常见步骤包括:

                      1. 灰度化:将彩色 图片转为黑白灰度图,减少颜色通道干扰(OCR 对灰度图更敏感)。
                      2. 二值化:将灰度图转为纯黑白图(只有 0 和 255 两个像素值),进一步提升文字与背景的对比度。
                      3. 降噪:去除图片中的斑点、杂色等噪音(如编程客栈扫描件的黑点、截图的阴影)。
                      4. 倾斜矫正:若图片倾斜(如拍摄的文档),通过旋转矫正为水平方向(本文简化版暂不实现,后续可扩展)。

                      通过预处理,能显著提升 OCR 识别的准确率,这是从“能用”到“好用”的关键步骤。

                      四、完整代码实现与详细解释

                      我们将工具分为 3 个核心模块:图片预处理模块OCR 识别模块命令行交互模块,代码结构清晰,便于后续扩展。

                      4.1 完整代码

                      创建一个名为 simple_ocr_tool.py 的文件,复制以下代码:

                      # 导入所需库
                      import pytesseract
                      import cv2
                      from PIL import Image
                      import argparse
                      import os
                      
                      def image_preprocessing(image_path):
                          """
                          图片预处理函数:灰度化 → 二值化 → 降噪
                          :param image_path: 输入图片路径(相对/绝对路径)
                          :return: 预处理后的图片对象(OpenCV 格式,便于后续识别)
                          """
                          # 1. 读取图片(使用 OpenCV,默认读取为 BGR 格式)
                          img = cv2.imread(image_path)
                          if img is None:
                              raise FileNotFoundError(f"错误:未找到图片文件 {image_path},请检查路径是否正确。")
                          
                          # 2. 灰度化:将 BGR 格式转为灰度图(单通道)
                          gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
                          print("✅ 图片灰度化完成")
                          
                          # 3. 二值化:使用 Otsu 阈值法(自动计算最佳阈值,适合对比度明显的图片)
                          # cv2.THRESH_BINARY_INV:黑白反转(文字为白,背景为黑,提升识别率)
                          # cv2.THRESH_OTSU:自动阈值,无需手动调整
                          _, binary_img = cv2.threshold(
                              gray_img, 
                              0, 
                              255, 
                              cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU
                          )
                          print("✅ 图片二值化完成")
                          
                          # 4. 降噪:使用高斯模糊去除小噪音(核大小 (3,3) 为经验值,可根据图片调整)
                          denoised_img = cv2.GaussianBlur(binary_img, (3, 3), 0)
                          print("✅ 图片降噪完成")
                          
                          return denoised_img
                      
                      def ocr_recognize(preprocessed_img, lang='eng', tesseract_cmd=None):
                          """
                          OCR 识别函数:将预处理后的图片转为文字
                          :param preprocessed_img: 预处理后的图片(OpenCV 格式)
                          :param lang: 识别语言(默认 'eng' 英文,中文用 'chi_sim',中英文混合用 'chi_sim+eng')
                          :param tesseract_cmd: Tpythonesseract 引擎路径(Windows 若未配置环境变量需指定)
                          :return: 识别出的文字字符串
                          """
                          # 1. 配置 Tesseract 引擎路径(仅 Windows 非环境变量配置时需要)
                          if tesseract_cmd:
                              pytesseract.pytesseract.tesseract_cmd = tesseract_cmd
                          
                          # 2. 将 OpenCV 格式图片(numpy array)转为 PIL 格式(pytesseract 更兼容)
                          pil_img = Image.fromarray(preprocessed_img)
                          
                          # 3. 调用 Tesseract 进行识别
                          # config 参数:--psm 6 表示将图片视为单一文本块(适合大部分场景)
                          custom_config = r'--oem 3 --psm 6'  # oem 3 表示使用默认 OCR 引擎
                          text = pytesseract.image_to_string(pil_img, lang=lang, config=custom_config)
                          
                          # 4. 清理识别结果(去除空行、多余空格)
                          cleaned_text = '\n'.join([line.strip() for line in text.split('\n') if line.strip()])
                          
                          print(f"✅ OCR 识别完成(语言:{lang})")
                          return cleaned_text
                      
                      def save_result(text, output_path='ocr_result.txt'):
                          """
                          结果保存函数:将识别出的文字保存到本地文件
                          :param text: 识别出的文字
                          :param output_path: 输出文件路径(默认当前目录 ocr_result.txt)
                          """
                          with open(output_path, 'w', encoding='utf-8') as f:
                              f.write(text)
                          print(f"✅ 识别结果已保存到:{os.path.abspath(output_path)}")
                      
                      def main():
                          """
                          主函数:解析命令行参数 → 调用预处理 → 调用 OCR 识别 → 保存结果
                          """
                          # 1. 解析命令行参数(让用户通过命令行传入参数,更灵活)
                          parser = argparse.ArgumentParser(description="Python 简易 OCR 识别工具(基于 pytesseract)")
                          
                          # 必选参数:图片路径
                          parser.add_argument(
                              '--image', '-i', 
                              required=True, 
                              help='输入图片路径(如:./test.png 或 C:\\images\\doc.jpg)'
                          )
                          
                          # 可选参数:识别语言(默认英文,中文用 chi_sim,中英文混合用 chi_sim+eng)
                          parser.add_argument(
                              '--lang', '-l', 
                              default='eng', 
                              help='识别语言(默认 eng 英文,中文 chi_sim,中英文混合 chi_sim+eng)'
                          )
                          
                          # 可选参数:Tesseract 引擎路径(Windows 未配置环境变量时需指定)
                          parser.add_argument(
                              '--tesseract-cmd', '-t', 
                              default=None, 
                              help='Tesseract 引擎路径(如 Windows:C:\\Program Files\\Tesseract-OCR\\tesseract.exe)'
                          )
                          
                          # 可选参数:输出文件路径(默认当前目录 ocr_result.txt)
                          parser.add_argument(
                              '--output', '-o', 
                              default='ocr_result.txt', 
                              help='识别结果输出文件路径(默认 ocr_result.txt)'
                          )
                          
                          # 解析参数
                          args = parser.parse_args()
                          
                          try:
                              # 2. 图片预处理
                              print(f" 正在读取图片:{args.image}")
                              preprocessed_img = image_preprocessing(args.image)
                              
                              # 3. OCR 识别
                              print(" 正在进行 OCR 识别...")
                              recognized_text = ocr_recognize(
                                  preprocessed_img=preprocessed_img,
                                  lang=args.lang,
                                  tesseract_cmd=args.tesseract_cmd
                              )
                              
                              # 4. 打印识别结果
                              print("\n" + "="*50)
                              print(" OCR 识别结果:")
                              print("="*50)
                              print(recognized_text)
                              print("="*50 + "\n")
                              
                              # 5. 保存结果
                              save_result(recognized_text, args.output)
                              
                          except Exception as e:
                              # 异常处理(如文件不存在、语言包缺失等)
                              print(f"❌ 程序运行出错:{str(e)}")
                      
                      # 程序入口(只有直接运行脚本时才执行 main 函数)
                      if __name__ == "__main__":
                          main()
                      

                      4.2 运行效果

                      原图:

                      使用Python的pytesseract库开发简易OCR图片文字识别工具

                      解析后:

                      使用Python的pytesseract库开发简易OCR图片文字识别工具

                      4.3 代码逐模块详解

                      (1)图片预处理模块 image_preprocessing

                      该函数是提升识别准确率的核心,步骤拆解:

                      1. 读取图片:用 cv2.imread() 读取图片,返回 OpenCV 格式(numpy 数组,BGR 颜色通道);若图片路径错误,抛出 FileNotFoundError 并提示用户。
                      2. 灰度化:用 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 将彩色 图转为灰度图(单通道),减少颜色干扰。
                      3. 二值化:用 cv2.threshold() 实现自动阈值二值化:
                        • THRESH_BINARY_INV:黑白反转(文字变白、背景变黑),因为 Tesseract 对白色文字更敏感。
                        • THRESH_OTSU:自动计算最佳阈值(无需手动调整,适合不同亮度的图片)。
                      4. 降噪:用 cv2.GaussianBlur() 进行高斯模糊,核大小 (3,3) 是经验值(可根据图片噪音程度调整为 (5,5))。

                      (2)OCR 识别模块 ocr_recognize

                      该函数负责调用 Tesseract 引擎提取文字:

                      1. 配置引擎路径:Windows 若未配置环境变量,需通过 tesseract_cmd 参数指定 Tesseract 可执行文件路径(如 C:\Program Files\Tesseract-OCR\tesseract.exe)。
                      2. 格式转换pytesseract 对 PIL 格式图片兼容性更好,因此用 Image.fromarray() 将 OpenCV 格式(numpy 数组)转为 PIL 格式。
                      3. 核心识别pytesseract.image_to_string() 是核心接口,参数说明:
                        • lang:识别语言(eng 英文、chi_sim 简体中文、chi_sim+eng 中英文混合)。
                        • config:额外配置,--psm 6 表示将图片视为“单一文本块”(适合大部分场景,如截图、文档扫描件);--oem 3 表示使用默认 OCR 引擎。
                      4. 结果清理:用列表推导式去除识别结果中的空行和多余空格,让输出更整洁。

                      (3)结果保存模块 save_result

                      open() 函数以 UTF-8 编码(避免中文乱码)将识别结果写入文件,并用 os.path.abspath() 输出文件绝对路径,方便用户查找。

                      (4)主函数 main 与命令行参数

                      • 参数解析:用 argparse 定义 4 个参数(图片路径、语言、引擎路径、输出路径),其中 --image 是必选参数,其他为可选参数,降低用户使用门槛。
                      • 流程控制:按“读取图片 → 预处理 → 识别 → 打印结果 → 保存结果”的流程执行,并通过 try-except 捕获异常(如文件不存在、语言包缺失),提升程序稳定性。

                      五、工具使用教程(实战演示)

                      我们以 Windows 系统为例,通过 3 个场景演示工具的使用(其他系统操作类似,仅路径格式不同)。

                      5.1 准备测试图片

                      首先准备 2 张测试图片(建议放在与 simple_ocr_tool.py 同一目录下):

                      1. english_test.png:英文截图(如一段英文文档)。
                      2. chinese_test.png:中文截图(如一段中文新闻)。

                      5.2 场景 1:识别英文图片

                      打开终端/命令行,切换到脚本所在目录,执行以下命令:

                      # 识别英文图片,默认输出到 ocr_result.txt
                      python simple_ocr_tool.py -i english_test.png -l eng
                      

                      执行流程与输出:

                      1. 程序会依次打印“灰度化 → 二值化 → 降噪”完成提示。
                      2. 输出识别结果(在终端显示)。
                      3. 保存结果到当前目录的 ocr_result.txt,并显示文件绝对路径。

                      5.3 场景 2:识别中文图片

                      若需识别中文,需确保已安装中文语言包(安装 Tesseract 时勾选了语言包),执行命令:

                      # 识别中文图片,输出到 chinese_result.txt
                      python simple_ocr_tool.py -i chinese_test.png -l chi_sim -o chinese_result.txt
                      

                      注意:

                      • 语言参数 lang 必须为 chi_sim(简体中文)或 chi_tra(繁体中文),不可写错。
                      • 若提示“语言包缺失”,需重新安装 Tesseract 并勾选中文语言包(Windows)或执行 brew install tesseract-lang(macOS)。

                      5.4 场景 3:Windows 未配置环境变量时使用(补充完整)

                      若未配置 Tesseract 环境变量,程序无法自动找到引擎路径,需通过 --tesseract-cmd(或简写 -t)参数手动指定 Tesseract 可执行文件的完整路径,避免出现“tesseract is not installed or it’s not in your PATH”错误。

                      以识别中英文混合图片 mix_test.png 为例,完整命令如下(需替换为你的实际安装路径):

                      # Windows 系统命令(路径含空格需用英文引号包裹)
                      python simple_ocr_tool.py -i mix_test.png -l chi_sim+eng -t "C:\Program Files\Tesseract-OCR\tesseract.exe" -o mix_result.txt
                      
                      • 参数说明
                        • -t "C:\Program Files\Tesseract-OCR\tesseract.exe":明确指定 Tesseract 引擎的 tesseract.exe 文件路径,路径中的英文引号用于处理“Program Files”中的空格(若路径无空格可省略引号,如 D:\Tesseract-OCR\tesseract.exe)。
                        • -l chi_sim+eng:语言参数设为“简体中文+英文”,支持同时识别图片中的中英文内容(语言包需同时安装 chi_sim.traineddataeng.traineddata)。
                        • -o mix_result.txt:将识别结果保存到 mix_result.txt,避免覆盖默认的 ocr_result.txt

                      执行命令后,程序会按“图片读取→预处理→OCR识别→结果保存”流程运行,终端会打印各步骤进度(如“✅ 图片降噪完成”“✅ OCR 识别完成(语言:chi_sim+eng)”),最终在指定路径生成结果文件。

                      六、常见问题与优化方向

                      6.1 识别准确率低?试试这些优化

                      若识别结果存在较多错字、漏字,可从以下角度优化:

                      1. 增强图片预处理
                        • 若图片倾斜,添加“倾斜矫正”步骤(使用 cv2.minAreaRect() 计算倾斜角度,cv2.warpAffine() 实现旋转)。
                        • 若文字较细或有断裂,使用“形态学膨胀”(cv2.dilate())增强文字轮廓。
                      2. 调整 Tesseract 配置参数
                        • 修改 custom_config 中的 --psm 参数(页面分割模式),例如:
                          • --psm 11:适合文字分布不规则的图片(如截图中的散字)。
                          • --psm 3:默认模式,适合多列文本的文档(如PDF扫描件)。
                        • 添加降噪参数:--oem 3 --psm 6 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrhttp://www.devze.comstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ中文,限定android识别字符范围(减少无关字符干扰)。
                      3. 提升图片质量
                        • 确保图片分辨率不低于 300 DPI(扫描件优先选择“高清模式”)。
                        • 避免图片有模糊、阴影或反光(拍摄时尽量平整、光线均匀)。

                      6.2 扩展功能:支持批量识别图片

                      若需要批量处理多个图片,可在代码中添加“遍历文件夹”功能,修改 main 函数中的图片读取逻辑:

                      # 批量识别指定文件夹下的所有图片(示例:支持 png/jpg/jpeg 格式)
                      def BATch_ocr(folder_path, lang='chi_sim', output_dir='ocr_batch_results'):
                          # 创建输出文件夹
                          os.makedirs(output_dir, exist_ok=True)
                          # 遍历文件夹中的图片
                          for filename in ojavascripts.listdir(folder_path):
                              if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
                                  image_path = os.path.join(folder_path, filename)
                                  print(f"\n 正在处理图片:{filename}")
                                  try:
                                      # 预处理 + 识别
                                      preprocessed_img = image_preprocessing(image_path)
                                      recognized_text = ocr_recognize(preprocessed_img, lang=lang)
                                      # 保存结果(以图片名命名结果文件)
                                      output_path = os.path.join(output_dir, f"{os.path.splitext(filename)[0]}.txt")
                                      save_result(recognized_text, output_path)
                                  except Exception as e:
                                      print(f"❌ 处理 {filename} 失败:{str(e)}")
                      

                      使用时只需在 main 函数中调用 batch_ocr(r'C:\your_image_folder'),即可批量处理文件夹下所有图片并生成对应结果文件。

                      6.3 打包为可执行文件(方便非编程用户使用)

                      若需将工具分享给不懂Python的用户,可使用 pyinstaller 打包为 .exe 文件(Windows):

                      1. 安装打包工具:pip install pyinstaller
                      2. 执行打包命令(在脚本所在目录):
                      pyinstaller -F -i ocr_icon.ico simple_ocr_tool.py
                      
                      • -F:打包为单个可执行文件(方便携带)。
                      • -i ocr_icon.ico:可选参数,为.exe文件添加图标(需提前准备.ico格式图标文件)。
                      1. 打包完成后,可执行文件会生成在 dist 文件夹中,用户双击运行后,通过命令行参数即可使用(操作同之前的命令)。

                      七、总结

                      本文从零开始构建了一个基于 pytesseract 的简易 OCR 工具,核心亮点包括:

                      1. 实用性:支持中英文识别、结果保存,解决日常图片文字提取需求。
                      2. 可扩展性:代码模块化设计,可轻松添加批量识别、倾斜矫正、GUI界面(如用 tkinterPyQt)等功能。
                      3. 问题导向:针对环境配置、路径错误、语言包缺失等常见问题提供了详细解决方案,降低使用门槛。

                      通过本实战,不仅能掌握 OCR 工具的开发流程,还能理解图片预处理对识别准确率的影响,为后续更复杂的计算机视觉任务(如表格识别、验证码识别)打下基础。

                      以上就是使用Python的pytesseract库开发简易OCR图片文字识别工具的详细内容,更多关于Python OCR图片文字识别的资料请关注编程客栈(www.devze.com)其它相关文章!

                      0

                      精彩评论

                      暂无评论...
                      验证码 换一张
                      取 消

                      关注公众号