使用OpenCV预处理七段数码图像以供Tesseract OCR识别

3
我正在尝试开发一个系统,将旧模拟压力输出系统上的七段显示转换为文本,以便数据可以被LabVIEW处理。我一直在进行图像处理来使Tesseract (使用v3.02)正确识别数字,但一直遇到一些障碍,不知如何继续。这是我目前的成果:
  • 图像高度需要在50-100像素之间,才能由Tesseract正确读取。我发现50像素高度的结果最佳。
  • 必须裁剪图像,使得只有一行文本。
  • 图像应为黑白色。
  • 图像应从左到右相对平坦。
我一直在使用七段训练数据'letsgodigital'。以下是我迄今为止所做的图像操作代码:
  ret, i = video.read()
  h,width,channels = i.shape #get dimensions

  g = cv2.cvtColor(i,cv2.COLOR_BGR2GRAY)
  histeq=cv2.equalizeHist(g) #spreads pixel values across entire spectrum
  _,t = cv2.threshold(histeq,150,225,cv2.THRESH_BINARY) #thresholds histeq

  cropped = t[int(0.4*h):int(.6*h), int(0.1*width):int(0.9*width)]
  rotated = imutils.rotate_bound(cropped, angle)
  resized = imutils.resize(rotated,height=resizing_height)

一些数字比其他数字更好用 - 例如,“1”似乎有很多问题。在“+”或“-”后出现的数字经常不显示,而“+”经常显示为“-”。我已经尝试过调整阈值数值。最后三个部分是因为我使用的视频样本略微偏斜。我可以尝试采集更好的数据并制作自己的训练数据。但我感觉自己并没有以最佳方式进行图像处理,并希望得到一些指导。 我计划使用一定程度的边缘检测来自动裁剪显示屏,但现在我只是尝试保持简单并手动获得想要的结果。 我已在https://imgur.com/a/vnqgP上上传了应用各种程度图像处理的示例图像。这很困难,因为有时从tesseract获得完全正确的答案,而其他时候则一无所获。然而,摄像机或光线水平并没有真正改变,这使我认为这是我的训练数据的问题。非常感谢任何建议或指导!谢谢

1
我绝不是一个专家(只在我的一个项目中使用过tesseract-ocr),但根据我的经验,tesseract可以轻松处理像你的文本这样的内容。我曾让它读取结构化背景上的不寻常字体,结果仍然合理。这就是为什么我认为你的图像完全没问题,你应该专注于获取更好的训练数据。 - Aran-Fey
1个回答

1

我尝试过ssocr,但它无法正确识别小数点、加号或减号,并试图将它们转换为数字。自那以后,我的处理能力有了很大提高,我也尝试过自己训练tesseract,但效果不太好。这是一些我处理过的图像示例:http://imgur.com/a/50ixg由于最近没有时间继续开展这个项目,我想下一步可能是看看是否可以填补段之间的空白。或者更好地训练tesseract。你有什么想法吗? - bhenders
填补段落空缺是个好主意。我找到了一个很好的资源,它可以完全做到这一点,并提供自己的逻辑来识别数字,无需使用tesseract或ssocr。 http://www.pyimagesearch.com/2017/02/13/recognizing-digits-with-opencv-and-python/#comment-429721 尽管如此,您可能仍然希望在预处理图像上运行tesseract以检测小数点、加号和减号符号。 - Dwait Bhatt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接