camscanner(扫描全能王)功能解析与复现 - 页面矫正

朋友邀我协作一个免费简易扫描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版的给大家试试。

如果路过的你有更好的思路,欢迎留言!

猜你喜欢

转载自www.cnblogs.com/cvdream/p/12571134.html