如何提高车辆上写的文字的OCR?

时间:2017-02-11 22:30:56

标签: opencv ocr tesseract python-tesseract pytesser

我正在尝试对火车或卡车等车辆进行OCR,以识别写在其上的数字和字符。 (请注意,这不是车牌识别OCR)

我拍了这张照片。我们的想法是能够提取文字 - BN SF 721 734。

enter image description here

对于预处理,我首先将此图像转换为灰度,然后将其转换为二值化图像,看起来像这样

enter image description here

我在tesseract中写了一些代码。

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,这意味着tesseract有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]

1 个答案:

答案 0 :(得分:0)

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

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