python - Pytesseract 阅读收据
问题描述
我尝试使用 pytesseract 从收据图像中读取文本。但是结果文本有很多奇怪的字符,看起来真的很糟糕。有我用来操作图像的代码:
import sys
from PIL import Image
import cv2 as cv
import numpy as np
import pytesseract
def manipulate_image(img):
img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
kernel = np.ones((1,1), dtype = "uint8")
img = cv.erode(img, kernel, iterations = 1)
img = cv.threshold(img, 0, 255,
cv.THRESH_BINARY | cv.THRESH_OTSU)[1]
img = cv.medianBlur(img, 3)
return img
if len(sys.argv) > 2:
print("Please provide only name of image.")
elif len(sys.argv) == 2:
img = cv.imread(sys.argv[1])
img = manipulate_image(img)
cv.imwrite("test.png", img)
text = pytesseract.image_to_string(img)
print text.encode('utf8')
else:
print("Please provide name of image.")
有我的测试收据图像: https : //imgur.com/a/RjeQ9dL 并且在处理后有输出图像: https ://imgur.com/a/1tFZRdq 并且有文本结果:
""'9vco4v‘l7
0 .Vt3t00N 00t300N BUNUUS
SKLEP PUU POPUGOH|
UL. JHGIELLUNSKA 25, 70-364 SZCZ[C|N
TEL. 91 4841-20-58
N|P: 955—150-21-B2
dn.19r03.05 Uydr.8534
PARAGON FISKALNY
CIHSTKH 17 0,3 ¥ 16,30 = 4.89 B
Sp.0p.B 4,89 PTU B= 8,00% 0,35
Razem PTU 0,35
ZOP{HCUNU GUTUNKQ PLN
RESZTA PLN
0025/1373 H0103 0N|0 H.
15F H9HF[B9416} 13fl02D6k0[20D4334C
7?? BW 140
知道如何以更好的方式执行它以获得更好的结果吗?
解决方案
pyTesseract 无法正确检测字符,应用简单的阈值处理是不够的。可以进行更多的预处理来显着改善您的结果,例如:
- 使用 Tesseract V4,其中实现了深度学习
- 分割字符
- 通过边缘检测仅使用收据中文本所在的部分
- 透视变换以理顺文本
这些都是一些冗长的主题,可以在一个答案中全部写出来,但是您可以查看 pyImageSearch 上的一些文章,其中对此进行了更深入的讨论:
https://www.pyimagesearch.com/2014/09/01/build-kick-ass-mobile-document-scanner-just-5-minutes/ https://www.pyimagesearch.com/2018/09/17/ opencv-ocr-and-text-recognition-with-tesseract/
推荐阅读
- reactjs - 如何从天气 API 数组(对于 React Redux)中获取单独的每日数组,该数组每 3 小时提供 5 天报告
- stata - 分组结果的汉明距离
- flutter - 从建议列表中选择项目时显示 json 数据
- time-complexity - 为什么n点FFT等于截断数据,是否使FFT的复杂度为O(1)?
- python - 如何使用标签创建 Python 树视图并稍后使用 QTreeWidget => PyQt 获取项目坐标
- python - 如何使用用户输入来调用用户定义的函数?
- video - 我需要跟踪有关谁下载了我的视频内容的信息
- node.js - 如何从 nodejs 中的谷歌存储桶中读取二进制文件?
- java - Java Reactor:有没有办法改造 Flux
> 进入通量 没有急切的获取? - python - 如何提取员工在熊猫轮班期间所做的第一个和最后一个条目