训练 Tesseract 3 从燃气表的真实图像中识别数字

Posted

技术标签:

【中文标题】训练 Tesseract 3 从燃气表的真实图像中识别数字【英文标题】:Training Tesseract 3 to recognize numbers from real images of gas meters 【发布时间】:2011-10-07 16:37:06 【问题描述】:

我正在尝试训练 tesseract 从燃气表的真实图像中识别数字。

我用于训练的图像是用相机拍摄的,因此存在很多问题:图像分辨率差、图像模糊、光线不足或由于过度曝光、反射、阴影等导致的低对比度。 .

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

【问题讨论】:

【参考方案1】:

据我所知,您需要 OpenCV 来识别数字所在的框,但 OpenCV 不是 OCR 的神。找到框后,只需裁剪该部分,进行图像处理,然后将其交给 tesseract 进行 OCR。

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

这里有几个真实的例子。

第一张图片是原始图片(裁剪后的功率计编号) 第二张图片在 GIMP 中经过略微清理,在 tesseract 中的 OCR 准确率约为 50% 第三张图像是完全清洁的图像 - 100% OCR 识别,无需任何培训!

【讨论】:

【参考方案2】:

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

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

(使用50% 参数试一试——尝试使用更小和更高的值...)

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

根据您的 original.jpg,您可能会得到一个支持 OCR、工作的、对比度非常高的图像。

【讨论】:

【参考方案3】:

我建议你:

使用工具编辑框,例如jTessBoxEditor,它很有帮助,让您赢得一次。您可以从here 轻松安装它 训练实际情况(嘈杂、模糊)的字母是个好主意。您的训练集仍然有限,您可以添加更多训练样本。

我建议您自己使用 Tesseract 的 API 来增强图像(去噪、归一化、锐化...) 例如:Boxa * tesseract::TessBaseAPI::GetConnectedComponents(Pixa** pixa)(它允许您到达每个字符的边界框)

Pix* pimg = tess_api->GetThresholdedImage();

Here你找几个例子

【讨论】:

链接中的示例是关于GetComponentImages。能否举个例子说明如何使用GetConnectedComponents【参考方案4】:

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

有几个关键点可以显着提高识别率:

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

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

【讨论】:

以上是关于训练 Tesseract 3 从燃气表的真实图像中识别数字的主要内容,如果未能解决你的问题,请参考以下文章

tesseract 安装与训练(图像识别)

图像识别—基于样本训练的tesseract

如何训练 tesseract 识别低 DPI 下的小数字?

可以为非字体符号训练 tesseract 吗?

Tesseract训练

训练 tesseract 3 以获取字母表