畸变图像自动校正算法的研究

  • 背景
  • 图像预处理
  • 1.图片角度校正
  • 2.文本自动分页
  • 图片畸变校正
  • 1.把页面处理成上下等宽
  • 2利用圆柱面对图片进行展开
  • 3效果展示
  • 改进方案


背景

这是我做的毕业设计(本科,勿喷),在这里分享主要是为了让后面也选这方面题目的同学一点经验。

另外,本文处理的畸变图像是指的书本产生的畸变,比如书本弯曲导致的文字的弯曲,还有书本的角度自动校正。写的时候是用python-opencv写的。没有贴代码,但是会说用了什么函数。

图像畸变矫正Python代码 图像畸变矫正算法实现_计算机视觉

图像预处理

1.图片角度校正

角度校正顾名思义,就是把拍歪的照片转正。具体的思路就是

1、识别出书本的轮廓 findContours(),

2、得到轮廓的最小外接矩形 minAreaRect(),此时呢矩形的旋转角度大致等于书本的旋转角度,然后根据这个角度把图片旋转。

图像畸变矫正Python代码 图像畸变矫正算法实现_python_02


效果如下:a.原图 b.识别出的轮廓填充图 c.轮廓的外接矩形 d.旋转角度后图片

图像畸变矫正Python代码 图像畸变矫正算法实现_cv_03

图像畸变矫正Python代码 图像畸变矫正算法实现_图像畸变矫正Python代码_04

图像畸变矫正Python代码 图像畸变矫正算法实现_python_05

图像畸变矫正Python代码 图像畸变矫正算法实现_cv_06

2.文本自动分页

自动分页的想法也很简单,就是找出书本的6个角嘛,然后中间两个角就是分界线。

处理的时候还是先获得图片轮廓,轮廓就是一堆离散连续的点,然后用向量夹角公式判断当前的点是不是一个可能的角点,可能的角点是很多的。然后我的做法是利用角点的聚集度,还有到一些关键位置的距离,来判断是不是要找的点。

另外呢,我把找出的中间的两个角点连成直线,然后根据直线再次对图片角度进行校正,让中间的线垂直。

图像畸变矫正Python代码 图像畸变矫正算法实现_图像畸变矫正Python代码_07


分页的效果如下:

图像畸变矫正Python代码 图像畸变矫正算法实现_图像畸变矫正Python代码_08

图像畸变矫正Python代码 图像畸变矫正算法实现_图像畸变矫正Python代码_09

图片畸变校正

1.把页面处理成上下等宽

这一步的操作是为了后面把页面当成一个广义圆柱面来处理。具体的做法是根据页面的四个角点,把这四个角点经过透视变化直接给处理成上下等宽的。透视变换的函数也是opencv里的,现成。主要知道变化前后的四个点,就能把图片进行变换。另外这一步的变换给我的直觉就是把书本用手展平了一点,应该也是能校正畸变的。

a.原页面 b.等宽处理之后

图像畸变矫正Python代码 图像畸变矫正算法实现_cv_10

图像畸变矫正Python代码 图像畸变矫正算法实现_图像畸变矫正Python代码_11

2利用圆柱面对图片进行展开

思路:就是圆柱面相当于一个矩形卷起来了,那把圆柱面切割成小的矩形,再拼接起来就能得到展平的图像(圆割术求周长)。

1.分割图片,我的做法是直接把刚刚等宽处理过的图片均匀垂直分割成长条的cell。

图像畸变矫正Python代码 图像畸变矫正算法实现_角点_12


2. 计算出cell的实际大小。图片产生畸变其实主要是由于透视原理(远小近大),那我们要消除畸变,就要把看起来小的cell,恢复到它的实际大小,这样子那些小的字,也会恢复正常。

如果把单独的一个cell取出来放大,可能是下面的样子,实线部分是它的实际大小,而灰色的呢,则是它被旋转了一个角度之后我们的眼睛看到的样子,也就是目前得到的cell。

图像畸变矫正Python代码 图像畸变矫正算法实现_计算机视觉_13


数学问题我也不多讨论,反正都可以四舍五入。这里我将cell拉伸成矩形,没有考虑cell的奇奇怪怪的倾斜角度,一切都可以简化。于是呢newCell的高度是确定的,就是ymax。newCell的宽度我用的下面的柿子。其中的k是相机(成像平面)到cell的距离除以书本的长度,我把它简化成常量1.3;

图像畸变矫正Python代码 图像畸变矫正算法实现_python_14


于是呢旧cell的四个点,newCell的4个点都能得到,这时候又是透视变换把cell拉伸。

拉伸后每个cell是一个矩形,再把所有的cell拉伸成同一高度,再拼接就能得到校正后的图片。

3效果展示

a.畸变图片 b.校正效果

图像畸变矫正Python代码 图像畸变矫正算法实现_cv_15

图像畸变矫正Python代码 图像畸变矫正算法实现_计算机视觉_16


a.畸变图片 b.校正效果

图像畸变矫正Python代码 图像畸变矫正算法实现_python_17

图像畸变矫正Python代码 图像畸变矫正算法实现_python_18


a.畸变图片 b.校正页面1 c.校正页面2

(这张图片经过了提高了对比度之后才进行校正)

图像畸变矫正Python代码 图像畸变矫正算法实现_cv_19


图像畸变矫正Python代码 图像畸变矫正算法实现_角点_20

图像畸变矫正Python代码 图像畸变矫正算法实现_角点_21

改进方案

因为是把图片分割之后再拼接,拼接的地方就可能产生断层。was和the。

图像畸变矫正Python代码 图像畸变矫正算法实现_python_22


为了消除这种断层,我才用的方法是把原图像的单词作为一个cell,校正之后覆盖到的单词里。1.先找出单词的轮廓。具体是边缘识别膨胀再边缘识别,最小外接矩形,反正就这些。下面的红框是识别到的单词。

图像畸变矫正Python代码 图像畸变矫正算法实现_python_23


2.之后呢,把上面的单词的四个角点,计算出他们经过校正之后对应的四个角点,再把这个单词透视变换过去。再对3得到的图片进行单词覆盖。

图像畸变矫正Python代码 图像畸变矫正算法实现_python_24