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

10

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

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

为了进行训练,我创建了一个大图像,其中包含燃气表图像中的一系列数字,并手动编辑 box 文件以创建 .tr 文件。结果是,只有更清晰和更锐利的图像中的数字被 Tesseract 识别,而模糊图像中的数字则无法被捕捉。

4个回答

2
据我所知,您需要使用OpenCV来识别数字所在的框,但是OpenCV不适用于OCR。定位到框后,只需裁剪该部分,进行图像处理,然后将其交给tesseract进行OCR。
我需要OpenCV方面的帮助,因为我不知道如何在OpenCV中编程。
以下是一些实际示例。
第一张图片是原始图片(裁剪的电表数字)。
第二张图片是在GIMP中稍微清理过的图片,在tesseract中的OCR准确率约为50%。
第三张图片是完全清理的图片- 100%的OCR识别率,无需任何训练!
请见上方的图片。

1
我会先尝试这个简单的ImageMagick命令:
 convert          \
    original.jpg  \
   -threshold 50% \
    result.jpg

(尝试使用较小和较高的值玩弄50%参数...)

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

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


1
我建议您:
  • 使用工具编辑框,例如 jTessBoxEditor ,它非常有帮助,可节省时间。您可以从 此处 轻松安装它。
  • 训练实际情况下的字母(嘈杂,模糊)是个好主意。您的训练集仍然有限,可以添加更多的训练样本。
  • 我建议您使用 Tesseract 的 API 来增强图像(去噪、归一化、锐化等)

    例如:Boxa * tesseract::TessBaseAPI::GetConnectedComponents(Pixa** pixa) (它允许您获取每个字符的边界框)

    Pix* pimg = tess_api->GetThresholdedImage();

在这里 您会找到一些示例。


你链接中的示例是关于GetComponentImages的。你能给我一个使用GetConnectedComponents的例子吗? - yode

1
Tesseract是一个相当不错的OCR软件包,但它不能正确地预处理图像。我的经验是,如果在将其传递给Tesseract之前进行一些预处理,您可以获得良好的OCR结果。
有几个关键指针可以显着提高识别率:
1. 去除背景噪声。基本上,这意味着使用平均自适应阈值。我还会确保字符为黑色,背景为白色。 2. 使用正确的分辨率。如果结果不佳,请缩放图像直到获得良好的结果。您希望以大约14号字体为目标,分辨率为300 dpi;在处理发票的软件中,这效果最佳。 3. 不要将图像存储为JPEG;使用BMP或PNG或其他不会使图像嘈杂的格式。 4. 如果仅使用一两种字体,请尝试在这些字体上训练Tesseract。
至于第四点,如果您知道要使用的字体,则有一些比使用Tesseract更好的解决方案,例如直接在图像上匹配这些字体...基本算法是找到数字并将其与所有可能的字符(仅为10个)匹配...但实现起来很棘手。

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