在日常工作和开发中,我们经常遇到需要从截图中提取文字的场景——网页上的代码片段、PDF 文档的表格数据、游戏界面中的提示信息,甚至是无法复制的对话框。手动打字不仅低效,还容易出错。借助 Python OCR(光学字符识别)技术,我们可以用几行代码实现截图自动识别文字,大幅提升工作效率。本文将从入门到实战,详细介绍 Python 截图识别文字的两大主流方案:Tesseract 和 PaddleOCR,并配合图像预处理技巧,帮助你构建自己的截图 OCR 工具。
一、Python OCR 技术概述
OCR(Optical Character Recognition,光学字符识别)是指将图像中的文字转换为可编辑的文本数据的技术。在 Python 生态中,有几个主流的 OCR 方案:
- Tesseract OCR:Google 维护的开源 OCR 引擎,支持 100+ 种语言,通过
pytesseract库在 Python 中调用。 - PaddleOCR:百度开源的深度学习 OCR 框架,对中文识别效果极佳,内置检测+识别 pipeline。
- EasyOCR:基于 PyTorch 的 OCR 库,支持多种语言,GPU 加速下速度快。
- Azure/Google Cloud OCR:云服务 API,精度高但需要网络和付费。
各方案的核心差异如下:
- Tesseract:纯 CPU 计算,对英文和印刷体效果优秀,中文需要额外配置语言包。
- PaddleOCR:中文识别精度最高,支持竖排文字和表格识别,GPU 加速后性能出色。
- EasyOCR:使用简单,自动下载模型,但速度较慢。
- 云端 OCR:效果最好但依赖网络,适合对精度有极高要求的场景。
二、方案一:Tesseract + pytesseract
Tesseract 是历史最悠久、社区最活跃的开源 OCR 引擎。在 Python 中使用需要两步:安装 Tesseract 本体,然后安装 pytesseract 封装库。
Windows 安装
# 1. 下载安装 Tesseract OCR
# 访问 https://github.com/UB-Mannheim/tesseract/wiki
# 下载 tesseract-ocr-w64-setup 安装包
# 安装时勾选中文语言包(Chinese Simplified)
# 2. 安装 Python 依赖
pip install pytesseract Pillow
基础文字识别
import pytesseract
from PIL import Image
# 配置 Tesseract 路径(Windows 需要)
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
# 打开图片并识别
image = Image.open('screenshot.png')
text = pytesseract.image_to_string(image, lang='eng')
print(text)
中文识别配置
import pytesseract
from PIL import Image
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
# 识别中文(需要安装 chi_sim 语言包)
image = Image.open('chinese_screenshot.png')
text = pytesseract.image_to_string(image, lang='chi_sim')
print(text)
# 同时识别中英文混合
text = pytesseract.image_to_string(image, lang='chi_sim+eng')
print(text)
获取识别置信度和位置信息
# 获取每个识别结果的详细信息
data = pytesseract.image_to_data(image, lang='eng', output_type=pytesseract.Output.DICT)
for i, text in enumerate(data['text']):
if int(data['conf'][i]) > 60: # 过滤低置信度结果
x, y, w, h = data['left'][i], data['top'][i], data['width'][i], data['height'][i]
print(f"文字: {text}, 置信度: {data['conf'][i]}, 位置: ({x}, {y}, {w}, {h})")
三、方案二:PaddleOCR(百度开源深度学习OCR)
PaddleOCR 是百度基于 PaddlePaddle 深度学习框架开发的 OCR 工具,在中文场景下的表现远超 Tesseract。它内置了文字检测和识别两个模型,无需手动调参即可获得出色的效果。
安装
# 安装 PaddleOCR(会自动安装 paddlepaddle)
pip install paddleocr
# 如果有 CUDA GPU,安装 GPU 版本加速
# pip install paddlepaddle-gpu paddleocr
基础使用
from paddleocr import PaddleOCR
# 初始化(首次运行会自动下载模型)
ocr = PaddleOCR(use_angle_cls=True, lang='ch') # use_angle_cls 启用文字方向分类
# 识别图片
result = ocr.ocr('screenshot.png', cls=True)
# 打印结果
for line in result[0]:
box = line[0] # 文字框坐标 [[x1,y1],[x2,y2],[x3,y3],[x4,y4]]
text = line[1][0] # 识别文字
confidence = line[1][1] # 置信度
print(f"文字: {text}, 置信度: {confidence:.2f}")
print(f"位置: {box}")
高级配置:调整参数优化识别效果
from paddleocr import PaddleOCR
# 自定义参数
ocr = PaddleOCR(
use_angle_cls=True, # 文字方向分类
lang='ch', # 语言:ch(中文), en(英文), chinese_cht(繁体)
use_gpu=False, # 是否使用 GPU
det_db_thresh=0.3, # 检测阈值,越低越敏感
det_db_box_thresh=0.5, # 检测框阈值
rec_batch_num=6, # 识别时的批大小
max_text_length=25, # 最大文字长度
cls_thresh=0.9, # 方向分类阈值
use_space_char=True # 是否识别空格
)
result = ocr.ocr('screenshot.png', cls=True)
for line in result[0]:
text = line[1][0]
confidence = line[1][1]
print(f"{text} ({confidence:.2%})")
use_angle_cls=True 可以让 PaddleOCR 自动检测文字方向并旋转矫正,大幅提升竖排文字的识别准确率。
四、截图工具选型
要实现"截图 → OCR 识别"的完整 pipeline,首先需要能够通过 Python 捕获屏幕截图。以下是三种常用方案:
方案对比
- Pillow ImageGrab:无需额外安装(Pillow 自带),适合简单截图场景。
- pyautogui:功能全面,支持区域截图、图像定位、鼠标控制,但速度较慢。
- mss:高性能截图,支持多显示器,速度最快(比 pyautogui 快 3-5 倍)。
全屏截图
# 方法1:Pillow ImageGrab
from PIL import ImageGrab
screenshot = ImageGrab.grab()
screenshot.save('fullscreen.png')
# 方法2:mss(最快)
import mss
with mss.mss() as sct:
sct.shot(output='fullscreen.png')
# 方法3:pyautogui
import pyautogui
screenshot = pyautogui.screenshot()
screenshot.save('fullscreen.png')
区域截图
# 截取指定区域
from PIL import ImageGrab
# 截取左上角(100,100)到右下角(800,600)的区域
region = ImageGrab.grab(bbox=(100, 100, 800, 600))
region.save('region_screenshot.png')
# 使用 mss 截取区域
import mss
with mss.mss() as sct:
monitor = {"top": 100, "left": 100, "width": 700, "height": 500}
region = sct.grab(monitor)
mss.tools.to_png(region.rgb, region.size, output='region_screenshot.png')
五、完整实战:截图 → 预处理 → OCR 识别 → 结果输出
将截图和 OCR 组合起来,构建一个完整的截图文字识别 pipeline:
import pytesseract
from PIL import Image, ImageGrab, ImageFilter
import json
# 配置 Tesseract
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
def preprocess_image(image):
"""图像预处理:灰度化 + 放大 + 增强对比度"""
# 转换为灰度图
gray = image.convert('L')
# 放大 2 倍(OCR 对大尺寸图片识别更好)
w, h = gray.size
gray = gray.resize((w * 2, h * 2), Image.LANCZOS)
# 锐化增强文字边缘
gray = gray.filter(ImageFilter.SHARPEN)
return gray
def screenshot_ocr(lang='chi_sim+eng', region=None):
"""截图并识别文字"""
# 步骤1:截图
if region:
screenshot = ImageGrab.grab(bbox=region)
else:
screenshot = ImageGrab.grab()
# 步骤2:预处理
processed = preprocess_image(screenshot)
# 步骤3:OCR 识别
text = pytesseract.image_to_string(processed, lang=lang)
data = pytesseract.image_to_data(processed, lang=lang, output_type=pytesseract.Output.DICT)
# 步骤4:格式化输出
results = []
for i, word in enumerate(data['text']):
if word.strip():
results.append({
'text': word,
'confidence': int(data['conf'][i]),
'position': {
'x': data['left'][i],
'y': data['top'][i],
'width': data['width'][i],
'height': data['height'][i]
}
})
return {
'full_text': text.strip(),
'details': results
}
# 使用示例
result = screenshot_ocr(lang='chi_sim+eng')
print(result['full_text'])
print(json.dumps(result['details'], ensure_ascii=False, indent=2))
preprocess_image 中的放大倍数调整为 2-3 倍,是提升 Tesseract 小字体识别率最简单有效的方法。
六、图像预处理技巧
图像预处理是提升 OCR 识别率的关键步骤。原始截图通常包含噪声、不均匀光照、低分辨率和复杂背景,直接识别效果往往不理想。以下是最常用的几种预处理方法:
1. 灰度化
from PIL import Image
image = Image.open('screenshot.png')
gray = image.convert('L') # 转为灰度图
gray.save('gray.png')
2. 二值化(黑白化)
from PIL import Image
gray = Image.open('gray.png').convert('L')
threshold = 128 # 阈值:0-255
binary = gray.point(lambda x: 255 if x > threshold else 0, '1')
binary.save('binary.png')
3. 自适应二值化(OpenCV)
import cv2
import numpy as np
image = cv2.imread('screenshot.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 自适应阈值(适合光照不均匀的图片)
binary = cv2.adaptiveThreshold(
gray, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2
)
cv2.imwrite('adaptive_binary.png', binary)
4. 去噪
import cv2
image = cv2.imread('binary.png')
# 中值滤波(去除椒盐噪声)
denoised = cv2.medianBlur(image, 3)
# 高斯模糊 + 二值化(去除背景纹理)
blur = cv2.GaussianBlur(image, (5, 5), 0)
_, denoised = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imwrite('denoised.png', denoised)
5. 倾斜校正
import cv2
import numpy as np
def deskew(image):
"""自动检测并校正图片倾斜"""
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 边缘检测
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
# 霍夫变换检测直线
lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)
if lines is None:
return image
# 计算平均倾斜角
angles = []
for line in lines:
rho, theta = line[0]
angle = np.degrees(theta) - 90
angles.append(angle)
median_angle = np.median(angles)
# 旋转校正
h, w = image.shape[:2]
center = (w // 2, h // 2)
matrix = cv2.getRotationMatrix2D(center, median_angle, 1.0)
corrected = cv2.warpAffine(image, matrix, (w, h),
borderMode=cv2.BORDER_CONSTANT,
borderValue=(255, 255, 255))
return corrected
image = cv2.imread('skewed_screenshot.png')
corrected = deskew(image)
cv2.imwrite('corrected.png', corrected)
七、性能优化与批量处理
如果需要处理大量截图,以下是几个关键的优化策略:
批量处理多张截图
import os
import pytesseract
from PIL import Image
def batch_ocr(input_dir, output_file, lang='chi_sim+eng'):
"""批量处理目录下的所有截图"""
results = {}
for filename in os.listdir(input_dir):
if filename.endswith(('.png', '.jpg', '.jpeg')):
filepath = os.path.join(input_dir, filename)
image = Image.open(filepath)
text = pytesseract.image_to_string(image, lang=lang)
results[filename] = text.strip()
# 输出到文件
with open(output_file, 'w', encoding='utf-8') as f:
for name, text in results.items():
f.write(f"=== {name} ===\n{text}\n\n")
return results
# 使用
batch_ocr('./screenshots/', './ocr_results.txt')
使用 PaddleOCR 批量识别(带 GPU 加速)
from paddleocr import PaddleOCR
import os
ocr = PaddleOCR(use_angle_cls=True, lang='ch', use_gpu=True)
def batch_paddle_ocr(input_dir):
"""使用 PaddleOCR 批量识别截图"""
results = {}
for filename in os.listdir(input_dir):
if filename.endswith(('.png', '.jpg', '.jpeg')):
filepath = os.path.join(input_dir, filename)
result = ocr.ocr(filepath, cls=True)
# 提取所有文字
texts = []
for line in result[0]:
texts.append(line[1][0])
results[filename] = '\n'.join(texts)
return results
concurrent.futures.ThreadPoolExecutor 多线程并行处理,可以充分利用多核 CPU,速度提升 3-5 倍。
八、常见问题排查
1. Tesseract 找不到或报错
最常见的错误是 TesseractNotFoundError,解决方法:
- 确认已安装 Tesseract OCR
- 检查
pytesseract.tesseract_cmd路径是否正确 - 将 Tesseract 安装路径添加到系统环境变量 PATH
- Linux:
sudo apt install tesseract-ocr tesseract-ocr-chi-sim
2. 中文识别乱码
# 确认已安装中文语言包
import pytesseract
print(pytesseract.get_languages()) # 应该包含 'chi_sim'
# 正确指定语言参数
text = pytesseract.image_to_string(image, lang='chi_sim') # 不是 'ch' 或 'cn'
3. PaddleOCR 首次运行一直在下载模型
PaddleOCR 首次使用时会从网络下载检测和识别模型(约 100MB)。如果下载慢,可以手动下载模型并放到 ~/.paddleocr/ 目录下。
4. 识别准确率低
- 检查图片分辨率是否过低(建议 300 DPI 以上)
- 尝试图像预处理(灰度化、二值化、去噪)
- 放大图片 2-3 倍
- 切换 OCR 引擎(中文字幕用 PaddleOCR)
- 确保图片中的文字不是艺术字体
九、方案对比总结
以下是从多个维度对比 Tesseract 和 PaddleOCR:
- 中文准确率:PaddleOCR(90%+)远优于 Tesseract(60-75%),尤其是在竖排文字和复杂排版场景下。
- 英文准确率:Tesseract(95%+)与 PaddleOCR 基本持平,前者社区积累更深厚。
- 安装难度:PaddleOCR 仅需 pip install,Tesseract 需要安装系统级软件。
- 运行速度(CPU):Tesseract 更快,PaddleOCR 深度学习推理较慢。
- 运行速度(GPU):PaddleOCR 开启 GPU 加速后远超 Tesseract。
- 特殊场景:PaddleOCR 支持表格识别、印章识别,Tesseract 不支持这些高级功能。
选择建议:
- 处理英文文档、印刷体 → 用 Tesseract,轻量快速。
- 处理中文截图、UI 界面 → 用 PaddleOCR,精度碾压。
- 需要表格/票据/发票识别 → 用 PaddleOCR 的 PP-Structure。
- 嵌入式或低资源环境 → Tesseract 更友好,内存占用低。
掌握了以上两种方案和预处理技巧,你就可以轻松应对绝大多数的截图文字识别需求了。无论是做自动化工具、数据分析还是辅助阅读,Python OCR 都是一个值得掌握的技能。