朋友邀我协作一个免费简易扫描APP,于是这几天把页面矫正提上来思考。整理一些心得,以此录之,填充下这块被我冷落到凋零的园区(希望后面能勤快点)。
不少blog给出边缘+hough,可以解决部分情况。就通用性而言,有很多细节需要考虑:
- 比如页面里本身就自带很多线,或者背景本身有线干扰
- 比如页面本身不完整,不完全存在4边
-比如页面有弧度,hough下直线响应不明显
我的思路(有借鉴,基本原创,如雷同了,真不是抄的):
- 输入图像(来自网上,如有不妥请留言,我尽快更换掉;选这个,主要想看线条复杂,边界不是很明晰的测试,前处理灰度化了)
- 边缘与线段分割:我选用 Edge Drawing / Edge Line (也可以利用canny + hough给出)
亮绿为边缘,暗绿+红色端点为线段,我控制线段比较严格,线段比较碎,所以我加了后面的合并步骤
- 把夹角小于设定值且端点距离相近的线合并 (同时给出每条线的响应值:梯度值越高得分也高,线越长也有相应加成)
把长度很短的去掉
- 通过提取的线,由响应值排序,获取前面N条线(我自己 N = 16,也就是最多保留N条),为了通用性,把输入图像的4个边,分配一个小的响应值,也加入到候选线集(N = 20 最多情况)
- 设计候选矩形框评估函数准则 (给定任意4个直线方程):
*通过相邻直线夹角最大为原则,进行排列(预处理)
*组合四边形4个角越接近90度,得分越高
*把非凸的四边形去掉
*把面积小于页面某个设定值的去掉(我设了 0.2 * W * H)
*线段(前面提取的线段)对应计算边(2直线计算所得)重叠率越高,得分有加成
*宽高比越接近0.707,得分有轻微加成
*越满足平行四边形,得分有轻微加成
*4个线段响应值越高,得分越高
- 通过上述准则,暴力【(N-4)*(N-5)*(N-6)*(N-7) 最多这么多个矩形组合】检索,获得最佳的4条线,输出角点,并对角点按形变最小原则进行顺时针排序, 主要是些几何运算,其实速度很快
中间一些组合框示意
最高得分
- 几何校正与增强
刚编了.so。等我不懒的时候,弄个win版的给大家试试。
如果路过的你有更好的思路,欢迎留言!
原文地址:https://www.cnblogs.com/cvdream/p/12571134.html