如何使用Google Vision API和Python改善OCR结果?

时间:2017-12-21 11:50:36

标签: python opencv ocr google-vision

我正在使用Google Vision API和Python来应用text_detection这是Google Vision API的OCR功能,可以检测图像上的文本并将其作为输出返回。我的原始图片如下:

enter image description here

我使用了以下不同的算法:

1)将text_detection应用于原始图像

2)将原始图像放大3倍,然后应用text_detection

3)将CannyfindContoursdrawContours应用于掩码(使用OpenCV),然后text_detection应用于此

4)将原始图片放大3倍,将CannyfindContoursdrawContours应用于蒙版(OpenCV),然后text_detection

5)锐化原始图像,然后应用text_detection

6)将原始图像放大3倍,锐化图像,然后应用text_detection

最好的是(2)和(5)。另一方面,(3)和(4)可能更差。

主要问题是text_detection在大多数情况下都没有检测到减号,特别是' -1.00' 。 另外,我不知道为什么,有时它不会检测到' -1.00'本身就是非常令人惊讶的,因为它与其他数字没有任何重大问题。

您建议我做什么来准确检测减号以及一般数字?

(请记住,我想将此算法应用于不同的框,因此数字可能与此图像中的位置不同)

3 个答案:

答案 0 :(得分:1)

我处理同样的问题。您的最终目标是正确识别文本。对于OCR转换,您使用的是第三方服务或工具(google API / tesseract等)

您所谈论的所有方法都变得毫无意义,因为您使用openCV进行的任何转换都将由tesseract重复。您应该做的最好的事情是以简单的格式提供输入。

最适合我的是打破图像的部分(BOXES - “SQUARES AND RECTANGLES” - 使用示例代码在openCV repo示例中识别所有通道中的矩形使用{{ 3}})然后裁剪它然后按部件发送给OCR。

答案 1 :(得分:0)

由于您使用 Google Vision API检测图像上的文字,因此文本检测API首先检测到负数并不明显。假设您可能无法按照您的情况重新训练API,我建议您编写一个简单的脚本,根据它的形状和大小过滤轮廓,使用此脚本即可轻松分割出负号,然后将其与Google Vision API的输出合并为

import cv2
import numpy as np


img = cv2.imread("path/to/img.jpg", 0)

ret, thresh = cv2.threshold(img, 200, 255, cv2.THRESH_BINARY)

i, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

# filter the contours.
for cnt in contours:
    x, y, w, h = cv2.boundingRect(cnt)
    if 5 < cv2.contourArea(cnt) < 50 and float(w)/h > 3:
        print "I have detected a minus sign at : ", x, y, w, h

在此过滤过程之后,您可以进行计算猜测,如果给定的数字有一个负号,请关闭它的左侧。

答案 2 :(得分:0)

如果谷歌Vision API使用Tesseract,我认为它确实如此, 那么优化通常如下:

  1. 锐化
  2. 二值化(如果必须,则为灰度)
  3. 修剪边框(Tesseract喜欢光滑的背景)
  4. Deskew(Tesseract容忍非常小的倾斜角度。它喜欢漂亮的直文行)
  5. 重塑并调整大小(将其放入页面形状并在必要时调整大小)
  6. 至于负面迹象,如果可以的话,直接使用Tesseract。 您将能够重新训练或下载更好的培训。 或者,您可以使用其他算法更正错误。即按照ZdaR的回答中的建议实施您的复核。