畸变图像自动校正算法的研究
- 背景
- 图像预处理
- 1.图片角度校正
- 2.文本自动分页
- 图片畸变校正
- 1.把页面处理成上下等宽
- 2利用圆柱面对图片进行展开
- 3效果展示
- 改进方案
背景
这是我做的毕业设计(本科,勿喷),在这里分享主要是为了让后面也选这方面题目的同学一点经验。
另外,本文处理的畸变图像是指的书本产生的畸变,比如书本弯曲导致的文字的弯曲,还有书本的角度自动校正。写的时候是用python-opencv写的。没有贴代码,但是会说用了什么函数。
图像预处理
1.图片角度校正
角度校正顾名思义,就是把拍歪的照片转正。具体的思路就是
1、识别出书本的轮廓 findContours(),
2、得到轮廓的最小外接矩形 minAreaRect(),此时呢矩形的旋转角度大致等于书本的旋转角度,然后根据这个角度把图片旋转。
效果如下:a.原图 b.识别出的轮廓填充图 c.轮廓的外接矩形 d.旋转角度后图片
2.文本自动分页
自动分页的想法也很简单,就是找出书本的6个角嘛,然后中间两个角就是分界线。
处理的时候还是先获得图片轮廓,轮廓就是一堆离散连续的点,然后用向量夹角公式判断当前的点是不是一个可能的角点,可能的角点是很多的。然后我的做法是利用角点的聚集度,还有到一些关键位置的距离,来判断是不是要找的点。
另外呢,我把找出的中间的两个角点连成直线,然后根据直线再次对图片角度进行校正,让中间的线垂直。
分页的效果如下:
图片畸变校正
1.把页面处理成上下等宽
这一步的操作是为了后面把页面当成一个广义圆柱面来处理。具体的做法是根据页面的四个角点,把这四个角点经过透视变化直接给处理成上下等宽的。透视变换的函数也是opencv里的,现成。主要知道变化前后的四个点,就能把图片进行变换。另外这一步的变换给我的直觉就是把书本用手展平了一点,应该也是能校正畸变的。
a.原页面 b.等宽处理之后
2利用圆柱面对图片进行展开
思路:就是圆柱面相当于一个矩形卷起来了,那把圆柱面切割成小的矩形,再拼接起来就能得到展平的图像(圆割术求周长)。
1.分割图片,我的做法是直接把刚刚等宽处理过的图片均匀垂直分割成长条的cell。
2. 计算出cell的实际大小。图片产生畸变其实主要是由于透视原理(远小近大),那我们要消除畸变,就要把看起来小的cell,恢复到它的实际大小,这样子那些小的字,也会恢复正常。
如果把单独的一个cell取出来放大,可能是下面的样子,实线部分是它的实际大小,而灰色的呢,则是它被旋转了一个角度之后我们的眼睛看到的样子,也就是目前得到的cell。
数学问题我也不多讨论,反正都可以四舍五入。这里我将cell拉伸成矩形,没有考虑cell的奇奇怪怪的倾斜角度,一切都可以简化。于是呢newCell的高度是确定的,就是ymax。newCell的宽度我用的下面的柿子。其中的k是相机(成像平面)到cell的距离除以书本的长度,我把它简化成常量1.3;
于是呢旧cell的四个点,newCell的4个点都能得到,这时候又是透视变换把cell拉伸。
拉伸后每个cell是一个矩形,再把所有的cell拉伸成同一高度,再拼接就能得到校正后的图片。
3效果展示
a.畸变图片 b.校正效果
a.畸变图片 b.校正效果
a.畸变图片 b.校正页面1 c.校正页面2
(这张图片经过了提高了对比度之后才进行校正)
改进方案
因为是把图片分割之后再拼接,拼接的地方就可能产生断层。was和the。
为了消除这种断层,我才用的方法是把原图像的单词作为一个cell,校正之后覆盖到的单词里。1.先找出单词的轮廓。具体是边缘识别膨胀再边缘识别,最小外接矩形,反正就这些。下面的红框是识别到的单词。
2.之后呢,把上面的单词的四个角点,计算出他们经过校正之后对应的四个角点,再把这个单词透视变换过去。再对3得到的图片进行单词覆盖。