【问题标题】:Pytesseract and OpenCV can't detect digitsPytesseract 和 OpenCV 无法检测数字
【发布时间】:2021-09-22 15:18:19
【问题描述】:

提前感谢所有愿意回答的人。

我是 OpenCV、Pytesseract 的新手,总体上对图像处理和识别非常缺乏经验。

我正在尝试从 pdf 中检测一个数字,为​​了这段代码,我将直接提供图像: Initial image

我的目标是检测彩色框中的数字,在本例中是数字 6。 我的预处理代码如下:

import numpy as np
import pytesseract
from PIL import Image
from PIL import ImageFilter, ImageEnhance

pytesseract.pytesseract.tesseract_cmd = 'Tesseract-OCR\tesseract.exe'


# -----Reading the image-----------------------------------------------------
img = cv2.imread('page_image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.resize(gray, (1028, 720))

thres_gray = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)[1]
gray_inv = cv2.bitwise_not(thres_gray)
gray_test = cv2.bitwise_not(gray_inv)

out2 = cv2.bitwise_or(gray, gray, mask=gray_inv)

thresh_end = cv2.threshold(out2, 254, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

imageObject = Image.fromarray(thresh_end)
enhancer = ImageEnhance.Sharpness(imageObject)


sharpened1 = imageObject.filter(ImageFilter.SHARPEN)
sharpened2 = sharpened1.filter(ImageFilter.SHARPEN)
# sharpened2.show()

由此我得到以下图片: Preprocessed image

此时,由于我仍在学习如何检测感兴趣区域并使用 OpenCV 对其进行裁剪,因此为了测试代码,我决定手动裁剪图像以测试我的脚本是否能够正常工作。

因此,我传递给 pytesseract 的图像如下: Final image to read with pytesseract 我不确定图像是否足以阅读,但这是我能得到的最好的。 从这里我尝试 image_to_string:

trial = pytesseract.image_to_string(sharpened2, config='--psm 13 --oem 3 -c tessedit_char_whitelist=0123456789')

我为 tesseract 尝试了许多不同的配置,但都没有奏效,最终输出始终是一个空字符串。

如果您能帮助我了解图像是否不够好,或者我在 tesseract 配置方面做错了什么,我将不胜感激。 如果您还可以帮助我正确裁剪图像,那就太棒了,但即使检测到数字对我来说也足够了。

抱歉发了这么长的帖子,再次感谢。

【问题讨论】:

  • 您可以尝试在最终图像上反转黑/白,白底黑字。另外,最终处理后的图像比原始图像小很多,为什么?
  • 正如你所建议的,我尝试了cv2.bitwise_not(sharpened2),但 tesseract 的输出仍然为空。关于图像的大小,我认为这是手动裁剪的结果,但是即使导致图像模糊,我仍然可以调整其大小
  • 如果你还没有看这里:tesseract-ocr.github.io/tessdoc/ImproveQuality.html 同时我会尝试制作一个脚本.. 数字周围的框总是橙色的吗?
  • 非常感谢您的努力,我会仔细检查文档以查看是否可以改进。不幸的是,不同的公司对盒子采用不同的颜色,这就是我使用cv2.COLOR_BGR2GRAY的原因,最初的想法是让整个图像完全空白,只留下带有数字的灰色框,这样我就不需要裁剪它了.但不幸的是,这是我能得到的最多的。
  • “预处理图像”看起来有缺陷。请检查。像素(样本)纵横比似乎受到了影响。

标签: python opencv python-tesseract


【解决方案1】:

试试这个:

import cv2
import pytesseract
import numpy as np

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

img = cv2.imread("form.jpg")

# https://stackoverflow.com/questions/10948589/choosing-the-correct-upper-and-lower-hsv-boundaries-for-color-detection-withcv
ORANGE_MIN = np.array([5, 50, 50], np.uint8)
ORANGE_MAX = np.array([15, 255, 255], np.uint8)

hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
frame_threshed = cv2.inRange(hsv_img, ORANGE_MIN, ORANGE_MAX)
# cv2.imshow("frame_threshed", frame_threshed)

thresh = cv2.threshold(frame_threshed, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
# cv2.imshow("thresh", thresh)

cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
# cv2.imshow("dilate", thresh)

for c in cnts:
    x, y, w, h = cv2.boundingRect(c)
    ROI = thresh[y:y + h, x:x + w]

    ratio = 100.0 / ROI.shape[1]
    dim = (100, int(ROI.shape[0] * ratio))

    resizedCubic = cv2.resize(ROI, dim, interpolation=cv2.INTER_CUBIC)
    threshGauss = cv2.adaptiveThreshold(resizedCubic, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 255, 17)

    cv2.imshow("ROI", threshGauss)

    text = int(pytesseract.image_to_string(threshGauss, lang='eng', config="--oem 3 --psm 13"))
    print(f"Detected text: {text}")


cv2.waitKey(0)

我首先使用 HSV 方法检测橙色。然后,一旦 ROI 清晰可见,我就应用了“经典”图像预处理步骤。 看看this link,了解如何选择橙色以外的其他颜色。

我还稍微调整了 ROI。

【讨论】:

  • 非常感谢您。很抱歉回复晚了,但花了一些时间来了解你做了什么以及如何做的。我真的不知道为什么,最初 tesseract 将“a”检测为字符而不是数字“6”,当我将语言更改为法语而不是英语时,它产生了正确的结果。你的帮助真的很有价值,它让我对图像处理有了更多的了解!
  • 我在我的代码中使用 eng 作为语言。检查以下载您的 tessdata 的“最佳”版本。另外,请查看我的个人资料以查看有关此主题的其他答案/问题。同时搜索用户“nathancy”(在我的一些问题中回答),他是 opencv 的怪物。
  • 非常感谢大家的帮助。我正在使用相同格式的其他 pdf(仍然是橙色)测试代码,但不幸的是,它并不能很好地工作,因为 tesseract 经常检测字母而不是数字。其他时候,感兴趣的区域是空的。您认为更多的是预处理问题还是 tesseract 本身?大多数时候数字看起来很容易识别,但 tesseract 失败
猜你喜欢
  • 1970-01-01
  • 2020-01-21
  • 2021-03-12
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 2021-04-14
相关资源
最近更新 更多