📜  收据 ocr - Python (1)

📅  最后修改于: 2023-12-03 15:10:13.396000             🧑  作者: Mango

收据 OCR - Python

在数字化历程中,将大量原本需要手动操作的工作交给计算机完成是提高效率的一种方式。而将纸质收据数字化也是这种效率提高的方式之一。在数字化收据的过程中,OCR 技术可以帮助我们把纸质收据转化为电子文本,并方便进行存储,查询和处理。

Python 是一种强大的编程语言,它具有极其完整的第三方库,在 OCR 领域也有不少优秀的库。下面介绍一下其中的两个库:tesseract 和 Pytesseract。

Tesseract

Tesseract 是 Google 开发的开源 OCR 引擎,由 C++ 实现。Tesseract 虽然是 C++ 实现的,但同时也有 Python 接口,可以很方便地在 Python 中调用 Tesseract。

安装 Tesseract 非常简单,可以使用 pip 或者 brew 进行安装。

# 使用 pip 安装 tesseract
pip install tesseract

# 使用 brew 安装 tesseract
brew install tesseract

首先先通过 PIL 库读取图片,并将图片传给 tesseract 进行 OCR:

from PIL import Image
from pytesseract import image_to_string

# 打开图片
image = Image.open('test_receipt.jpg')

# 进行 OCR 识别并获取文本
text = image_to_string(image)

这样我们就可以把图片中的文字识别出来了。但是在实际使用中,可能需要对图片进行一定的预处理,这样能提高 OCR 的效果。

import cv2
import numpy as np

# 打开图片并转成灰度图
image = cv2.imread('test_receipt.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 进行二值化处理
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

# 进行图片降噪
kernel = np.ones((5, 5), np.uint8)
morph = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

# 调整识别参数
config = r'-c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ. --psm 11'

# 进行 OCR 识别并获取文本
text = image_to_string(morph, lang='eng', config=config)

通过上面的代码,我们可以将图片进行灰度化处理,再进行二值化处理、图片降噪等操作。最后设定识别的参数,进行 OCR 识别就可以得到我们想要的文本了。

Pytesseract

Pytesseract 是 Tesseract OCR 的 Python 封装,对于 OCR 来说非常易用,只需要安装 Pytesseract 就可以使用。

# 使用 pip 安装 pytesseract
pip install pytesseract

可以通过以下的代码来识别收据:

import pytesseract
from PIL import Image

# 打开图片
image = Image.open('test_receipt.jpg')
# 进行 OCR 识别
text = pytesseract.image_to_string(image)

不过,和 Tesseract 一样,Pytesseract 识别能力也需要优化,可以配合 OpenCV 对收据图片进行一定的处理。

import cv2
import numpy as np
import pytesseract
from PIL import Image

# 打开图片并转成灰度图
image = cv2.imread('test_receipt.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 进行二值化处理
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

# 降噪
kernel = np.ones((5, 5), np.uint8)
morph = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

# 调整识别参数
config = r'-c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ. --psm 11'

# 进行 OCR 识别并获取文本
text = pytesseract.image_to_string(morph, lang='eng', config=config)

通过上面的代码,我们可以将图片进行灰度化处理,再进行二值化处理、图片降噪等操作。最后设定识别的参数,进行 OCR 识别就可以得到我们想要的文本了。

总的来说,无论是使用 Tesseract 还是 Pytesseract,都需要对图片进行一定的预处理,然后进行识别操作。OCR 技术还有很多优化的空间,可以根据实际情况进行优化,提高 OCR 的准确率。