我正在尝试对火车或卡车等车辆进行 OCR,以识别上面写的数字和字符。 (请注意这不是车牌识别OCR)
我拍了这张照片。这个想法是为了能够提取文本 - BN SF 721 734 写在上面。
为了进行预处理,我首先将此图像转换为灰度图像,然后将其转换为看起来像这样的二值化图像
我在 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/