在嘈杂的图像中使用 Tesseract 阅读文本

Text reading with Tesseract in a noisy image

我有这两张图片:

第一个显然比第二个质量更高(即使它没有那么差的质量)。我用 OpenCV 处理这两张图片,以便像这样用 Tesseract 读取文本:

import tesseract
import cv2

img = cv2.cvtColor(scr_crop, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(img, 220, 255, cv2.THRESH_BINARY)[1]

# Create custom kernel
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
# Perform closing (dilation followed by erosion)
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

# Invert image to use for Tesseract
result = 255 - close

# result = cv2.resize(result, (0, 0), fx=2, fy=2)

text = pytesseract.image_to_string(result, lang="ita")

所以我先对两张图像的灰度版本进行膨胀,然后进行腐蚀,获得两张图像的这两个结果

因此,如您所见,对于第一张图片我获得了很好的结果并且 tessaract 能够读取文本,而对于第二张图片我获得了糟糕的结果并且 tesseract 无法读取文本。如何提高第二张图片的质量以获得更好的 tesseract 结果?

对于第二张图片,只需应用 only thresholding 不同的阈值类型。

代替cv2.THRESH_BINARY,使用cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU

图像将变为:

如果您阅读:

txt = pytesseract.image_to_string(threshold)
print(txt)

结果将是:

Esiti Positivi: 57

Esiti Negativi: 1512
Numerosita: 1569

Tasso di Conversione: 3.63%

现在 cv2.THRESH_BINARY_INVcv2.THRESH_OTSU 是什么意思?

如果当前像素值大于设置为 0 的阈值,

cv2.THRESH_BINARY_INVcv2.THRESH_BINARY 的相反操作。maxval((在我们的例子中为 255),否则.

source

cv2.THRESH_OTSU 使用OTSU's 算法找到最佳阈值。 [第 3 页]

代码:

import cv2
import pytesseract

img = cv2.imread("c7xq9.png")
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thr = cv2.threshold(gry, 220, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)[1]
txt = pytesseract.image_to_string(thr)
print(txt)
cv2.imshow("thr", thr)
cv2.waitKey(0)