Python + Tesseract OCR 图像文字识别系统
项目介绍
这是一个基于 Python 和 Tesseract OCR 的图片文字识别系统,支持中英文识别,具有图像预处理优化功能,可以提高识别准确率。
环境要求
- Python 3.6+
- Windows 10/11 操作系统
- Tesseract OCR 4.0+
安装步骤
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. 添加环境变量:
- 打开系统环境变量设置
- 在 Path 变量中添加:
C:\Program Files\Tesseract-OCR\
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. 支持的语言选项
chi_sim: 简体中文chi_sim+eng: 简体中文+英文(默认)eng: 仅英文chi_tra: 繁体中文
常见问题解决
1. Tesseract 未找到错误
错误信息:TesseractNotFound Error
解决方案:
- 检查 Tesseract 是否正确安装
- 验证环境变量是否正确设置
- 检查代码中的 Tesseract 路径是否正确:
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
2. 中文识别效果不佳
解决方案:
- 确保已安装中文语言包
- 检查图片质量,可能需要预处理
- 尝试调整代码中的图像预处理参数
3. 图片无法读取
错误信息:无法读取图片
解决方案:
- 确认图片路径是否正确
- 检查图片格式是否受支持(支持:jpg, png, bmp等)
- 确认图片文件是否完整
性能优化建议
1. 图像预处理
- 当前代码已包含多种预处理方法:
- 灰度转换
- 对比度增强
- 降噪处理
- 图像锐化
- 二值化处理
2. 识别效果优化
- 建议图片分辨率在 300-600 DPI 之间
- 保持图片清晰度,避免模糊
- 确保文字与背景对比度充足
代码说明
主要功能模块:
1. preprocess_image(): 图像预处理
2. recognize_text(): 文字识别
3. main(): 主程序入口
关键参数说明:
clipLimit: CLAHE对比度增强参数scale_percent: 图像缩放比例border_size: 添加白边大小
更新日志
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()