关于OCR
对之前一段时间做 OCR 的总结。
如果想提高的识别效果,可以从以下几个方面入手。
调整光源和相机
- 如果光源是可控的,尽可能调整好亮度和光照角度
- 相机的自动增益可能会导致整体太亮,如果使用了增益,建议手动调整到合适的数值
调整图片的亮度
- 考察所有图片的亮度,评估一个参考范围, 程序自动调整过暗或过亮的图片
- Gamma 变换,提升暗部细节
- 亮度均衡,让整幅图像亮度比较均衡。 一般的亮度均衡可能没有很好的效果,可以考察不同的算法。
提取识别的目标
如果要识别的目标只是大图的一部分,首先可以提取出目标,输入的图像更小,这样可以加快识别的速度。
怎么提取目标?
-
边缘检测 尝试各种边缘提取算法,看哪种效果更好。 可以压缩图像大小,加快处理速度,可能我们并不需要那么精确的边缘。
-
HED 神经网络边缘检测 具体来说就是要训练 HED 神经网络,更好的做边缘检测,然后拟合直线,找到顶点,判断形状。
-
OpenCV
模板匹配OpenCV
模板匹配对被识别的对象要求比较高,有形变或者变化较大无法做匹配。 -
形状匹配 形状匹配见
https://github.com/meiqua/shape_based_matching
。简单的说就是梯度比边缘更稳定,不受光照和颜色变化的影响。不同尺度下,在梯度边缘上提取一些比较稳定的特征点做匹配。同样,形变较大无法做匹配。 -
Yolo等深度学习 标注目标,训练模型,识别目标。一般不用特别的精确。
使文字更清晰
- 锐化可以强化文字的清晰度,但是同时也会提高干扰对象的清晰度,有可能让本来可以识别的不能被识别。
- 提取文字轮廓和原图做融合
提取出文字行
提取出文字行可以减少非文本区域的干扰。要注意的是文字行需要留边,否则可能降低识别的效果,因为背景信息太少了,不利于整体去除背景的干扰。
合并文字行
可以将提取到的文字行合并到一起,进行识别。理由同上,有利于整体去除背景的干扰。
对要识别的字体训练
通用性比较好的模型可能误识别比例比较高,对要识别的字体做专门的训练。
对误识别的图片做训练
标记出每个字符,对其做针对性训练。
容错处理
最后,如果还是有误识别,进行容错处理。