问题是字符不在图像的中心。
有时,如果字符或数字不在中心,则 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。
原因是:
更新-1
第二张图片需要预处理。但是,应用简单阈值不适用于此图像。您需要使用二进制掩码去除背景,然后才能应用 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:您可以使用以下script。
问:你在第二张图片中做了什么改变?
A:首先我将图像转换为 HSV 格式,而不是灰度。原因是我想删除背景。如果您尝试使用adaptiveThreshold,您会看到背景上有很多伪影限制了tesseract 的识别。然后我用cv2.inRange 得到一个二进制掩码。向输入提供二进制掩码给了我想要的结果。