2017-02-11 37 views
3

我正在尝试做火车或卡车等车辆的OCR来识别写在其上的数字和字符。 (请注意这不是车牌识别OCR)如何提高写在车辆上的文字的OCR?

我拍了这张照片。这个想法是能够提取文字 - BN SF 721 734写在它上面。

enter image description here

对于前处理,我先转换此图片灰度,然后将其转换成看起来像这样

enter image description here

我在正方体写一些代码的二进制图像。

myimg = "image.png" 
image = Image.open(myimg) 
with PyTessBaseAPI() as api: 
    api.SetImage(image) 
    api.Recognize() 
    words = api.GetUTF8Text() 
    print words 
    print api.AllWordConfidences() 

此代码给了我95的置信度值,这意​​味着正方体为95%,相信没有文字此图像中存在一个空白的输出。

然后,我使用Tesseract中的setrectangle api来限制图像内特定窗口上的OCR,而不是尝试在整个图像上执行OCR。

myimg = "image.png" 
image = Image.open(myimg) 
with PyTessBaseAPI() as api: 
    api.SetImage(image) 
    api.SetRectangle(665,445,75,40) 
    api.Recognize() 
    words = api.GetUTF8Text() 
    print words 
    print api.AllWordConfidences() 
    print "----" 

坐标665,445,75和40对应于包含图像中的文本BNSF 721 734的矩形。 665 - 顶部,445-左侧,75-宽度和40-高度。

我得到的输出是这样的:

an s 
m,m 

我的问题是我怎么提高成绩?我玩弄了setrectangle函数中的值,结果稍有不同,但所有这些都同样糟糕。

有没有办法改善这一点?

如果你有兴趣我是如何转换的图像二值化的图像,我用的OpenCV

img = cv2.imread(image) 
grayscale_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) 
(thresh, im_bw) = cv2.threshold(grayscale_img, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) 
thresh = 127 
binarized_img = cv2.threshold(grayscale_img, thresh, 255, cv2.THRESH_BINARY)[1] 
+0

尝试使用OpenCV提取MSER区域。喂这个给Tesseract –

+0

@JeruLuke:会试试这个选项。我需要阅读有关MSER地区的信息,因为我不确定他们目前的工作方式。我的问题是它会帮助提高OCR的准确性,还是它会帮助我自动提取文本的矩形?谢谢 – Piyush

+0

尝试使用“描边宽度变换”首先识别图像中文字的位置。它专门设计用于查找文本。通常,避免过早二元化。 – Rethunk

回答

0

我建议寻找轮廓在裁剪矩形,并设置一些参数来匹配你的人物的轮廓。例如:面积大于或小于某些阈值的轮廓。然后在空位图上逐个绘制轮廓,并执行OCR。

我知道这似乎很多工作,但它会给你更好,更强大的结果。 祝你好运!