9

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

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

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

4

4 回答 4

2

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

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

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

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

第一张图片 第二张图片 第三张图片

于 2013-11-05T11:52:37.903 回答
1

我建议你:

  • 使用工具来编辑框,例如jTessBoxEditor,它非常有帮助,让您赢得时间。您可以从这里轻松安装
  • 训练实际情况(嘈杂,模糊)的字母是个好主意。您的训练集仍然有限,您可以添加更多训练样本。
  • 我建议您自己使用 Tesseract 的 API 来增强图像(去噪、归一化、锐化...),例如:(Boxa * tesseract::TessBaseAPI::GetConnectedComponents(Pixa** pixa)它允许您访问每个字符的边界框)

    Pix* pimg = tess_api->GetThresholdedImage();

在这里你可以找到几个例子

于 2014-01-10T17:12:59.480 回答
1

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

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

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

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

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

于 2012-08-19T18:30:42.050 回答
1

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

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

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

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

于 2014-07-18T09:31:04.670 回答