讲师中心 微信公众号
AI工具推荐 视频效率加速

image-ocr

Polar Sponsor
爱发电 赞助
.NET 9.0

使用 Python 和 Tesseract OCR 从图像中提取文本内容

图像 OCR 技能

功能概述

图像 OCR 技能是一项面向实际任务的技能,主要用于此技能可以使用 CCR 的 Pytersecract Python 库从图像文件( JPG, PNG 等) 中提取准确的文本;它适合扫描文档。

核心要点

  • 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
  • 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
  • 该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。

使用与执行

从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;

结果检查与注意事项

若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。

图像 OCR 技能

用途

该技能通过 pytesseract Python 库调用 Tesseract OCR 引擎,实现对图像文件(JPG、PNG 等)中文字的高精度提取。适用于扫描文档、截图、含文字的照片、收据、表单以及其他包含文本的视觉内容。

适用场景

  • 从扫描文档或照片中提取文字
  • 从截图或图像抓取结果中读取文字
  • 批量处理包含文本信息的图像文件
  • 将视觉文档转换为机器可读的文本
  • 从图像中的表单、收据或表格中提取结构化数据

所需库

需安装以下 Python 库:

import pytesseract
from PIL import Image
import json
import os

输入要求

  • 文件格式:JPG、JPEG、PNG、WEBP
  • 图像质量:印刷体文字建议最低 300 DPI;文字需清晰、易辨识
  • 文件大小:单张图像不超过 5MB(必要时请缩放)
  • 文字语言:若非英文,请显式指定以提升识别准确率

输出 Schema

所有提取结果必须以符合以下 Schema 的合法 JSON 格式返回:

{
  "success": true,
  "filename": "example.jpg",
  "extracted_text": "从图像中完整提取的原始文本...",
  "confidence": "high|medium|low",
  "metadata": {
    "language_detected": "en",
    "text_regions": 3,
    "has_tables": false,
    "has_handwriting": false
  },
  "warnings": [
    "右下角文字部分被遮挡",
    "页眉区域检测到对比度偏低"
  ]
}

字段说明

  • success:布尔值,表示文字提取是否成功完成
  • filename:原始图像文件名
  • extracted_text:按阅读顺序(自上而下、自左向右)组织的完整文本内容
  • confidence:基于图像质量与文字清晰度得出的整体 OCR 置信度等级
  • metadata.language_detected:ISO 639-1 语言代码
  • metadata.text_regions:识别出的独立文本块数量
  • metadata.has_tables:是否检测到表格类数据结构
  • metadata.has_handwriting:是否检测到手写文字
  • warnings:记录的质量问题或潜在错误列表

代码示例

基础 OCR 提取

import pytesseract
from PIL import Image

def extract_text_from_image(image_path):
    """使用 Tesseract OCR 从单张图像中提取文字。"""
    img = Image.open(image_path)
    text = pytesseract.image_to_string(img)
    return text.strip()

带置信度数据的 OCR

import pytesseract
from PIL import Image

def extract_with_confidence(image_path):
    """提取文字并返回逐词置信度分数。"""
    img = Image.open(image_path)

    # 获取包含置信度的详细 OCR 数据
    data = pytesseract.image_to_data(img, output_type=pytesseract.Output.DICT)

    words = []
    confidences = []

    for i, word in enumerate(data['text']):
        if word.strip():  # 跳过空字符串
            words.append(word)
            confidences.append(data['conf'][i])

    # 计算平均置信度
    avg_confidence = sum(c for c in confidences if c > 0) / len([c for c in confidences if c > 0]) if confidences else 0

    return {
        'text': ' '.join(words),
        'average_confidence': avg_confidence,
        'word_count': len(words)
    }

完整 OCR 并输出 JSON

import pytesseract
from PIL import Image
import json
import os

def ocr_to_json(image_path):
    """执行 OCR 并以 JSON 格式返回结果。"""
    filename = os.path.basename(image_path)
    warnings = []

    try:
        img = Image.open(image_path)

        # 获取详细 OCR 数据
        data = pytesseract.image_to_data(img, output_type=pytesseract.Output.DICT)

        # 提取文本并保留结构
        text = pytesseract.image_to_string(img)

        # 计算置信度
        confidences = [c for c in data['conf'] if c > 0]
        avg_conf = sum(confidences) / len(confidences) if confidences else 0

        # 判定置信度等级
        if avg_conf >= 80:
            confidence = "high"
        elif avg_conf >= 50:
            confidence = "medium"
        else:
            confidence = "low"
            warnings.append(f"OCR 置信度偏低:{avg_conf:.1f}%")

        # 统计文本区域(块)数量
        block_nums = set(data['block_num'])
        text_regions = len([b for b in block_nums if b > 0])

        result = {
            "success": True,
            "filename": filename,
            "extracted_text": text.strip(),
            "confidence": confidence,
            "metadata": {
                "language_detected": "en",
                "text_regions": text_regions,
                "has_tables": False,
                "has_handwriting": False
            },
            "warnings": warnings
        }

    except Exception as e:
        result = {
            "success": False,
            "filename": filename,
            "extracted_text": "",
            "confidence": "low",
            "metadata": {
                "language_detected": "unknown",
                "text_regions": 0,
                "has_tables": False,
                "has_handwriting": False
            },
            "warnings": [f"OCR 执行失败:{str(e)}"]
        }

    return result

# 使用示例
result = ocr_to_json("document.jpg")
print(json.dumps(result, indent=2))

批量处理多张图像

import pytesseract
from PIL import Image
import json
import os
from pathlib import Path

def process_image_directory(directory_path, output_file):
    """处理目录下所有图像并保存结果。"""
    image_extensions = {'.jpg', '.jpeg', '.png', '.webp'}
    results = []

    for file_path in sorted(Path(directory_path).iterdir()):
        if file_path.suffix.lower() in image_extensions:
            result = ocr_to_json(str(file_path))
            results.append(result)
            print(f"已处理:{file_path.name}")

    # 保存结果
    with open(output_file, 'w') as f:
        json.dump(results, f, indent=2)

    return results

Tesseract 配置选项

语言选择

# 指定语言(默认为英文)
text = pytesseract.image_to_string(img, lang='eng')

# 多语言支持
text = pytesseract.image_to_string(img, lang='eng+fra+deu')

页面分割模式(PSM)

使用 --psm 参数控制 Tesseract 对图像的分割方式:

# PSM 3:全自动页面分割(默认)
text = pytesseract.image_to_string(img, config='--psm 3')

# PSM 4:假设为单列变长文本
text = pytesseract.image_to_string(img, config='--psm 4')

# PSM 6:假设为统一文本块
text = pytesseract.image_to_string(img, config='--psm 6')

# PSM 11:稀疏文本 — 尽可能多地查找文本
text = pytesseract.image_to_string(img, config='--psm 11')

常用 PSM 值说明:

  • 0:仅执行方向与文字类型检测(OSD)
  • 3:全自动页面分割(默认)
  • 4:单列变长文本
  • 6:统一文本块
  • 7:单行文本
  • 11:稀疏文本
  • 13:原始行(Raw line)

图像预处理

为提升 OCR 准确率,建议对图像进行预处理:

from PIL import Image, ImageFilter, ImageOps

def preprocess_image(image_path):
    """对图像进行预处理以提升 OCR 效果。"""
    img = Image.open(image_path)

    # 转为灰度图
    img = img.convert('L')

    # 提升对比度
    img = ImageOps.autocontrast(img)

    # 应用轻微锐化
    img = img.filter(ImageFilter.SHARPEN)

    return img

# 使用预处理后的图像执行 OCR
img = preprocess_image("document.jpg")
text = pytesseract.image_to_string(img)

高级预处理策略

对于低对比度、褪色文字或深色背景等困难图像,可尝试多种预处理方法:

  1. 灰度 + 自动对比度增强 —— 适用于大多数图像的基础增强
  2. 反色处理 —— 对深色背景+浅色文字使用 ImageOps.invert()
  3. 图像缩放 —— 对小尺寸图像进行放大(如 2 倍),以改善字符识别效果
  4. 阈值二值化 —— 使用 img.point(lambda p: 255 if p > threshold else 0) 进行二值化,尝试不同阈值(如 100、128)
  5. 锐化处理 —— 应用 ImageFilter.SHARPEN 以增强边缘清晰度

多轮 OCR 策略

对于复杂图像,单次 OCR 可能遗漏部分文字。建议采用多轮 OCR,结合不同配置提升覆盖率:

  1. 尝试多种 PSM 模式 —— 不同页面分割模式适用于不同版式(例如:--psm 6 适合文本块,--psm 4 适合多列,--psm 11 适合稀疏文本)

  2. 尝试多种预处理变体 —— 对同一图像的不同预处理版本分别运行 OCR

  3. 合并结果 —— 汇总各轮 OCR 输出,最大化文本覆盖范围

def multi_pass_ocr(image_path):
    """使用多种策略执行 OCR 并合并结果。"""
    img = Image.open(image_path)
    gray = ImageOps.grayscale(img)

    # 生成预处理变体
    variants = [
        ImageOps.autocontrast(gray),
        ImageOps.invert(ImageOps.autocontrast(gray)),
        gray.filter(ImageFilter.SHARPEN),
    ]

    # 待尝试的 PSM 模式
    psm_modes = ['--psm 6', '--psm 4', '--psm 11']

    all_text = []
    for variant in variants:
        for psm in psm_modes:
            try:
                text = pytesseract.image_to_string(variant, config=psm)
                if text.strip():
                    all_text.append(text)
            except Exception:
                pass

    # 合并所有提取到的文本
    return "\n".join(all_text)

该方法可显著提升收据、褪色文档及质量参差不齐图像的文字提取效果。

错误处理

常见问题与解决方案

问题:未找到 Tesseract

# 验证 Tesseract 是否已安装
try:
    pytesseract.get_tesseract_version()
except pytesseract.TesseractNotFoundError:
    print("Tesseract 未安装或未加入系统 PATH")

问题:OCR 质量差

  • 对图像进行预处理(灰度化、对比度增强、锐化)
  • 根据文档类型选用合适的 PSM 模式
  • 确保图像分辨率足够(≥300 DPI)

问题:输出为空或乱码

  • 确认图像中确实含有可识别文字
  • 尝试不同 PSM 模式
  • 验证图像文件是否损坏

质量自检清单

返回结果前,请确保完成以下校验:

  • 输出为合法 JSON(可用 json.loads() 验证)
  • 所有必需字段均已存在(success、filename、extracted_text、confidence、metadata)
  • 文本保持逻辑阅读顺序(自上而下、自左向右)
  • 置信度等级真实反映 OCR 实际质量
  • warnings 数组已包含所有检测到的问题
  • JSON 中特殊字符已正确转义

限制条件

  • Tesseract 对印刷体文字效果最佳;手写体识别能力有限
  • 装饰性字体、艺术字或高度风格化的文本会降低识别准确率
  • 数学公式与特殊符号可能无法准确提取
  • 已被涂黑(redacted)或添加水印的文字不可恢复
  • 严重图像退化(模糊、噪声、低分辨率)将显著降低识别精度
  • 复杂多栏排版可能需要定制 PSM 配置

版本历史

  • 1.0.0(2026-01-13):初始发布,基于 Tesseract/pytesseract OCR
目录

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

0

2026.11.05

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

0

2026.11.05

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

0

2026.11.04

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

0

2026.11.04

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

0

2026.11.04

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

0

2026.11.04

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

0

2026.11.04

XORM框架零基础入门教程
XORM框架零基础入门教程

本专题梳理XORM框架的入门路径,从框架定位、依赖安装、连接数据库到跑通第一个增删改查示例,讲清Engine初始化、日志开启与项目目录规划,并对比GORM等同类ORM的差异,帮助Go开发者建立整体认知。

0

2026.11.04

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn