如何正确设置 Tesseract OCR

How to setup Tesseract OCR properly

我正在使用 Tesseract OCR 尝试将经过预处理的车牌图像转换为文本,但对于一些看起来非常不错的图像我没有取得太大的成功。 tesseract 设置可以在函数定义中看到。我在 Google Colab 上 运行。输入图像如下ZG NIVEA 1。我不确定我是否使用了错误的东西或者是否有更好的方法 - 我从这个特定图像得到的结果是 A.

!sudo apt install -q tesseract-ocr
!pip install -q pytesseract
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r'/usr/bin/tesseract'
import cv2
import re

def pytesseract_image_to_string(img, oem=3, psm=7) -> str:
  '''
  oem - OCR Engine Mode
      0 = Original Tesseract only.
      1 = Neural nets LSTM only.
      2 = Tesseract + LSTM.
      3 = Default, based on what is available.
  psm - Page Segmentation Mode
      0 = Orientation and script detection (OSD) only.
      1 = Automatic page segmentation with OSD.
      2 = Automatic page segmentation, but no OSD, or OCR. (not implemented)
      3 = Fully automatic page segmentation, but no OSD. (Default)
      4 = Assume a single column of text of variable sizes.
      5 = Assume a single uniform block of vertically aligned text.
      6 = Assume a single uniform block of text.
      7 = Treat the image as a single text line.
      8 = Treat the image as a single word.
      9 = Treat the image as a single word in a circle.
      10 = Treat the image as a single character.
      11 = Sparse text. Find as much text as possible in no particular order.
      12 = Sparse text with OSD.
      13 = Raw line. Treat the image as a single text line,
          bypassing hacks that are Tesseract-specific.
  '''
  tess_string = pytesseract.image_to_string(img, config=f'--oem {oem} --psm {psm}')
  regex_result = re.findall(r'[A-Z0-9]', tess_string) # filter only uppercase alphanumeric symbols
  return ''.join(regex_result)

image = cv2.imread('nivea.png')
print(pytesseract_image_to_string(image))

编辑:已接受答案中的方法适用于 ZGNIVEA1 图像,但不适用于其他图像,例如,是否有 Tesseract OCR 最适合使用的一般“字体大小”,或者是否有经验法则?

通过在 OCR 之前应用高斯模糊,我最终得到了正确的输出。此外,您可能不需要通过将 -c tessedit_char_whitelist=ABC.. 添加到您的配置字符串来使用正则表达式。

为我生成正确输出的代码:

import cv2
import pytesseract

image = cv2.imread("images/tesseract.png")

config = '--oem 3  --psm 7 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ'

image = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
image = cv2.GaussianBlur(image, (5, 5), 0)

string = pytesseract.image_to_string(image, config=config)

print(string)

输出:

答案2:

抱歉回复晚了。我在你的第二张图片上测试了相同的代码,它给了我正确的输出,你确定你删除了配置部分,因为它不允许我的白名单中的数字。

此处最准确的解决方案是在车牌字体 (FE-Schrift) 上训练您自己的 tesseract 模型,而不是 tesseract 的默认 eng.traineddata 模型。它肯定会提高准确性,因为它只包含您案例的字符作为输出 类。作为对后一个问题的回答,tesseract 在识别过程(阈值处理、形态闭合等)之前进行了一些预处理,这就是图像对字母大小如此敏感的原因。 (较小的图像:轮廓彼此更接近,因此关闭不会将它们分开)。

要在自定义字体上训练 tesseract,您可以按照 official docs

要阅读有关 Tesseract 理论部分的更多信息,您可以查看这些论文: 1(比较老) 2(较新)