繁体   English   中英

如何使用 Pytesseract 提取图像中的小数

[英]How to extract decimal in image with Pytesseract

要提取的图像

上面是图像,我已经尝试了所有可以从 SO 或 google 获得的东西,但似乎没有任何效果。 我无法获得 image 中的确切值,我应该得到 2.10 ,而总是得到 210 。

并且不限于此图像,只有在数字 1 tesseract 之前有小数的任何图像都会忽略十进制值。

 def returnAllowedAmount(self,imgpath):
        th = 127
        max_val = 255
        img = cv2.imread(imgpath,0) #Load Image in Memory
        img = cv2.resize(img, None, fx=2.5, fy=2.5, interpolation=cv2.INTER_CUBIC) #rescale Image
        img = cv2.medianBlur(img, 1)
        ret , img = cv2.threshold(img,th,max_val,cv2.THRESH_TOZERO)
        self.showImage(img)

        returnData = pytesseract.image_to_string(img,lang='eng',config='-psm 13 ' )
        returnData = ''.join(p for p in returnData if p.isnumeric() or p == ".") # REMOVE $ SIGN

在将图像放入 Pytesseract 之前,一些用于清理/平滑图像的预处理会有所帮助。 这是一个简单的方法

  • 将图像转换为灰度并放大图像
  • 临界点
  • 执行形态学操作以清洁图像
  • 反转图像

首先我们将图像转换为灰度,使用imutils库调整大小,然后阈值以获得二值图像

在此处输入图片说明

现在我们执行形态变换来平滑图像

在此处输入图片说明

现在我们反转 Pytesseract 的图像并添加高斯模糊

在此处输入图片说明

我们使用--psm 10配置标志,因为我们希望将图像视为单个字符。 这是一些可能有用的附加配置标志

结果

2.10 美元

过滤后

2.10

import cv2
import pytesseract
import imutils

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

image = cv2.imread('1.png',0)
image = imutils.resize(image, width=300)
thresh = cv2.threshold(image, 150, 255, cv2.THRESH_BINARY_INV)[1]

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

result = 255 - close 
result = cv2.GaussianBlur(result, (5,5), 0)

data = pytesseract.image_to_string(result, lang='eng',config='--psm 10 ')
processed_data = ''.join(char for char in data if char.isnumeric() or char == '.')
print(data)
print(processed_data)

cv2.imshow('thresh', thresh)
cv2.imshow('close', close)
cv2.imshow('result', result)
cv2.waitKey()

通过使用其他答案中提到的方法,我能够增加正确小数的数量。 然而,一小部分小数没有被正确识别。

我找到的解决方案是更改 pytesseract 的语言设置。

我使用的是非英语设置,但将配置更改为lang='eng'修复了所有剩余问题。

不确定是什么原因,但使用 Tesseract 的新 LSTM 引擎,训练数据可能主要是英语。

有时 tesseract 对图像大小异常敏感。 您通常可以通过缩放图像来获得更好的结果。

我将您的图像缩放了 2 倍,结果很好。

import cv2
import pytesseract

# if windows
# pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files (x86)\\Tesseract-OCR\\tesseract.exe'

img = cv2.imread('twoten.png', 0)
img = cv2.resize(img, (0,0), fx=2, fy=2)

config = ("--psm 12")

data = pytesseract.image_to_string(img, lang='eng', config = config)

print(data)

这在控制台中给出了这个:

$2.10

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM