如何使用 Pytesseract 提取图像中的小数
How to extract decimal in image with Pytesseract
上面是图片,我已经尝试了所有我能从 SO 或 google 得到的东西,似乎没有任何效果。我无法获得图像中的确切值,我应该得到 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 之前,对图像进行一些预处理 clean/smooth 会有所帮助。这是一个简单的方法
- 将图像转换为灰度并放大图像
- 阈值
- 执行形态学操作以清理图像
- 反转图像
首先我们将图像转换为灰度,使用imutils
库调整大小,然后阈值获得二值图像
现在我们执行morphological transformations来平滑图像
现在我们反转 Pytesseract 的图像并添加高斯模糊
我们使用 --psm 10
配置标志,因为我们想将图像视为单个字符。这里还有一些可能有用的
结果
.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()
有时 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)
在控制台中给出了这个:
.10
通过使用其他答案中提到的方法,我能够增加正确的小数位数。然而,一小部分小数没有被正确识别。
我找到的解决方案是更改 pytesseract 的语言设置。
我使用的是非英语设置,但将配置更改为 lang='eng'
解决了所有遗留问题。
不确定是什么原因,但是使用 Tesseract 的新 LSTM 引擎,训练数据可能主要是英语。
上面是图片,我已经尝试了所有我能从 SO 或 google 得到的东西,似乎没有任何效果。我无法获得图像中的确切值,我应该得到 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 之前,对图像进行一些预处理 clean/smooth 会有所帮助。这是一个简单的方法
- 将图像转换为灰度并放大图像
- 阈值
- 执行形态学操作以清理图像
- 反转图像
首先我们将图像转换为灰度,使用imutils
库调整大小,然后阈值获得二值图像
现在我们执行morphological transformations来平滑图像
现在我们反转 Pytesseract 的图像并添加高斯模糊
我们使用 --psm 10
配置标志,因为我们想将图像视为单个字符。这里还有一些可能有用的
结果
.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()
有时 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)
在控制台中给出了这个:
.10
通过使用其他答案中提到的方法,我能够增加正确的小数位数。然而,一小部分小数没有被正确识别。
我找到的解决方案是更改 pytesseract 的语言设置。
我使用的是非英语设置,但将配置更改为 lang='eng'
解决了所有遗留问题。
不确定是什么原因,但是使用 Tesseract 的新 LSTM 引擎,训练数据可能主要是英语。