python - 从具有不同行颜色的图像(OCR)中读取数字表
问题描述
我想从附加图像(png 文件)中读取数字表。
我的代码如下:
import cv2
import imutils
import pytesseract
import os
image = cv2.imread(os.path.join(image_path, image_name))
image = imutils.resize(image, width=500)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
thresh = 255 - cv2.GaussianBlur(thresh, (5,5), 0)
data = pytesseract.image_to_string(thresh, lang='eng', config='--psm 6')
print(data)
结果是:
0.74 0.73 0.72
0.72 0.71 0.71
0.71 0.70 0.70
如我们所见,它错过了以蓝色突出显示的行。
我的问题是我们可以调整我们的图像,以便我们可以正确读取这个缺失的行吗?
解决方案
只需将图像大小调整为 2 倍,我就可以读取要读取的数据。
from PIL import Image
import pytesseract
img = Image.open('PBdvo.png')
img_larger = img.resize((img.width*2,img.height*2))
data = pytesseract.image_to_string(img_larger)
print(data)
结果:
0.74 0.73 0.72
0.73 0.72 0.72
0.72 0.71 0.71
0.71 0.70 0.70
编辑:根据您的新的更大的图像,我提出了以下调整:
from PIL import ImageFilter
img = Image.open('doc0m.png')
img_larger = img.resize((round(img.width*2.5),round(img.height*2.5)))
img_enhanced_more = img_larger.filter(ImageFilter.EDGE_ENHANCE_MORE)
data = pytesseract.image_to_string(img_enhanced_more)
然后我注意到数据是按列返回的,所以如果你想把它按行返回,你可以这样做:
for i in zip(*[column.split('\n') for column in data.split('\n\n')]):
print(i)
这使:
('1.04', '1.03', '1.03', '1.02', '1.01')
('1.02', '1.01', '1.00', '1.00', '0.99')
('1.00', '0.99', '0.98', '0.97', '0.97')
('0.97', '0.97', '0.96', '0.95', '0.95')
('0.95', '0.95', '0.94', '0.93', '0.92')
('0.93', '0.92', '0.92', '0.91', '0.30')
('0.91', '0.90', '0.90', '0.89', '0.88')
('0.89', '0.88', '0.88', '0.87', '0.86')
('0.87', '0.86', '0.86', '0.85', '0.84')
('0.85', '0.84', '0.84', '0.83', '0.82')
('0.83', '0.82', '0.82', '0.81', '0.80')
('0.81', '0.80', '0.80', '0.79', '0.78')
('0.79', '0.78', '0.78', '0.77', '0.76')
('0.77', '0.76', '0.76', '0.75', '0.74')
('0.76', '0.75', '0.75', '0.74', '0.73')
('0.75', '0.74', '0.74', '0.73', '0.72')
('0.74', '0.74', '0.73', '0.72', '0.72')
('0.73', '0.73', '0.72', '0.71', '0.71')
('0.72', '0.72', '0.71', '0.70', '0.70')
('0.71', '0.71', '0.70', '0.69', '0.69')
('0.71', '0.70', '0.69', '0.69', '0.68')
('0.70', '0.69', '0.68', '0.68', '0.67')
('0.69', '0.68', '0.67', '0.67', '0.66')
('0.68', '0.67', '0.67', '0.66', '0.65')
('0.67', '0.66', '0.66', '0.65', '0.64')
('0.66', '0.65', '0.65', '0.64', '0.63')
('0.65', '0.65', '0.64', '0.63', '0.63')
('0.64', '0.64', '0.63', '0.62', '0.62')
('0.63', '0.63', '0.62', '0.62', '0.61')
('0.63', '0.62', '0.61', '0.61', '0.60')
('0.62', '0.61', '0.60', '0.60', '0.59')
推荐阅读
- python - Debian 9.2 上的 Adafruit_BBIO.ADC.setup() 错误
- text-to-speech - IBM Watson TextToSpeech - 无法读取未定义的属性 .pipe
- php - 从 Laravel / PHP 向 AWS S3 的一个请求中上传多个文件?
- oracle - 将 ORACLE 查询上的 WHERE 条件优化到暂存表
- sql - 如何在左连接中使用 if 语句
- c# - 在 for 循环 C# 创建的链接中传递会话变量
- sql - 在 SQL 中删除变量中的数字/特殊字符
- windows - 加密的 RSA 密钥在 Windows 中无法与 MongoDB 一起使用
- java - 在循环中多次调用 ServletRequest.getInputStream() 可以吗?
- javascript - 仅在按下按钮时将状态添加到另一个组件状态的末尾