即使输入文本,Tesseract OCR 也会给出非常糟糕的输出
Tesseract OCR gives really bad output even with typed text
我一直在尝试让 tesseract OCR 从预先裁剪的图像中提取一些数字,但即使图像相当清晰,它也根本无法正常工作。我尝试四处寻找解决方案,但我在这里看到的所有其他问题都涉及裁剪或倾斜文本的问题。
这是我的代码示例,它尝试读取图像并输出到命令行。
#convert image to greyscale for OCR
im_g = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
#create threshold image to simplify things.
im_t = cv2.threshold(im_g, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV)[1]
#define kernel size
rect_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (20,20))
#Apply dilation to threshold image
im_d = cv2.dilate(im_t, rect_kernel, iterations = 1)
#Find countours
contours = cv2.findContours(im_t, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
for cnt in contours:
x,y,w,h = cv2.boundingRect(cnt)
#crop
im_c = im[y:y+h, x:x+w]
speed = pytesseract.image_to_string(im_c)
print(im_path +" : " + speed)
Here's an example of an image
它的输出是:
frame10008.jpg : VAeVAs}
通过将以下配置添加到 tesseract 图像到字符串函数中,我在一些图像中得到了微小的改进:
config="--psm 7"
如果没有新配置,它将无法检测到 this 图片。现在输出
frame100.jpg : | U |
关于我做错了什么有什么想法吗?我可以采取不同的方法来解决这个问题吗?我愿意完全不使用 Tesseract。
我找到了一个不错的解决方法。首先,我把图像放大了。更多的 tesseract 工作区域帮助了它很多。其次,为了摆脱非数字输出,我在图像到字符串函数上使用了以下配置:
config = "--psm 7 outputbase digits"
该行现在看起来像这样:
speed = pytesseract.image_to_string(im_c, config = "--psm 7 outputbase digits")
返回的数据远非完美,但成功率足够高,我应该能够清理垃圾数据并在 tesseract returns 没有数字的地方进行插值。
我尝试使用 image_to_data 函数反转前景和背景像素值以及 OCRed 图像并得到预期结果:7576
gray_image = 255 - gra_image
#convert OpenCV image to PIL image data format
gray_pil = Image.fromarray(gray_image)
# OCR image
config = ('-l eng --oem 1 --psm 7')
text = pytesseract.image_to_data(gray_pil, config=config, output_type='dict')
我一直在尝试让 tesseract OCR 从预先裁剪的图像中提取一些数字,但即使图像相当清晰,它也根本无法正常工作。我尝试四处寻找解决方案,但我在这里看到的所有其他问题都涉及裁剪或倾斜文本的问题。
这是我的代码示例,它尝试读取图像并输出到命令行。
#convert image to greyscale for OCR
im_g = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
#create threshold image to simplify things.
im_t = cv2.threshold(im_g, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV)[1]
#define kernel size
rect_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (20,20))
#Apply dilation to threshold image
im_d = cv2.dilate(im_t, rect_kernel, iterations = 1)
#Find countours
contours = cv2.findContours(im_t, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
for cnt in contours:
x,y,w,h = cv2.boundingRect(cnt)
#crop
im_c = im[y:y+h, x:x+w]
speed = pytesseract.image_to_string(im_c)
print(im_path +" : " + speed)
Here's an example of an image
它的输出是:
frame10008.jpg : VAeVAs}
通过将以下配置添加到 tesseract 图像到字符串函数中,我在一些图像中得到了微小的改进:
config="--psm 7"
如果没有新配置,它将无法检测到 this 图片。现在输出
frame100.jpg : | U |
关于我做错了什么有什么想法吗?我可以采取不同的方法来解决这个问题吗?我愿意完全不使用 Tesseract。
我找到了一个不错的解决方法。首先,我把图像放大了。更多的 tesseract 工作区域帮助了它很多。其次,为了摆脱非数字输出,我在图像到字符串函数上使用了以下配置:
config = "--psm 7 outputbase digits"
该行现在看起来像这样:
speed = pytesseract.image_to_string(im_c, config = "--psm 7 outputbase digits")
返回的数据远非完美,但成功率足够高,我应该能够清理垃圾数据并在 tesseract returns 没有数字的地方进行插值。
我尝试使用 image_to_data 函数反转前景和背景像素值以及 OCRed 图像并得到预期结果:7576
gray_image = 255 - gra_image
#convert OpenCV image to PIL image data format
gray_pil = Image.fromarray(gray_image)
# OCR image
config = ('-l eng --oem 1 --psm 7')
text = pytesseract.image_to_data(gray_pil, config=config, output_type='dict')