Python如何做OCR识别?提取图片文字

Python如何做OCR识别?提取图片文字

1.tesseract ocr在python ocr中的优势包括开源免费、多语言支持和识别速度快;2.局限性是对图片质量要求高,难以处理模糊、倾斜、复杂背景或手写体文字;3.提升准确率的核心方法是图像预处理(如灰度化、二值化、去噪、调整dpi);4.使用tesseract配置参数(如--psm、--oem)优化识别模式;5.处理多语言时需安装对应语言包并通过lang参数指定;6.面对复杂场景可采用深度学习ocr库(如easyocr、paddleocr)或自定义训练tesseract模型。

在Python中进行OCR(光学字符识别)来提取图片文字,最常用且高效的方案是结合Tesseract OCR引擎与Python的pytesseract库。这套组合不仅开源免费,而且在处理多种语言和不同字体时表现相当不错,对于大多数日常需求来说,它是个非常靠谱的选择。

解决方案

要实现Python的OCR识别,你需要做两件事:安装Tesseract OCR引擎本身,然后安装Python的封装库pytesseract。

首先,安装Tesseract OCR。这不是一个Python库,而是一个独立的命令行工具。Windows用户可以下载安装包(例如从UB Mannheim维护的GitHub页面),Mac用户可以用Homebrew安装:brew install tesseract。Linux用户则通过包管理器安装,比如Debian/Ubuntu是sudo apt install tesseract-ocr。安装完成后,确保Tesseract的可执行文件路径被添加到了系统的环境变量中,或者你清楚它的具体路径,因为pytesseract需要调用它。

接着,安装pytesseract库:pip install pytesseract pillow。Pillow是处理图像的库,pytesseract依赖它来打开和处理图片。

下面是一个基本的代码示例,展示如何用pytesseract提取图片文字:

from PIL import Image
import pytesseract
import os

# 假设Tesseract安装在C:Program FilesTesseract-OCR
# 如果Tesseract不在系统PATH中,需要手动指定路径
# pytesseract.pytesseract.tesseract_cmd = r'C:Program FilesTesseract-OCRtesseract.exe'

def extract_text_from_image(image_path):
    """
    从指定图片路径中提取文字。
    """
    try:
        # 打开图片
        img = Image.open(image_path)
        # 使用Tesseract进行OCR识别
        text = pytesseract.image_to_string(img)
        return text
    except pytesseract.TesseractNotFoundError:
        print("错误:Tesseract OCR引擎未找到。请确保已安装Tesseract并将其路径添加到系统环境变量,或在代码中指定pytesseract.pytesseract.tesseract_cmd。")
        return None
    except FileNotFoundError:
        print(f"错误:图片文件未找到,请检查路径:{image_path}")
        return None
    except Exception as e:
        print(f"处理图片时发生未知错误:{e}")
        return None

# 示例用法
# 假设你的图片文件名为 'example.png' 放在当前目录下
# 如果图片不存在,请替换为你的实际图片路径
image_file = 'example.png' # 请替换为你的图片路径,例如 'path/to/your/image.jpg'

# 创建一个假的图片文件用于测试,如果你的目录下没有图片
# from PIL import ImageDraw, ImageFont
# img_test = Image.new('RGB', (300, 100), color = (255, 255, 255))
# d = ImageDraw.Draw(img_test)
# try:
#     # 尝试加载一个默认字体,如果找不到,就用Pillow的默认字体
#     fnt = ImageFont.truetype("arial.ttf", 20)
# except IOError:
#     fnt = ImageFont.load_default()
# d.text((10,10), "Hello, OCR!", fill=(0,0,0), font=fnt)
# img_test.save(image_file)
# print(f"已创建测试图片:{image_file}")


extracted_text = extract_text_from_image(image_file)
if extracted_text:
    print("n提取到的文字内容:")
    print(extracted_text)

这段代码的核心就是pytesseract.image_to_string(img),它会调用Tesseract引擎来处理图片并返回识别到的文本。

Tesseract OCR在图片文字识别中的优势与局限性是什么?

说实话,Tesseract之所以能成为Python OCR的“明星”,主要得益于它的几个明显优势。首先,它是开源的,这意味着你可以免费使用它,并且有一个庞大的社区在维护和改进。这对于个人开发者或者预算有限的项目来说,简直是福音。其次,它支持多语言识别,你可以下载各种语言包,让它识别中文、英文、日文等等。这在处理国际化文档时非常方便。再者,Tesseract的识别速度相对较快,对于批量处理图片,效率上还是挺有保障的。

然而,Tesseract也并非万能。在我实际使用过程中,发现它对图片质量的要求比较高。如果图片模糊、文字倾斜严重、背景复杂或者字体过于艺术化,它的识别准确率就会大打折扣。比如,手写体文字对Tesseract来说就是个巨大的挑战,它往往识别得一塌糊涂。另外,对于复杂的文档布局,比如表格或者多栏文本,Tesseract默认的识别模式可能无法很好地保持原有的结构,它可能会把所有文字一股脑儿地输出,导致你需要额外的工作来解析布局。所以,指望它能完美处理所有情况,那是不现实的。

如何提升Python OCR的识别准确率?

提升OCR识别准确率,很多时候不在于换一个更“高级”的库,而在于你给OCR引擎“喂”的图片质量。这就像你给厨师再好的食材,如果食材本身就不好,做出来的菜也有限。

核心思路是图片预处理。这是个技术活,但效果往往立竿见影。

  1. 灰度化与二值化: 彩色图片通常包含大量无关信息,将其转换为灰度图可以减少处理量。而二值化(将图片只保留黑白两种颜色)能最大化文字与背景的对比度,让Tesseract更容易区分。OpenCV是Python中处理图像的利器,可以轻松实现这些操作。

    import cv2
    import numpy as np
    from PIL import Image
    
    def preprocess_image(image_path):
        img = cv2.imread(image_path)
        if img is None:
            print(f"无法读取图片:{image_path}")
            return None
    
        # 转换为灰度图
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
        # 二值化处理(Otsu's Binarization)
        # 这种方法会自动寻找最佳阈值,适合背景不均匀的图片
        _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    
        # 转换为PIL Image格式,以便pytesseract处理
        return Image.fromarray(binary)
    
    # 使用预处理后的图片进行OCR
    # preprocessed_img = preprocess_image('example.png')
    # if preprocessed_img:
    #     text = pytesseract.image_to_string(preprocessed_img)
    #     print("预处理后提取到的文字:n", text)
  2. 去噪: 图片中的噪点(比如扫描件上的斑点)会干扰识别。可以使用中值滤波、高斯滤波等方法来平滑图像,去除这些不必要的干扰。

  3. 倾斜校正(Deskewing): 如果图片中的文字是倾斜的,Tesseract识别起来会很吃力。通过图像处理算法检测文本的倾斜角度并进行旋转校正,能显著提升准确率。这通常需要一些更复杂的图像分析。

  4. 调整DPI: Tesseract对图像的DPI(每英寸点数)有一定要求,通常建议在300 DPI左右。如果图片分辨率过低,可以尝试放大。

  5. Tesseract配置参数: pytesseract.image_to_string()函数接受一个config参数,你可以通过它来调整Tesseract的识别模式。比如,--psm参数可以指定页面分割模式(Page Segmentation Mode),这对于处理不同布局的图片非常关键。例如,--psm 6适用于统一的文本块,而--psm 3是默认的,会尝试自动识别页面布局。如果你知道图片只有一行文字,可以使用--psm 7。

    # 示例:指定PSM模式
    # text_single_line = pytesseract.image_to_string(img, config='--psm 7')
    # print("单行模式提取到的文字:n", text_single_line)

    你还可以通过--oem参数选择OCR引擎模式,比如--oem 1使用LSTM神经网络模型,通常更准确但速度稍慢。

记住,预处理不是一劳永逸的,它需要根据你的图片特点进行调整和优化。有时候,简单的二值化就够了,有时候则需要组合多种技术。

处理复杂或多语言图片文字识别的策略是什么?

遇到复杂或多语言的图片文字识别,确实需要一些额外的策略。单靠Tesseract的默认设置可能就不够了。

对于多语言识别,Tesseract是支持的,但你需要确保安装了对应的语言包。例如,要识别中文和英文混合的文本,你需要安装tesseract-ocr-chi-sim(简体中文)和tesseract-ocr-eng(英文)语言包。在代码中,通过lang参数指定:

# 识别中英文混合文本
# text_chinese_english = pytesseract.image_to_string(img, lang='chi_sim+eng')
# print("中英文混合识别结果:n", text_chinese_english)

这里用+连接不同的语言代码,告诉Tesseract同时使用这些语言模型进行识别。

而对于复杂图片,比如表格、手写体、高度艺术化的字体,或者背景特别复杂的图片,Tesseract的传统方法可能就显得力不从心了。

  1. 表格识别: Tesseract本身对表格结构识别能力有限。通常的做法是,先用OpenCV等库进行表格线检测,将表格区域分割出来,然后对每个单元格单独进行OCR。更高级的方案会结合深度学习模型(如TableNet)来检测表格和单元格,再进行文字识别。

  2. 手写体和艺术字体: Tesseract对这类文字的识别效果普遍不佳。这时候,你可能需要考虑深度学习OCR模型。近年来,基于卷积神经网络(CNN)和循环神经网络(RNN)的OCR模型(如CRNN、Attention-based模型)在手写体和复杂字体识别上取得了显著进展。像EasyOCR、PaddleOCR这些库,它们底层就是基于深度学习模型,对于这类挑战性任务,表现往往远超传统Tesseract。虽然它们安装和部署可能稍微复杂一些,但效果是值得的。

    # 示例:使用EasyOCR (需要先安装 easyocr)
    # import easyocr
    # reader = easyocr.Reader(['ch_sim', 'en']) # 指定需要识别的语言
    # results = reader.readtext('example.png')
    # for (bbox, text, prob) in results:
    #     print(f"文本: {text}, 置信度: {prob:.2f}")

    这种方式通常能提供更鲁棒的识别能力,并且能够更好地处理各种扭曲、旋转的文本。

  3. 自定义训练Tesseract: 如果你面对的是特定字体或特定格式的文档,并且Tesseract默认模型识别效果不理想,可以考虑自定义训练Tesseract模型。这涉及到准备大量的标注数据(图片和对应的文字),然后用Tesseract的训练工具链进行模型训练。这无疑是个耗时耗力的过程,但对于非常垂直和重复的OCR任务,它能带来最高的准确率提升。

总的来说,处理复杂OCR任务,往往是从“预处理+Tesseract配置”到“切换到更强大的深度学习OCR模型”再到“自定义模型训练”的一个渐进过程。选择哪种策略,取决于你的具体需求、数据特点以及可投入的资源。

以上就是Python如何做OCR识别?提取图片文字的详细内容,更多请关注昆居客【www.kunjuke.com】。

相关推荐:

389 元 3D 人脸识别 + 智能猫眼:德施曼龙霆 A3F 智能门锁破冰新低

德施曼旗下:龙霆 A3F 智能门锁日常 799 元,支持 3D 人脸识别 + 智能猫眼。今日实付 512 元,下单后联系客服立打 8 折返现 + 晒单返 20 元,折合仅需 389 元。先领 9 折券:点此领券京东龙霆 A3F 智能门锁支持智能猫眼券后 512 元领 100 元券目前宝贝主图有“限量抢 8 折”提示,可放心下单。如无此提示,活动大概率已结束,请咨询客服。质保三年,今日下单送一年,一...

迷你世界开发者怎么提取收益

1、首先打开迷你盒子,再点击开发者中心;2、就会弹出下面这个图,再点击我的钱包;3、最后就可以看到收益,点击提现就可以提取收益了。要绑定银行卡才能提现,迷你豆不需要,只不过必须要买300m豆才能提现。 详细答案: 1、首先打开迷你盒子,再点击开发者中心。 2、就会弹出下面这个图,再点击我的钱包。 3、最后就可以看到收益,点击提现就可以提取收益了。要绑定银行卡才能提现,迷你豆不需要,只不过必须要买3...

迷你世界保险箱怎么提取

在游戏主界面点击开始游戏,然后选择需要提档的那个游戏进度(非创造模式);进入游戏后按B键打开背包,然后点击右下角“仓库”;在仓库中找到保险箱并双击,然后点击“提取”,这样保险箱就会被提到存档使用了。 详细答案: 在游戏主界面点击开始游戏,然后选择需要提档的那个游戏进度(非创造模式)。 进入游戏后按B键打开背包,然后点击右下角“仓库”。 在仓库中找到保险箱并双击,然后点击“提取”,这样保险箱就会被提...

宙斯浏览器如何提取当前网页内所有的图片素材?

最有效方法是用开发者工具控制台执行脚本提取全部图片URL:涵盖img标签、CSS背景图、Base64内联图和懒加载图片,去重后直接复制下载,无需插件且兼容禁用扩展的办公环境。 你需要从宙斯浏览器打开的网页中一次性拿到所有图片,包括普通标签、CSS背景图、Base64内联图和懒加载图片,而不是一张张右键另存为。 用开发者工具控制台执行脚本提取全部图片URL 这是最轻量、无需安装扩展、且能覆盖绝大多数...

66铃声怎么一键识别本地视频里的BGM

真正“一键识别本地视频BGM”的闭环方案是曲多多App离线识别:支持iOS/Android端直读相册视频,音频指纹本地生成并加密上传比对,无需上传原始文件,开启“忽略人声”后8–12秒出结果,含试听、下载及波形定位跳转功能。 你想从手机里存着的本地视频中快速揪出那段让人上头的BGM,但又不想上传到网站、不希望音频流经第三方服务器,更不想手动剪开视频再拖进识别工具——这时候你需要的是真正“一键识别本...

Blurrr如何做变速?Blurrr曲线变速与卡点视频制作方法

必须掌握时间重映射与曲线变速配合逻辑:先自动踩点生成黄点并确认对齐鼓点;再用时间重映射分割节拍段,确保入点精准;接着对第二段设曲线变速(1×→2.8×→0.15×),勾选智能补帧;最后批量复制粘贴并替换素材,逐段微调入点对齐。 想用Blurrr做出音乐踩点精准、节奏起伏明显的变速卡点视频,必须掌握时间重映射与曲线变速的配合逻辑——不是单纯拉快拉慢,而是让画面速度变化严格贴合节拍点位,否则卡点会飘、...

Excel怎么快速提取括号内文字 提取单元格部分内容公式

Excel中提取括号内容有五种方法:1.用MID+SEARCH提取首个括号内文字;2.用FILTERXML(Win10+)提取全部括号内容并垂直/横向输出;3.用TEXTBEFORE+TEXTAFTER(365/2021)简化公式;4.用Power Query处理大批量混乱数据;5.所有方法均需注意括号匹配与版本兼容性。 当你在Excel里处理客户备注、产品规格或日志信息时,常会遇到“型号A(黑色...

PDF24提取页面功能在哪 PDF24文件处理操作方法【技巧】

PDF24的“提取页面”功能可免费快速提取指定页码生成新PDF,支持桌面版与网页版,提供缩略图预览和逗号分隔的页码输入(如3,7,12),操作简单无需注册。 想从几十页的PDF里快速挑出第3、第7、第12页单独保存成新文件,又不想装一堆软件或注册账号,PDF24的“提取页面”功能就是最直接的解法——它不锁免费页数、支持逗号分隔的不连续页码输入、桌面版和网页版都自带缩略图预览,操作完立刻生成独立PD...