使用 OpenCV 为 Tesseract OCR 预处理七段图像

Posted

技术标签:

【中文标题】使用 OpenCV 为 Tesseract OCR 预处理七段图像【英文标题】:Preprocessing seven segment image for Tesseract OCR using OpenCV 【发布时间】:2017-09-21 17:45:11 【问题描述】:

我正在尝试开发一个系统,可以将旧模拟压力输出系统上的七段显示转换为文本,以便 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”似乎有很多麻烦。出现在“+”或“-”之后的数字通常不显示,而“+”通常显示为“-”。我也玩过一些阈值。

最后三个部分是因为我从中提取的视频样本有点歪斜。我可以尝试使用一些更好的数据来处理,也可以尝试在标准的“letsgodigital”语言上制作自己的训练数据。我觉得我没有以最好的方式进行图像处理,并且希望得到一些指导。

我计划使用某种程度的边缘检测来自动裁剪到显示器,但现在我只是尽量保持简单并手动获得我想要的结果。我已经在http://imgur.com/a/vnqgP 上传了具有不同程度图像处理的示例图像。这很困难,因为有时我会从 tesseract 得到确切的正确答案,而其他时候却一无所获。相机或光照水平并没有真正改变,这让我认为这是我的训练数据的问题。任何关于我应该去哪里的建议或方向将不胜感激!谢谢

【问题讨论】:

我绝不是专家(只在我的一个项目中使用过 tesseract-ocr),但根据我的经验,tesseract 可以很容易地处理像你这样的文本。我已经让它在结构化背景上读取不寻常的字体,结果仍然是合理的。这就是为什么我认为您的图像非常好,您可能应该专注于获得更好的训练数据。 【参考方案1】:

对于读取七个段位数字,像 tesseract 这样的普通 OCR 程序通常不能很好地工作,因为各个段之间存在空间。您应该尝试 ssocr,它是专门为读取七个段位而设计的。但是,您的预处理需要更好,因为 ssocr 期望输入是一行七段数字。

参考资料 - https://www.unix-ag.uni-kl.de/~auerswal/ssocr/

使用示例 - http://www.instructables.com/id/Raspberry-Pi-Reading-7-Segment-Displays/

【讨论】:

我已经尝试过 ssocr,但它无法拾取小数点、加号或减号,而是尝试将它们转换为数字。从那以后,我的处理能力得到了很大的改善,并亲自研究了 tesseract 的训练,但效果不佳。以下是我处理过的图像的一些示例:http://imgur.com/a/50ixg 从那以后我没有时间从事这个项目,但我想我的下一步可能是看看我是否能以某种方式填补各个部分之间的空白。那,或者更好地训练 tesseract。有什么想法吗? 填补细分空白是个好主意。我找到了一个很好的资源,它可以做到这一点,并且还提供了自己的逻辑来识别数字,消除了对 tesseract 或 ssocr 的需要。 pyimagesearch.com/2017/02/13/…尽管如此,您可能仍想在预处理后的图像上运行 tesseract 以检测小数点、加号和减号。

以上是关于使用 OpenCV 为 Tesseract OCR 预处理七段图像的主要内容,如果未能解决你的问题,请参考以下文章

进行 OCR 之前的预处理(tesseract、OpenCV)

文本的检测识别实战:使用 Tesseract 进行 OpenCV OCR 和文本识别

Python+OpenCV+Tesseract实现OCR字符识别

Tesseract OCR的Opencv图像转换

python 使用Python,OpenCV和Tesseract OCR引擎使用10行代码绕过Captcha

如何使用 openCV 或 OCR tesseract 从图像中提取文本? [复制]