一、背景
面对订单数据纸质文件或图片,仅靠人眼识别的话效率很低,需引入机器学习来识别和解析图片以提高效率。当前市面上已有收费的图片识别服务,包括阿里、百度等,识别效果较好,但针对订单类图片,不仅要关注图片上的文字,还要关注文字所在的行列,来分出每条数据和数据详细字段。
本文主要介绍一种针对订单类图片识别结果进行行列解析的抽象流程和方案,帮助提高开发效率。
注:本文只提供思路,不提供源码。另外,本文不介绍人工智能图片识别,感兴趣的同学可以上网查询相关资料。
二、解析流程
对于图像处理,opencv算是比较优秀的工具,因此将其选做本文图像处理首选软件。
- 为了使图片识别率更高,需要先做图片矫正,这里采用较为简单的霍夫变换加去噪声点算法矫正图片。
- 图片矫正后,调用图片识别服务获取结果,一般结果格式包括响应码、错误描述、文字块列表(文字和四点坐标)等。
- 然后使用抽象的俄罗斯方块法根据识别结果获取行列信息。
- 最后根据行列信息组装每一行数据并显示。
三、细节处理
3.1 opencv安装概要
opencv安装,本文只做简单提示,不展开介绍,以后有时间单独发文。
1)windows
- 下载编译好的包,https://opencv.org/releases/
- 解压缩到自定义文件夹。
2)linux
- 推荐使用ubuntu,并且最好是全新的系统,因为opencv会依赖很多包,对版本要求也高,解决冲突会很麻烦。
- 下载源码
- 安装依赖包
- 编译安装
我们使用java调用opencv,这里需要安装获取到开发包,windows为opencv_javaxxx.dll,linux为libopencv_javaxxx.so,程序初始化时需要加载到jvm。详细代码如下:
System.load(PropertieUtil.getPropertie("这里是dll或so的完整路径");
3.2 图片矫正
3.2.1 矫正探索
图片矫正探索之路较为艰辛,起初我们想了一个比较简单的方案:
- 先调用图片识别服务,获取到结果。
- 然后根据每一个字块的四角坐标判断出每个字块的倾斜角。
- 再根据去燥算法算出平均的倾斜角。
理论上这个方案是可行的,但实践证明我们错了,因为图片识别服务返回的坐标图片不准确,多数图片算出的结果都是错误的。
经查发现霍夫变换有可能解决这个问题,于是开始尝试学习霍夫变换和去燥算法,最终发现可行,并抽象出公共方法,仅需简单配置一些参数就能完成矫正。
图片矫正分为两步:
- 第一步:正反矫正,判断图片倾斜角度是90°、180°、270°、0°,这个通过数学方法是无法判断的,需要引用机器学习。
- 第二步:角度微调,一般为确定图片是正的,且倾斜角度在+-30°左右。
需要注意的是,上面说的办法不可能通过一套参数来对所有图片进行微调,但线上数据证明,针对一类图片,一套参数基本能让大多数图片都矫正正确。
3.2.2 霍夫变换概要
霍夫变换是数学界经典空间变换算法,用于检测直线,通过大量检测到的直线的斜率就能计算出图片倾斜角度。先进行二值化和边缘检测再进行霍夫变换效果更佳,详细算法内容请自行搜索,本文不展开。
3.2.3 去噪声点算法
基本公式:
上限=均值+n*标准差
下限=均值-n*标准差
其中n取值一般为1-4,数值越大表示筛选率越高。
最后再将符合的数据求均值。
核心代码如下:
/** * 利用标准差筛选 * @param values * @return */ private static double[] calcBestCornList(double[] values) { // 计算标准差 StandardDeviation variance = new StandardDeviation(); double evaluate = variance.evaluate(values); Mean mean = new Mean(); double meanValue = mean.evaluate(values); double biggerValue = meanValue + CHOOSE_POWER * evaluat