2011-07-18 31 views
9

我试图训练tesseract以识别燃气表的真实图像中的数字。训练Tesseract 3识别燃气表的实际图像中的数字

我用于训练的图像是用相机制作的,因此存在很多问题:由于曝光过度,反射,阴影等原因,图像分辨率差,图像模糊,照明不良或对比度低。 ..

为了进行培训,我创建了一个大图像,其中包含燃气表图像捕获的一系列数字,我手动编辑了文件框以创建.tr文件。结果是只有清晰和清晰图像的数字被识别,而模糊图像的数字未被tesseract捕获。

+0

你能张贴一个示例图片吗? –

回答

1

我先试试这个简单的ImageMagick命令:

convert   \ 
    original.jpg \ 
    -threshold 50% \ 
    result.jpg 

(玩了一下与50%参数 - 尝试用更小,更高的价值......)

阈值基本上留下了只有2值,零或最大值,为每个颜色通道。低于阈值的值被设置为0,高于阈值的值被设置为255(或者如果工作在16位深度,则为65535)。

根据您的original.jpg,您可能会有OCR功能,工作效果非常好的对比度图像。

2

据我可以告诉你需要OpenCV识别数字所在的盒子,但OpenCV不是OCR的上帝。在找到盒子后,只需裁剪该部分,进行图像处理,然后将其交给tesseract进行OCR。

我需要OpenCV帮助,因为我不知道如何在OpenCV中编程。

这里有几个真实世界的例子。

  • 第一张图片是原始图像(croped功率计的数字)
  • 第二图像稍微清理图像在GIMP,大约50%的OCR准确性正方体
  • 第三图像完全清除后图像 - 100%OCR没有任何培训的认可!

first image second image third image

1

我建议你:

  • 使用工具来编辑框,这样jTessBoxEditor,它是如此乐于助人,让你赢得了时间。你可以很容易地从here
  • 安装它是训练实际情况(嘈杂,模糊)的信件是个好主意。您的训练集仍然有限,您可以添加更多训练样本。
  • 我建议你自己使用Tesseract的API来增强图像(去噪,标准化,锐化...) 例如:Boxa * tesseract::TessBaseAPI::GetConnectedComponents(Pixa** pixa)(它允许您获取每个字符的边界框)

    Pix * pimg = tess_api-> GetThresholdedImage();

Here你找到一些例子

+0

链接中的这些示例与“GetComponentImages”有关。你能给我一个如何使用'GetConnectedComponents'的例子吗? – yode

1

正方体是一个相当不错的OCR包,但不正确预先处理的图像。我的经验是,如果您在将其传递到tesseract之前进行一些预处理,您可以获得良好的OCR结果。

有一对夫妇的显著提高识别关键指针:

  1. 去除背景噪声。基本上这意味着使用平均自适应阈值。我还要确保角色是黑色的,背景是白色的。
  2. 使用正确的分辨率。如果结果不好,请将图像向上或向下缩放,直至获得良好效果。你想瞄准约。字体大小14在300 dpi;在我的软件中处理最有效的发票。
  3. 不要将图像存储为JPEG;使用BMP或PNG或其他不会使图像嘈杂的其他内容。
  4. 如果您只使用一种或两种字体,请尝试在这些字体上训练tesseract。

至于第4点,如果您知道将要使用的字体,有比使用Tesseract更好的解决方案,例如直接在图像上匹配这些字体......基本算法是找到数字和将它们匹配到所有可能的字符(它们只有10个)......但实现起来很棘手。