100天精通Python(进阶篇)——第44天:基于Tesseract-OCR实现OCR图片文字识别实战
引言
在Python进阶学习的第44天,我们将深入探索OCR(光学字符识别)技术,特别是基于Tesseract-OCR库的实现。OCR技术能够将图片中的文字转换为可编辑的文本格式,广泛应用于文档数字化、自动化数据处理、车牌识别等多个领域。本文将通过详细的步骤和代码示例,指导读者如何使用Tesseract-OCR在Python环境中实现高效的图片文字识别。
Tesseract-OCR简介
Tesseract是一个由Google维护的开源OCR引擎,支持多种语言和字体,具有高度的灵活性和可扩展性。它最初由HP实验室开发,后被Google接管并持续优化。Tesseract能够识别图片中的文字,并将其转换为文本文件,支持包括中文在内的多种语言。
环境配置
在开始之前,我们需要确保Python环境已安装,并配置好Tesseract-OCR及其Python封装库pytesseract。
安装Tesseract-OCR
- Windows用户:可以从UB Mannheim下载并安装Tesseract-OCR的Windows版本。
- Mac用户:使用Homebrew安装:
brew install tesseract。 - Linux用户:根据发行版使用包管理器安装,如Ubuntu:
sudo apt-get install tesseract-ocr。
安装pytesseract
使用pip安装pytesseract库:
pip install pytesseract
基础识别
安装完成后,我们可以开始使用Tesseract-OCR进行基础图片文字识别。
示例代码
import pytesseractfrom PIL import Image# 设置Tesseract路径(如果不在系统PATH中)# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # Windows示例# 加载图片image = Image.open('example.png')# 使用Tesseract进行OCR识别text = pytesseract.image_to_string(image, lang='chi_sim') # 指定中文简体print(text)
代码解释
- 导入库:
pytesseract用于调用Tesseract-OCR,PIL.Image用于加载图片。 - 设置Tesseract路径(可选):如果Tesseract不在系统PATH中,需要指定其可执行文件的路径。
- 加载图片:使用
Image.open()方法加载图片文件。 - OCR识别:
pytesseract.image_to_string()方法执行OCR识别,lang参数指定语言(如'chi_sim'表示中文简体)。 - 输出结果:打印识别出的文本。
预处理优化
为了提高OCR识别的准确率,通常需要对图片进行预处理,如二值化、去噪、调整对比度等。
使用OpenCV进行预处理
import cv2import numpy as npimport pytesseractfrom PIL import Imagedef preprocess_image(image_path):# 读取图片img = cv2.imread(image_path)# 转换为灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化处理thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]# 可选:去噪# denoised = cv2.fastNlMeansDenoising(thresh, None, 10, 7, 21)# 保存预处理后的图片(可选)# cv2.imwrite('preprocessed.png', thresh)return thresh# 预处理图片preprocessed_img = preprocess_image('example.png')# 转换为PIL Image格式pil_img = Image.fromarray(preprocessed_img)# OCR识别text = pytesseract.image_to_string(pil_img, lang='chi_sim')print(text)
代码解释
- 读取图片:使用
cv2.imread()方法读取图片。 - 转换为灰度图:
cv2.cvtColor()方法将图片转换为灰度图,减少颜色干扰。 - 二值化处理:
cv2.threshold()方法进行二值化,提高文字与背景的对比度。 - 去噪(可选):使用
cv2.fastNlMeansDenoising()方法去除图片噪声。 - 保存预处理后的图片(可选):将预处理后的图片保存到文件。
- 转换为PIL Image格式:使用
Image.fromarray()方法将OpenCV格式的图片转换为PIL格式。 - OCR识别:与之前相同,使用
pytesseract.image_to_string()方法进行识别。
实战案例:识别发票文字
假设我们需要从一张发票图片中提取关键信息,如发票号码、日期、金额等。
代码实现
import cv2import numpy as npimport pytesseractfrom PIL import Imageimport redef extract_invoice_info(image_path):# 预处理图片img = cv2.imread(image_path)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]# 转换为PIL Image格式pil_img = Image.fromarray(thresh)# OCR识别text = pytesseract.image_to_string(pil_img, lang='chi_sim')# 提取关键信息invoice_no_match = re.search(r'发票号码[::]?\s*(\d+)', text)date_match = re.search(r'日期[::]?\s*(\d{4}-\d{2}-\d{2})', text)amount_match = re.search(r'金额[::]?\s*([\d.]+)', text)invoice_no = invoice_no_match.group(1) if invoice_no_match else '未找到'date = date_match.group(1) if date_match else '未找到'amount = amount_match.group(1) if amount_match else '未找到'return {'发票号码': invoice_no,'日期': date,'金额': amount}# 示例使用info = extract_invoice_info('invoice.png')for key, value in info.items():print(f'{key}: {value}')
代码解释
- 预处理图片:与之前相同,进行灰度转换和二值化处理。
- OCR识别:使用
pytesseract.image_to_string()方法识别图片中的文字。 - 提取关键信息:使用正则表达式从识别出的文本中提取发票号码、日期和金额。
- 返回结果:将提取到的信息以字典形式返回。
总结
在第44天的Python进阶学习中,我们深入探索了基于Tesseract-OCR的图片文字识别技术。通过详细的步骤和代码示例,我们学习了如何配置环境、进行基础识别、优化预处理步骤,并通过实战案例展示了如何从发票图片中提取关键信息。希望本文能够帮助读者高效掌握OCR技术,并在实际项目中应用。