我正在尝试训练 tesseract 从燃气表的真实图像中识别数字。
我用于训练的图像是用相机拍摄的,因此存在很多问题:图像分辨率差、图像模糊、光线不足或由于过度曝光、反射、阴影等导致的低对比度......
为了训练,我创建了一个大图像,其中包含由燃气表图像捕获的一系列数字,我手动编辑了文件框以创建 .tr 文件。结果是只有更清晰和更清晰的图像的数字被识别,而模糊图像的数字未被 tesseract 捕获。
据我所知,您需要 OpenCV 来识别数字所在的框,但 OpenCV 不是 OCR 的神。找到盒子后,只需裁剪该部分,进行图像处理,然后将其交给 tesseract 进行 OCR。
我需要有关 OpenCV 的帮助,因为我不知道如何在 OpenCV 中编程。
这里有几个真实世界的例子。
我建议你:
我建议您自己使用 Tesseract 的 API 来增强图像(去噪、归一化、锐化...),例如:(Boxa * tesseract::TessBaseAPI::GetConnectedComponents(Pixa** pixa)
它允许您访问每个字符的边界框)
Pix* pimg = tess_api->GetThresholdedImage();
在这里你可以找到几个例子
我会先尝试这个简单的 ImageMagick 命令:
convert \
original.jpg \
-threshold 50% \
result.jpg
(玩一点50%
参数 - 尝试使用更小和更高的值......)
阈值基本上只为每个颜色通道留下 2 个值,零或最大值。低于阈值的值设置为 0,高于阈值的值设置为 255(如果工作在 16 位深度,则设置为 65535)。
根据您的 original.jpg,您可能会得到一个支持 OCR 的、工作的、对比度非常高的图像。
Tesseract 是一个相当不错的 OCR 包,但不能正确预处理图像。我的经验是,如果您在将其传递给 tesseract 之前进行一些预处理,您可以获得良好的 OCR 结果。
有几个关键点可以显着提高识别率:
至于第 4 点,如果您知道要使用的字体,有一些比使用 Tesseract 更好的解决方案,例如直接在图像上匹配这些字体......基本算法是找到数字并将它们与所有可能的字符匹配(只有 10 个)......仍然,实施很棘手。