我正在使用Google Vision API和Python来应用text_detection
这是Google Vision API的OCR功能,可以检测图像上的文本并将其作为输出返回。我的原始图片如下:
我使用了以下不同的算法:
1)将text_detection
应用于原始图像
2)将原始图像放大3倍,然后应用text_detection
3)将Canny
,findContours
,drawContours
应用于掩码(使用OpenCV),然后text_detection
应用于此
4)将原始图片放大3倍,将Canny
,findContours
,drawContours
应用于蒙版(OpenCV
),然后text_detection
此
5)锐化原始图像,然后应用text_detection
6)将原始图像放大3倍,锐化图像,然后应用text_detection
最好的是(2)和(5)。另一方面,(3)和(4)可能更差。
主要问题是text_detection
在大多数情况下都没有检测到减号,特别是' -1.00' 。
另外,我不知道为什么,有时它不会检测到' -1.00'本身就是非常令人惊讶的,因为它与其他数字没有任何重大问题。
您建议我做什么来准确检测减号以及一般数字?
(请记住,我想将此算法应用于不同的框,因此数字可能与此图像中的位置不同)
答案 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,我认为它确实如此, 那么优化通常如下:
至于负面迹象,如果可以的话,直接使用Tesseract。 您将能够重新训练或下载更好的培训。 或者,您可以使用其他算法更正错误。即按照ZdaR的回答中的建议实施您的复核。