对之前一段时间做 OCR 的总结。

如果想提高的识别效果,可以从以下几个方面入手。

调整光源和相机

  • 如果光源是可控的,尽可能调整好亮度和光照角度
  • 相机的自动增益可能会导致整体太亮,如果使用了增益,建议手动调整到合适的数值

调整图片的亮度

  • 考察所有图片的亮度,评估一个参考范围, 程序自动调整过暗或过亮的图片
  • Gamma 变换,提升暗部细节
  • 亮度均衡,让整幅图像亮度比较均衡。 一般的亮度均衡可能没有很好的效果,可以考察不同的算法。

提取识别的目标

如果要识别的目标只是大图的一部分,首先可以提取出目标,输入的图像更小,这样可以加快识别的速度。

怎么提取目标?

  • 边缘检测 尝试各种边缘提取算法,看哪种效果更好。 可以压缩图像大小,加快处理速度,可能我们并不需要那么精确的边缘。

  • HED 神经网络边缘检测 具体来说就是要训练 HED 神经网络,更好的做边缘检测,然后拟合直线,找到顶点,判断形状。

  • OpenCV模板匹配 OpenCV模板匹配对被识别的对象要求比较高,有形变或者变化较大无法做匹配。

  • 形状匹配 形状匹配见https://github.com/meiqua/shape_based_matching。简单的说就是梯度比边缘更稳定,不受光照和颜色变化的影响。不同尺度下,在梯度边缘上提取一些比较稳定的特征点做匹配。同样,形变较大无法做匹配。

  • Yolo等深度学习 标注目标,训练模型,识别目标。一般不用特别的精确。

使文字更清晰

  • 锐化可以强化文字的清晰度,但是同时也会提高干扰对象的清晰度,有可能让本来可以识别的不能被识别。
  • 提取文字轮廓和原图做融合

提取出文字行

提取出文字行可以减少非文本区域的干扰。要注意的是文字行需要留边,否则可能降低识别的效果,因为背景信息太少了,不利于整体去除背景的干扰。

合并文字行

可以将提取到的文字行合并到一起,进行识别。理由同上,有利于整体去除背景的干扰。

对要识别的字体训练

通用性比较好的模型可能误识别比例比较高,对要识别的字体做专门的训练。

对误识别的图片做训练

标记出每个字符,对其做针对性训练。

容错处理

最后,如果还是有误识别,进行容错处理。