gpt4 book ai didi

python - Pytesseract 不识别小数点

转载 作者:行者123 更新时间:2023-12-05 02:01:29 39 4
gpt4 key购买 nike

我正在尝试阅读此图像中还包含小数点和小数的文本 enter image description here

这样:

img = cv2.imread(path_to_image)
print(pytesseract.image_to_string(img))

我得到的是:

73-82
Primo: 50 —

我也尝试指定意大利语,但结果非常相似:

73-82 _
Primo: 50

在 stackoverflow 上搜索其他问题后,我发现使用白名单可以改善十进制数字的读取,在本例中为 tessedit_char_whitelist='0123456789.',但我还想阅读图像中的单词。关于如何改进十进制数字的阅读有什么想法吗?

最佳答案

我建议将每一行文本作为单独的图像传递 tesseract。
出于某种原因,它似乎可以解决小数点问题......

  • 使用 cv2.threshold 将图像从灰度转换为黑白。
  • 使用cv2.dilate 具有非常长的水平核的形态学操作(在水平方向上合并 block )。
  • 使用查找轮廓 - 每个合并的行都将位于一个单独的轮廓中。
  • 找到轮廓的边界框。
  • 根据 y 坐标对边界框进行排序。
  • 迭代边界框,并将切片传递给 pytesseract

代码如下:

import numpy as np
import cv2
import pytesseract

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # I am using Windows

path_to_image = 'image.png'

img = cv2.imread(path_to_image, cv2.IMREAD_GRAYSCALE) # Read input image as Grayscale

# Convert to binary using automatic threshold (use cv2.THRESH_OTSU)
ret, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

# Dilate thresh for uniting text areas into blocks of rows.
dilated_thresh = cv2.dilate(thresh, np.ones((3,100)))


# Find contours on dilated_thresh
cnts = cv2.findContours(dilated_thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[-2] # Use index [-2] to be compatible to OpenCV 3 and 4

# Build a list of bounding boxes
bounding_boxes = [cv2.boundingRect(c) for c in cnts]

# Sort bounding boxes from "top to bottom"
bounding_boxes = sorted(bounding_boxes, key=lambda b: b[1])


# Iterate bounding boxes
for b in bounding_boxes:
x, y, w, h = b

if (h > 10) and (w > 10):
# Crop a slice, and inverse black and white (tesseract prefers black text).
slice = 255 - thresh[max(y-10, 0):min(y+h+10, thresh.shape[0]), max(x-10, 0):min(x+w+10, thresh.shape[1])]

text = pytesseract.image_to_string(slice, config="-c tessedit"
"_char_whitelist=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-:."
" --psm 3"
" ")

print(text)

我知道这不是最通用的解决方案,但它设法解决了您发布的示例。
请将答案视为概念性解决方案 - 找到稳健的解决方案可能非常具有挑战性。


结果:

膨胀后的阈值图像:
enter image description here

第一片:
enter image description here

第二个切片:
enter image description here

第三片:
enter image description here

输出文本:

7.3-8.2

Primo:50

关于python - Pytesseract 不识别小数点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66505390/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com