【图像处理】基于图像处理的纸张检测和提取

背景

  • 给导师看了下自己的毕设系统,建议是可以添加一些互动性。可以在纸张检测上弄一下,也就是拍一张带有纸张的图像,然后提取出纸张边缘并提取出来。
  • 提取出纸张有很多种方法,以前做车牌识别系统的时候,利用图像处理的方法定位出车牌的位置,用的是轮廓提取的方法, 首先找蓝色的区域(所以只能支持蓝色车牌),然后找到矩形轮廓区域,车牌矩形满足一定的宽高比例,然后就可以找到车牌了。然而纸张并不像车牌那样规规矩矩,有时候纸张会出现形变等情况,而且纸张内部如果写有字,可能也会影响纸张的提取,颜色提取就更不用说了,字迹和光照也会影响的。如何进行纸张检测和提取是一个有意思的研究。

方法

似乎有很多方法可以提取纸张,比如直线检测,找到直线相交的四个点,也可以基于边缘检测和轮廓法,深度学习方法来提取纸张,是一种很弟弟的行为,纸张内部的字、画等会严重影响其训练效果,图像处理方法就是个很不错的选择。然而,图像处理说简单其实似乎也不简单。这里我使用轮廓提取的方法来提取。

步骤:

(准备:白色A4纸张,背景桌面尽量纯色,然后再弄几张有代表性的复杂背景桌面,opencv,python)

  • 缩放,统一尺寸
    由于是手机拍摄的,大部分是百万像素以上,4000x3000的像素,缩放到1000x750,方便处理,然后copy一张灰度的图像做主要处理图像。
  • 滤波处理
    中值滤波,核大小为3x3,手机拍出来一般没啥噪声点,稍微简单处理下就就行了,或者不加。另外要说明的是,如果图像拍出来是模糊的,再滤波一下,会检测不到边缘的。
  • 二值化
    用大津阈值分割法,自适应进行二值化。白色纸张
  • 边缘检测
    有很多很多种边缘检测方法,最好用Canny,而且一般都用Canny法。边缘提取效果非常好。
  • 提取轮廓
    轮廓的提取,opencv有findContours()函数,直接调用就行了,返回的contours对象,包含有n个带有m个点的数据,这m个点围起来就是一个轮廓,一共有n组。
  • 筛选轮廓1
    第一次筛选,使用的方法很粗暴简单,提取的轮廓必须要大于100000,也就是说,750x1000=750000,要轮廓面积大于整个图像的1/7.5的,其它的直接pass掉,纸张肯定在图像里面,并且涵盖大部分区域
  • 筛选轮廓2
    第二次筛选,要做一些处理,首先是提取凸包,得到凸包的角点,然后对这个凸包n边形进行拟合,拟合的结果,肯定是一个多边形,然后判断这个多边形是否为4边形就ok了。
  • 仿射变换,提取
    在上一步中,会直接得到4个点,将这四个点进行排序,然后进行放射变换,就可以提取需要的结果了。

结果

不足之处,仍然有一些提取错误的,这些错误的图像,包含了纸张,但是也含有其它的部分,这是在提取轮廓这个步骤中失误的,因此在提取轮廓中,如何进行进一步筛选则是未来的一个问题,不过对于个人的毕设,利用上述步骤已经完全足够,因为背景并不复杂,结果如下:
下面全是图
【图像处理】基于图像处理的纸张检测和提取
【图像处理】基于图像处理的纸张检测和提取
【图像处理】基于图像处理的纸张检测和提取
【图像处理】基于图像处理的纸张检测和提取
【图像处理】基于图像处理的纸张检测和提取
【图像处理】基于图像处理的纸张检测和提取
【图像处理】基于图像处理的纸张检测和提取