python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python OCR图片文字识别

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

作者:xcLeigh

在日常工作和学习中,我们经常会遇到需要将图片中的文字提取出来的场景(如扫描件、截图文字提取),手动输入不仅效率低还容易出错,OCR技术可以帮我们快速解决这个问题,本文将带大家从零开始,使用Python的pytesseract库开发一个简易但实用的OCR识别工具

前言

本文详细介绍了如何用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)。

运行安装:

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

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

(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

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

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: Tesseract 引擎路径(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 运行效果

原图:

解析后:

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 与命令行参数

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

我们以 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

注意:

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

执行命令后,程序会按“图片读取→预处理→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=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ中文,限定识别字符范围(减少无关字符干扰)。
  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 os.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
  1. 打包完成后,可执行文件会生成在 dist 文件夹中,用户双击运行后,通过命令行参数即可使用(操作同之前的命令)。

七、总结

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

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

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

以上就是使用Python的pytesseract库开发简易OCR图片文字识别工具的详细内容,更多关于Python OCR图片文字识别的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文