如何提高 Tesseract 的输出
How to improve Tesseract's output
我有一张看起来像这样的图片:
这是处理后的图片
我几乎什么都试过了。我这样处理图像:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #Converting to GrayScale
(h, w) = gray.shape[:2]
gray = cv2.resize(gray, (w*2, h*2))
thresh = cv2.threshold(gray, 150, 255.0, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
gray = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, rectKernel)
blur = cv2.GaussianBlur(gray,(1,1),cv2.BORDER_DEFAULT)
text = pytesseract.image_to_string(blur, config="--oem 1 --psm 6")
但是 Tesseract 没有打印出任何东西。我正在使用这个版本的 tesseract
5.0.0-alpha.20201127
如何提高它的性能?这是非常不可靠的。
编辑:
下面的答案在上述图像上做得很好。
但是当我将这种技术应用于像这样的图像时,我得到了错误的输出
这是为什么?他们看起来大致相同。
问题是字符不在图像的中心。
有时,tesseract 很难识别不在中心的字符或数字。
因此我的建议是:
-
- 将字符居中
-
- 上采样并转换为灰度
-
居中字符:
-
cv2.copyMakeBorder(img, 50, 50, 50, 50, cv2.BORDER_CONSTANT, value=[255])
50
只是一个填充变量,你可以设置为任何其他值。
背景变成蓝色是因为数值。 OpenCV 以 BGR 方式读取图像。将 255
作为输入与 [255, 0, 0]
相同,后者显示蓝色通道,但分别不显示绿色和红色。
您可以尝试其他值。对我来说没关系,因为我会在下一步将其转换为灰度。
-
上采样并转换为灰度:
与您完成的步骤相同。您的代码的前三行。
现在当你阅读:
MEHVISH MUQADDAS
Code:
import cv2
import pytesseract
# Load the image
img = cv2.imread("onf0D.jpg")
# Center the image
img = cv2.copyMakeBorder(img, 50, 50, 50, 50, cv2.BORDER_CONSTANT, value=[255])
# Up-sample
img = cv2.resize(img, (0, 0), fx=2, fy=2)
# Convert to gray-scale
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# OCR
txt = pytesseract.image_to_string(gry, config="--psm 6")
print(txt)
阅读更多tesseract-improve-quality。
您不需要执行 threshold
、GaussianBlur
或 morphologyEx
。
原因是:
Simple-Threshold用于获取图像的特征。输入图像的功能已经可用。
不必smooth图片,图片没有光照效果
您不需要segmentation,因为背景是纯白色的。
更新-1
第二张图片需要预处理。但是,应用 simple-threshold 不适用于此图像。您需要使用二进制蒙版去除背景,然后才能应用 OCR。
二进制掩码的结果:
现在,如果您应用 OCR:
IRUM FEROZ
代码:
import cv2
import numpy as np
import pytesseract
# Load the image
img = cv2.imread("jCMft.jpg")
# Center the image
img = cv2.copyMakeBorder(img, 50, 50, 50, 50, cv2.BORDER_CONSTANT, value=[255])
# Up-sample
img = cv2.resize(img, (0, 0), fx=2, fy=2)
# Convert to HSV color-space
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# Adaptive-Threshold
msk = cv2.inRange(hsv, np.array([0, 0, 0]), np.array([179, 255, 130]))
# OCR
txt = pytesseract.image_to_string(msk, config="--psm 6")
print(txt)
Q:如何找到cv2.inRange
方法的下限和上限?
A:可以用下面的.
问:第二张图你改了什么?
A: 首先我将图像转换为 HSV 格式,而不是灰度格式。原因是我想删除背景。如果你用 adaptiveThreshold
进行试验,你会发现背景上有很多伪影限制了 tesseract 的识别。然后我用 cv2.inRange
得到一个二进制掩码。将二进制掩码输入输入给了我想要的结果。
我有一张看起来像这样的图片:
这是处理后的图片
我几乎什么都试过了。我这样处理图像:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #Converting to GrayScale
(h, w) = gray.shape[:2]
gray = cv2.resize(gray, (w*2, h*2))
thresh = cv2.threshold(gray, 150, 255.0, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
gray = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, rectKernel)
blur = cv2.GaussianBlur(gray,(1,1),cv2.BORDER_DEFAULT)
text = pytesseract.image_to_string(blur, config="--oem 1 --psm 6")
但是 Tesseract 没有打印出任何东西。我正在使用这个版本的 tesseract 5.0.0-alpha.20201127
如何提高它的性能?这是非常不可靠的。 编辑:
下面的答案在上述图像上做得很好。
但是当我将这种技术应用于像这样的图像时,我得到了错误的输出
这是为什么?他们看起来大致相同。
问题是字符不在图像的中心。
有时,tesseract 很难识别不在中心的字符或数字。
因此我的建议是:
-
- 将字符居中
-
- 上采样并转换为灰度
-
居中字符:
-
cv2.copyMakeBorder(img, 50, 50, 50, 50, cv2.BORDER_CONSTANT, value=[255])
50
只是一个填充变量,你可以设置为任何其他值。背景变成蓝色是因为数值。 OpenCV 以 BGR 方式读取图像。将
255
作为输入与[255, 0, 0]
相同,后者显示蓝色通道,但分别不显示绿色和红色。您可以尝试其他值。对我来说没关系,因为我会在下一步将其转换为灰度。
-
上采样并转换为灰度:
与您完成的步骤相同。您的代码的前三行。
现在当你阅读:
MEHVISH MUQADDAS
Code:
import cv2
import pytesseract
# Load the image
img = cv2.imread("onf0D.jpg")
# Center the image
img = cv2.copyMakeBorder(img, 50, 50, 50, 50, cv2.BORDER_CONSTANT, value=[255])
# Up-sample
img = cv2.resize(img, (0, 0), fx=2, fy=2)
# Convert to gray-scale
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# OCR
txt = pytesseract.image_to_string(gry, config="--psm 6")
print(txt)
阅读更多tesseract-improve-quality。
您不需要执行 threshold
、GaussianBlur
或 morphologyEx
。
原因是:
Simple-Threshold用于获取图像的特征。输入图像的功能已经可用。
不必smooth图片,图片没有光照效果
您不需要segmentation,因为背景是纯白色的。
更新-1
第二张图片需要预处理。但是,应用 simple-threshold 不适用于此图像。您需要使用二进制蒙版去除背景,然后才能应用 OCR。
二进制掩码的结果:
现在,如果您应用 OCR:
IRUM FEROZ
代码:
import cv2
import numpy as np
import pytesseract
# Load the image
img = cv2.imread("jCMft.jpg")
# Center the image
img = cv2.copyMakeBorder(img, 50, 50, 50, 50, cv2.BORDER_CONSTANT, value=[255])
# Up-sample
img = cv2.resize(img, (0, 0), fx=2, fy=2)
# Convert to HSV color-space
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# Adaptive-Threshold
msk = cv2.inRange(hsv, np.array([0, 0, 0]), np.array([179, 255, 130]))
# OCR
txt = pytesseract.image_to_string(msk, config="--psm 6")
print(txt)
Q:如何找到cv2.inRange
方法的下限和上限?
A:可以用下面的
问:第二张图你改了什么?
A: 首先我将图像转换为 HSV 格式,而不是灰度格式。原因是我想删除背景。如果你用 adaptiveThreshold
进行试验,你会发现背景上有很多伪影限制了 tesseract 的识别。然后我用 cv2.inRange
得到一个二进制掩码。将二进制掩码输入输入给了我想要的结果。