图片角度不对,需要做校正,校正后ocr识别准确率更高,网上找了一圈,暂时没发现怎么计算图片旋转角度的资料。
首先就是查找怎么做图片旋转,找到2篇文章,4 Point OpenCV getPerspective Transform Example 和 使用 OpenCV 和 Python 对图片进行旋转。第一篇的方法,是先要确定4个角的顶点,要是能确定就轻松多了,放弃。第二篇的方法,就是需要传入旋转角度。
之后就是想怎么计算需要旋转的角度。调查过程中,发现了霍夫变换这个东西,抓住了一点点灵感,灵机一动。这个东西不是可以画一堆的线,有了线,角度很好算,三角函数,tan(角度)=高/长,弧度=角度*180/π。之后继续调查,HoughLines得到的是线的长度和弧度,HoughLinesP得到的是2个点的坐标,于是选定了HoughLines这个方法。
做霍夫变换,模糊这一步的操作是很有必要的,没做模糊,少的都要检测出1900多组的数据,经过一定模糊之后,得到的数据就少多了。那么怎么在检测出来的线里,获取我们需要的角度?需要处理的图是矩形(长方形)的,虽然有一些干扰,最后角度计算对了,还是能调整成比较平整的矩形的。获取到的直线有几十组,经过一些样例图片测试,不能取第一条线,也不能取最后一条线,怎么设计比较好?
把数据按区间分组。这里分组的算法是自己想的,没啥理论依据,就是拍脑袋决定了(数学不够好)。思路:按照弧度分组,0-45, 45-90, 90-135,135-180。为啥只到180?因为多次测试没看到大于180的数据,没看霍夫变换具体的算法,暂时就这么用了。分组之后,怎么选出一个需要的弧度?利用方差,算出分组里方差最小的一组数据,取平均值。之后就用这个平均值当做旋转弧度,有了弧度,第二篇帖子里的旋转参数稍微改一下,传入弧度就可以了。最后一个小细节问题,得到不同的旋转弧度,怎么旋转才是符合我们实际需要的,比如图片是垂直的,怎么转平了,这个的解决办法都是用经验转换,不一定通用,可以根据实际需要再调整。下面上代码,就不贴图了。
# -*- coding: utf-8 -*-
import cv2