Python实现截图与OCR识别:pytesseract基础代码示例

不晚
不晚
发布时间:2026-10-30 | 11人浏览过
原创

介绍如何使用Python的Pillow库进行屏幕截图,并结合pytesseract与Tesseract-OCR引擎实现文字识别,包含环境配置、全屏与局部截图识别代码示例及常见问题排查。

在自动化办公、网页数据采集和桌面辅助测试中,很多数据以图形弹窗、canvas 绘图或防复制画面的形式展现,直接通过DOM或网络接口往往无法获取。此时最直接且通用的方法就是截取屏幕图像,再利用光学字符识别(OCR)技术提取画面中的文本内容。本文介绍如何使用 Python 标准图像处理库 Pillow 进行全屏与局部区域截图,并通过 pytesseract 绑定本地 Tesseract-OCR 引擎完成字符识别,给出易于上手的完整基础代码示例与避坑要点。

一、系统架构与组件依赖关系

很多初学者在使用 pytesseract 时最常遇到的误区是认为只需通过 pip install pytesseract 就能完成文字识别。实际上,pytesseract 只是一个 Python 封装接口(Wrapper),它本身并不包含文字识别算法。实际的文字检测与识别工作必须由底层的原生 Tesseract-OCR 引擎及对应的语言数据包完成。

Python实现截图与OCR识别:pytesseract基础代码示例
图1:Python 屏幕截图与 Tesseract-OCR 整体协作结构

从上图可知,整个技术链路分为三部分:截屏端由 Pillow 负责抓取像素点生成图像对象;中间层 pytesseract 负责组织命令行参数并通过系统管道与外部进程交互;最终由 Tesseract-OCR 二进制执行文件根据指定语言包完成图像文字的检测与转译。

二、环境准备与配置流程

在编写代码前,必须确保操作系统中已具备 Tesseract 原生程序与 Python 库支持。整个配置流程可以分为四个连续环节。

Python实现截图与OCR识别:pytesseract基础代码示例
图2:从系统安装到代码运行的操作步骤

1. 系统引擎安装

  • Windows 系统: 从官方推荐的构建仓库(如 UB-Mannheim/tesseract)下载安装程序。安装时在“Additional language data (download)”中勾选“Chinese (Simplified)”。安装默认路径一般为 C:\Program Files\Tesseract-OCR\tesseract.exe。
  • macOS 系统: 使用终端执行 brew install tesseract tesseract-lang。
  • Linux (Ubuntu/Debian) 系统: 执行 sudo apt-get install tesseract-ocr tesseract-ocr-chi-sim。

2. Python 依赖库安装

打开终端或命令行工具,输入以下命令安装图像处理及 OCR 封装库:

pip install pillow pytesseract

三、全屏截图与基础 OCR 识别代码

环境安装完成后,最简单的应用是抓取当前显示器的完整屏幕画面,然后将其直接送入 pytesseract.image_to_string() 进行识别。以下是完整的最小可执行代码:

import pytesseract
from PIL import ImageGrab
import os
import sys

# 1. 配置 Tesseract 原生可执行程序的绝对路径
# 如果已经将 Tesseract 所在目录加入系统环境变量 PATH,可省略此行;
# 若未加入环境变量(尤其是 Windows 用户),必须显式指定 tesseract.exe 完整路径:
if sys.platform.startswith('win'):
    pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

def capture_and_recognize_fullscreen():
    # 2. 截取整个屏幕
    print("正在捕获全屏画面...")
    screenshot = ImageGrab.grab()
    
    # 可选:保存截图以供人工核验
    screenshot.save("debug_fullscreen.png")
    
    # 3. 调用 OCR 识别接口
    # 参数 lang='chi_sim+eng' 表示同时使用简体中文和英文语言模型
    print("正在进行文字识别...")
    try:
        text = pytesseract.image_to_string(screenshot, lang='chi_sim+eng')
        return text
    except pytesseract.TesseractNotFoundError:
        print("错误:未找到 Tesseract 执行文件,请检查 tesseract_cmd 路径配置。")
        return ""

if __name__ == "__main__":
    result = capture_and_recognize_fullscreen()
    print("------ 识别结果输出 ------")
    print(result.strip())
    print("------------------------")

运行该程序后,脚本会自动调用 Pillow 抓取系统屏幕的帧缓冲,并将其转为内部位图数据。随后 pytesseract 会在后台拉起 tesseract 进程,读取图像流并基于 chi_sim+eng 字典匹配文字,最后通过标准输出流将解析出的文本返回给 Python 变量。

四、局部区域截取与图像预处理优化

在实际场景中,全屏截图识别往往效率较低,且桌面无关窗口的干扰容易引发识别噪点。更稳健的做法是指定屏幕矩形区域(Bounding Box,即 bbox),并且在传入 OCR 之前对图像做简单的灰度化(Grayscale)或二值化(Thresholding)处理,以提高对比度。

Python实现截图与OCR识别:pytesseract基础代码示例
图3:局部区域截图与预处理增强流水线

在 Pillow 中,ImageGrab.grab(bbox=(x1, y1, x2, y2)) 接受一个由四个整数组成的元组作为截取矩形范围,坐标顺序依次为:左边界像素、上边界像素、右边界像素、下边界像素。

import pytesseract
from PIL import ImageGrab, Image
import sys

# 适配 Windows 默认路径
if sys.platform.startswith('win'):
    pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

def preprocess_image(image: Image.Image) -> Image.Image:
    """
    对截取的图像进行灰度与简单二值化处理
    """
    # 转换为灰度图像 (模式 'L')
    gray = image.convert('L')
    
    # 设定二值化阈值(通常在 120 - 180 之间,根据目标背景色调整)
    threshold = 150
    # 对低于阈值的像素设为 0 (黑色),高于设为 255 (白色)
    binary = gray.point(lambda p: 255 if p > threshold else 0)
    
    return binary

def recognize_region(x1: int, y1: int, x2: int, y2: int) -> str:
    """
    截取指定坐标区域并执行 OCR
    """
    bbox = (x1, y1, x2, y2)
    print(f"截取区域坐标: {bbox}")
    
    # 局部截屏
    raw_img = ImageGrab.grab(bbox=bbox)
    
    # 执行预处理
    processed_img = preprocess_image(raw_img)
    
    # 保存以便观察预处理效果
    processed_img.save("debug_region_processed.png")
    
    # 配置 Tesseract 参数:
    # --psm 6 表示假设图像为统一的单个文本块 (Page Segmentation Mode)
    custom_config = r'--oem 3 --psm 6'
    
    text = pytesseract.image_to_string(
        processed_img,
        lang='chi_sim+eng',
        config=custom_config
    )
    return text

if __name__ == "__main__":
    # 示例坐标:截取屏幕左上角宽 500、高 300 的区域
    captured_text = recognize_region(100, 100, 600, 400)
    print("局部区域识别结果:")
    print(captured_text.strip())

坐标注意事项:在多显示器或 Windows 系统启用了“屏幕缩放与布局(如 125%、150%)”的环境下,ImageGrab 获取的物理像素坐标可能与操作系统报告的逻辑坐标存在缩放偏移。如果截取位置发生偏差,建议在操作系统显示设置中将缩放临时设置为 100%,或者在 Python 中先通过 ctypes.windll.user32.SetProcessDPIAware() 声明 DPI 感知。

五、常见问题排查与技术决策

在日常部署与测试 pytesseract 代码时,大多数报错集中在路径寻址、语言包缺失以及分割模式不匹配上。下表汇总了最常见的排查方向:

异常现象 / 报错信息 产生根源 标准解决方法
pytesseract.TesseractNotFoundError Python 未能在系统环境变量中找到可执行文件 tesseract。 显式给 pytesseract.pytesseract.tesseract_cmd 赋予 tesseract.exe 的绝对路径。
TesseractError: Error opening data file... chi_sim.traineddata 未下载或未放置简体中文语言包至 tessdata 目录下。 下载对应版本的 chi_sim.traineddata,放入 Tesseract 安装根目录下的 tessdata/ 文件夹中。
识别结果为空或出现乱码字符 文字区域背景太复杂、对比度不足,或字体过小/模糊。 先使用 gray.point() 进行二值化增强黑白反差;适当放大图像(resize)至适合阅读的尺寸。
单行文字识别遗漏或换行错乱 默认 PSM 模式假设图像包含多列复杂排版。 在 config 中增加 --psm 7(视为单行文本)或 --psm 6(视为均匀单文本块)。
Python实现截图与OCR识别:pytesseract基础代码示例
图4:常见运行异常排查与优化判定树

六、技术边界与总结

结合 Pillow 与 pytesseract 是在 Python 中实现桌面文字提取最轻量、依赖最干净的基础方案。然而在实际工程选型时,也需明确其技术边界:

  • 优势场景: 规则界面的菜单栏、桌面客户端弹窗、后台系统表格、具有高对比度标准印刷字体的全屏或局部区域自动化读取。
  • 局限场景: 具有复杂噪点线条的防机器验证码、倾斜严重的手写笔记、艺术字或彩色复杂背景图标。这类场景下传统基于特征分割的 Tesseract 引擎识别率较低,通常需要引入基于深度学习的轻量 OCR 框架(如 PaddleOCR、RapidOCR 等)作为补充方案。

对于大部分日常自动化脚本,合理使用 ImageGrab.grab(bbox) 锁定目标区域,并配以简单的灰度与二值化转换,足以让 pytesseract 高效稳定地完成文字抓取任务。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表