Python pytesseract - 找不到 eng.traineddata -- oem 2

Python pytesseract - can't find eng.traineddata for -- oem 2

我正在尝试从简单图像中提取文本。

当我使用默认引擎 (oem 3) 时,文本被提取(很差)。我想用其他引擎(oem 2)看看输出是否可以提高。

import pytesseract

#this is the config that gives a poor output
config = '--tessdata-dir "C:/Program Files/Tesseract-OCR/tessdata" -l eng --oem 2 --psm 6'
text = pytesseract.image_to_string(crop, config=config)

当我尝试传递更改引擎的选项时出现错误,提示未找到语言文件:

pytesseract.pytesseract.TesseractError: (1, "Error: Tesseract (legacy) engine requested, but components are not present in C:/Program Files/Tesseract-OCR/tessdata/eng.traineddata!! Failed loading language 'eng' Tesseract couldn't load any languages! Could not initialize tesseract.")

#experimental config
config = '--psm 6'
text = pytesseract.image_to_string(crop, config=config)

如您所见,我显式地传入了eng.traineddata的目录,但它找不到语言文件。

我有两个问题:

  1. 如何使用第一个配置文件提高 OCR 的质量?
  2. 为什么找不到语言文件?我有 eng.traineddata、eng.user-模式和 eng.user-单词 在提到的文件夹中,以及安装在那里的一些其他文件和文件夹。

我还确保我的环境变量是正确的(因此第一个配置文件可以工作)。

谢谢

执行OCR时,在将图像放入Pytesseract之前对图像进行预处理非常重要。专门针对此图像,我们可以删除水平和垂直网格线。这是预处理后的图像:

Pytesseract OCR 结果

XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX
89 987 98 7 987 9 789 87 987 9
978 9 78 978 9 789 78 987 9
78 987 9 78 *978 97/8 %9 “78 978 9
78 978 978 978 978 98 9
78 978 978 978 978 978 987 978 7897
978 9 9 78 9 89 98 978 9

代码

import cv2
import pytesseract

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

# Remove horizontal and vertical lines
image = cv2.imread('1.png')
kernel_vertical = cv2.getStructuringElement(cv2.MORPH_RECT, (1,50))
temp1 = 255 - cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel_vertical)
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (50,1))
temp2 = 255 - cv2.morphologyEx(image, cv2.MORPH_CLOSE, horizontal_kernel)
temp3 = cv2.add(temp1, temp2)
result = cv2.add(temp3, image)

data = pytesseract.image_to_string(result, lang='eng',config='--psm 6')
print(data)

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

可能是 tesseract 认为您的 CPU 支持 AVX 而实际上它不支持(参见 /proc/cpuinfo 的输出)

如果您使用的是开源 Tesseract,一种解决方法是 在 configure.ac
中更改此行 AX_CHECK_COMPILE_FLAG([-mavx], [avx=true], [avx=false])

AX_CHECK_COMPILE_FLAG([-mavx], [avx=false], [avx=false])

并在 arch/simddetect.h
中更改此行 static inline bool IsAVXAvailable() { return detector.avx_available_; }

static inline bool IsAVXAvailable() { return false; }

然后重新编译源代码。

Reference