文章 #000

文章标题

文章简介:这是一个文章简介的占位文本,实际使用时将通过JavaScript动态替换。

在日常工作和开发中,我们经常遇到需要从截图中提取文字的场景——网页上的代码片段、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 就够了;如果是中文截图或复杂场景,PaddleOCR 是更好的选择。

二、方案一: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})")
注意:Tesseract 对低分辨率图片、手写体、复杂背景的文字识别效果较差。如果识别率不理想,务必先进行图像预处理(见下文第六章)。

三、方案二: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 工具需要高频截图(如游戏辅助、实时翻译),优先使用 mss,它的性能比 Pillow ImageGrab 高出一个数量级。

五、完整实战:截图 → 预处理 → 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 都是一个值得掌握的技能。

× 放大图片
广告位招租 - 联系站长