opencv - 如何改进写在车辆上的文本的 OCR?

标签 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]

最佳答案

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

我知道这看起来工作量很大,但它会给您带来更好、更可靠的结果。 祝你好运!

关于opencv - 如何改进写在车辆上的文本的 OCR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42181989/

相关文章:

opencv - 'W'上的字符分割失败

machine-learning - 当您执行更多 OCR 时,Tesseract 似乎正在学习字符,如何在使用之间保存学习数据?

Java如何将特定字符串逐行写入文本文件(Tesseract输出)

c++ - 如何将openCV导入到iOS 8项目中

opencv - 使用 OpenCV 的视频中的人脸识别给出未处理的异常

maven - opencv 构建 github 操作

c# - 阿拉伯语开源 OCR

algorithm - 如何在 OCR 扫描代码中添加冗余

ios - Tesseract libtesseract_all.a(svpaint.o) 中 _main 的重复符号

python - 如何在Python中仅打开10%放大的jpeg图像?