Python + Tesseract OCR 图像文字识别系统

项目介绍

这是一个基于 Python 和 Tesseract OCR 的图片文字识别系统,支持中英文识别,具有图像预处理优化功能,可以提高识别准确率。

环境要求

安装步骤

1. 安装 Python

1. 访问 Python官网 下载最新版本的 Python

2. 运行安装程序,务必勾选 "Add Python to PATH"

3. 完成安装后,打开命令提示符(CMD)验证安装:

   python --version

2. 安装 Tesseract OCR

1. 访问 Tesseract下载页面

2. 下载对应系统版本的安装包(推荐 64位版本)

3. 运行安装程序,建议安装到默认路径:C:\Program Files\Tesseract-OCR\

4. 添加环境变量:

3. 安装中文语言包

1. 访问 Tesseract语言包

2. 下载 chi_sim.traineddata(简体中文)和 chi_tra.traineddata(繁体中文)

3. 将下载的文件复制到 Tesseract 安装目录的 tessdata 文件夹:

   C:\Program Files\Tesseract-OCR\tessdata\

4. 安装 Python 依赖包

打开命令提示符,运行以下命令:

pip install pillow pytesseract opencv-python numpy

使用方法

1. 基本使用

python image_text_recognition.py path/to/your/image.jpg

2. 指定识别语言

python image_text_recognition.py path/to/your/image.jpg --lang chi_sim

3. 支持的语言选项

常见问题解决

1. Tesseract 未找到错误

错误信息:TesseractNotFound Error

解决方案:

2. 中文识别效果不佳

解决方案:

3. 图片无法读取

错误信息:无法读取图片

解决方案:

性能优化建议

1. 图像预处理

2. 识别效果优化

代码说明

主要功能模块:

1. preprocess_image(): 图像预处理

2. recognize_text(): 文字识别

3. main(): 主程序入口

关键参数说明:

更新日志

v1.0.0

贡献指南

欢迎提交 Issue 和 Pull Request 来帮助改进项目。提交时请:

1. 清晰描述问题或改进建议

2. 提供复现步骤(如果是 bug)

3. 附上相关的代码片段或截图

源代码

image_text_recognition.py

import os

import argparse

from PIL import Image

import pytesseract

import cv2

import numpy as np



# 设置Tesseract OCR的路径

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'



def preprocess_image(img):

    """图像预处理函数"""

    # 转换为灰度图

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    

    # 计算平均亮度

    mean_brightness = np.mean(gray)

    

    # 如果是深色背景,反转图像

    if mean_brightness < 127:

        gray = cv2.bitwise_not(gray)

    

    # 增强对比度

    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))

    gray = clahe.apply(gray)

    

    # 降噪

    denoised = cv2.fastNlMeansDenoising(gray)

    

    # 锐化

    kernel = np.array([[-1,-1,-1],

                      [-1, 9,-1],

                      [-1,-1,-1]])

    sharpened = cv2.filter2D(denoised, -1, kernel)

    

    # 二值化

    _, binary = cv2.threshold(sharpened, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

    

    return binary



def recognize_text(image_path, lang='chi_sim+eng'):

    """

    从图片中识别文本

    

    参数:

        image_path: 图片路径

        lang: 识别语言,默认为中文简体+英文

    

    返回:

        识别的文本

    """

    try:

        # 使用OpenCV读取图片

        img = cv2.imread(image_path)

        if img is None:

            return "错误: 无法读取图片"

        

        # 放大图片

        scale_percent = 300  # 放大到300%

        width = int(img.shape[1] * scale_percent / 100)

        height = int(img.shape[0] * scale_percent / 100)

        img = cv2.resize(img, (width, height), interpolation=cv2.INTER_CUBIC)

        

        # 图像预处理

        binary = preprocess_image(img)

        

        # 添加白边

        border_size = 30

        binary = cv2.copyMakeBorder(

            binary,

            border_size, border_size, border_size, border_size,

            cv2.BORDER_CONSTANT,

            value=[255, 255, 255]

        )

        

        # 使用pytesseract识别文本

        custom_config = r'--oem 3 --psm 6 -c preserve_interword_spaces=1 --dpi 300'

        text = pytesseract.image_to_string(binary, lang=lang, config=custom_config)

        

        # 保存处理后的图片用于调试

        cv2.imwrite('processed_image.png', binary)

        

        return text.strip()

    except Exception as e:

        return f"识别出错: {str(e)}"



def main():

    parser = argparse.ArgumentParser(description='从图片中识别文本')

    parser.add_argument('image_path', help='图片路径')

    parser.add_argument('--lang', default='chi_sim+eng', help='识别语言 (默认: chi_sim+eng)')

    args = parser.parse_args()

    

    if not os.path.exists(args.image_path):

        print(f"错误: 图片路径 '{args.image_path}' 不存在")

        return

    

    print("正在识别图片中的文本...")

    text = recognize_text(args.image_path, args.lang)

    

    print("\n识别结果:")

    print("-" * 50)

    print(text)

    print("-" * 50)



if __name__ == "__main__":

    main()