在嘈杂的图像中使用 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_INV
和 cv2.THRESH_OTSU
是什么意思?
如果当前像素值大于设置为 0 的阈值,cv2.THRESH_BINARY_INV
是 cv2.THRESH_BINARY
的相反操作。maxval
((在我们的例子中为 255),否则.
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)
我有这两张图片:
第一个显然比第二个质量更高(即使它没有那么差的质量)。我用 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_INV
和 cv2.THRESH_OTSU
是什么意思?
cv2.THRESH_BINARY_INV
是 cv2.THRESH_BINARY
的相反操作。maxval
((在我们的例子中为 255),否则.
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)