【图像处理】基于图像处理的纸张检测和提取
背景
- 给导师看了下自己的毕设系统,建议是可以添加一些互动性。可以在纸张检测上弄一下,也就是拍一张带有纸张的图像,然后提取出纸张边缘并提取出来。
- 提取出纸张有很多种方法,以前做车牌识别系统的时候,利用图像处理的方法定位出车牌的位置,用的是轮廓提取的方法, 首先找蓝色的区域(所以只能支持蓝色车牌),然后找到矩形轮廓区域,车牌矩形满足一定的宽高比例,然后就可以找到车牌了。然而纸张并不像车牌那样规规矩矩,有时候纸张会出现形变等情况,而且纸张内部如果写有字,可能也会影响纸张的提取,颜色提取就更不用说了,字迹和光照也会影响的。如何进行纸张检测和提取是一个有意思的研究。
方法
似乎有很多方法可以提取纸张,比如直线检测,找到直线相交的四个点,也可以基于边缘检测和轮廓法,深度学习方法来提取纸张,是一种很弟弟的行为,纸张内部的字、画等会严重影响其训练效果,图像处理方法就是个很不错的选择。然而,图像处理说简单其实似乎也不简单。这里我使用轮廓提取的方法来提取。
步骤:
(准备:白色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个点,将这四个点进行排序,然后进行放射变换,就可以提取需要的结果了。
结果
不足之处,仍然有一些提取错误的,这些错误的图像,包含了纸张,但是也含有其它的部分,这是在提取轮廓这个步骤中失误的,因此在提取轮廓中,如何进行进一步筛选则是未来的一个问题,不过对于个人的毕设,利用上述步骤已经完全足够,因为背景并不复杂,结果如下:
下面全是图