page contents

用Python实现一个OCR文字识别工具,调用Tesseract引擎,轻松提取图片中的文字!

当时我就想,肯定有现成的OCR工具能解决这个问题,结果一搜发现Python生态里的OCR方案还挺丰富的,最终选择了Tesseract这个老牌引擎,真香。

attachments-2025-07-Hh9QbFQQ68672d9e87c3b.jpg记得那次项目里要处理几千张扫描件,客户发过来的都是图片格式的合同文档 手工录入简直要命。

当时我就想,肯定有现成的OCR工具能解决这个问题,结果一搜发现Python生态里的OCR方案还挺丰富的,最终选择了Tesseract这个老牌引擎,真香。

01

Tesseract本身是谷歌开源的OCR引擎 支持100多种语言识别 在Python里我们主要通过pytesseract这个包来调用它

安装过程稍微有点坑 需要先装Tesseract引擎本体 然后再装Python包装器

# 先安装Tesseract引擎

# Ubuntu: sudo apt install tesseract-ocr

# macOS: brew install tesseract  

# Windows: 下载exe安装包

# 再装Python包

pip install pytesseract pillow我当时在Windows上折腾了半天 主要是路径配置的问题 后来发现直接在代码里指定tesseract.exe的路径最省事

02

最基础的使用其实很简单 读图片 调用识别 输出文字 三步搞定

import pytesseract

from PIL import Image

# Windows用户可能需要指定路径

# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

# 打开图片并识别

image = Image.open('test.jpg')

text = pytesseract.image_to_string(image, lang='chi_sim')

print(text)这里有个细节 lang参数很重要 默认是英文识别 如果要识别中文记得设置成'chi_sim' 繁体中文是'chi_tra'

不过直接这样用效果通常不太理想。

03

图片预处理是OCR成功的关键,我在项目中总结了几个实用的技巧

import cv2

import numpy as np

from PIL import Image

defpreprocess_image(image_path):

    # 读取图片

    img = cv2.imread(image_path)    

    # 转灰度图

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    

    # 二值化处理 黑白分明效果更好

    _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)    

    # 去噪声 形态学操作很有效

    kernel = np.ones((2,2), np.uint8)

    cleaned = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)    

    return cleaned

# 预处理后再识别

processed_img = preprocess_image('noisy_text.jpg')

pil_img = Image.fromarray(processed_img)

text = pytesseract.image_to_string(pil_img, lang='chi_sim')

二值化这步特别关键 可以大幅提升识别准确率 尤其是那些扫描质量不太好的文档

04

实际项目中我还会用到一些高级功能 比如获取文字的位置信息和置信度

# 获取详细识别信息

data = pytesseract.image_to_data(image, output_type=pytesseract.Output.DICT)

# 遍历识别结果

for i in range(len(data['text'])):

    confidence = data['conf'][i]

    text = data['text'][i].strip() 

    # 过滤置信度低的结果

    if confidence > 60 and text:

        x, y, w, h = data['left'][i], data['top'][i], data['width'][i], data['height'][i]

        print(f"文字: {text}, 置信度: {confidence}, 位置: ({x}, {y}, {w}, {h})")

置信度过滤很有用 能剔除那些识别不准确的文字 我一般设置阈值为60 根据实际情况调整

还有个小技巧 如果识别出来的文字格式乱七八糟 可以试试调整PSM参数

# PSM参数控制页面分割模式

custom_config = r'--oem 3 --psm 6'

text = pytesseract.image_to_string(image, config=custom_config)

PSM 6适合单一文本块 PSM 8适合单个词语 根据图片内容选择合适的模式效果会更好

05

我还封装了一个批量处理的工具类 处理大量文档时特别有用

import os

from pathlib import Path


classOCRProcessor:

    def__init__(self, lang='chi_sim'):

        self.lang = lang

    

    defprocess_folder(self, folder_path, output_file='result.txt'):

        results = []

        folder = Path(folder_path)

        

        for img_file in folder.glob('*.jpg'):

            try:

                image = Image.open(img_file)

                text = pytesseract.image_to_string(image, lang=self.lang)

                results.append(f"文件: {img_file.name}\n内容: {text}\n{'-'*50}\n")

                print(f"已处理: {img_file.name}")

            except Exception as e:

                print(f"处理失败: {img_file.name}, 错误: {e}")

        

        # 保存结果

        withopen(output_file, 'w', encoding='utf-8') as f:

            f.writelines(results)


# 使用示例

processor = OCRProcessor()

processor.process_folder('./images/', 'extracted_text.txt')这个工具类帮我处理过几千张图片 省了不少时间呢

总的来说 Python的OCR方案已经相当成熟了 Tesseract虽然不是最先进的 但胜在免费开源 对于大部分场景完全够用 如果要求更高的准确率 可以考虑付费的云端API 比如百度OCR或腾讯云OCR

关键还是要根据具体场景选择合适的预处理策略和参数配置 多试试不同的组合 总能找到最佳效果的。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2025-07-04 09:25
  • 阅读 ( 43 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小柒
小柒

2172 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2172 文章
  3. Pack 1335 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章