利用OpenCV检测图像中长方形画布或纸张并提取图像内容分析_第1页
利用OpenCV检测图像中长方形画布或纸张并提取图像内容分析_第2页
利用OpenCV检测图像中长方形画布或纸张并提取图像内容分析_第3页
利用OpenCV检测图像中长方形画布或纸张并提取图像内容分析_第4页
利用OpenCV检测图像中长方形画布或纸张并提取图像内容分析_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、问题如下:也就是在一张照片里,已知有个长方形的物体,但是经过了透视投影,已经不再是规则的长方形,那么如何提取这个图形里的内容呢?这是个很常见的场景,比如在博物馆里看到一幅很喜欢的画,用手机找了下来,可是回家一看歪歪斜斜,脑补原画内容又觉得不对,那么就需要算法辅助来从原图里提取原来的内容了。不妨把应用的场景分为以下:纸张四角的坐标(图中红点)已知的情况也就是上面的左图中4个红点是可以准确获取,比如手动标注,那么就简单了:用OpenCV的PerspectiveTransform就可以。具体步骤如下:1)将标注好的四个点坐标存入一个叫corner的变量里,比如上面的例子中,原图的分辨率是300 x4

2、00,定义x和y的方向如下:那么纸张的四角对应的坐标分别是:左上:157.6,71.5右上:295.6,118.4右下:172.4,311.3左下:2.4,202.4把这四个坐标按如上顺序放到一个叫corner的变量里。如果我们打算把这幅图案恢复到一个300 x400的图像里,那么按照对应的顺序把下面四个坐标放到一个叫canvas的变量里:左上:0,0右上:300,0右下:300,400左下:0,400假设原图已经用OpenCV读取到一个叫image的变量里,那么提取纸张图案的代码如下:1M=cv2.getPerspectiveTransform(corners,canvas)2resultc

3、v2.warpPerspective(image,M,(0,0)把左图剪裁出来,去掉红点后试了试,结果如下:当然,其实这一步用Photoshop就可以了。纸张四角的坐标未知或难以准确标注的情况这种场景可能是小屏幕应用,或是原始图像就很小,比如我这里用的这个300 x400例子,点坐标很难精确标注。这种情况下一个思路是,用边缘检测提取纸张四边,然后求出四角坐标,再做PerspectiveTransform。1)图像预处理一般而言即使做普通的边缘检测也需要提前对图像进行降噪避免误测,比如最常见的办法是先对图像进行高斯滤波,然而这样也会导致图像变得模糊,当待检测图形边缘不明显,或是图像本身分辨率不高

4、的情况下(比如本文用的例子),会在降噪的同时把待检测的边缘强度也给牺牲了。具体到本文的例子,纸张是白色,背景是浅黄带纹路,如果进行高斯滤波是显然不行的,这时候一个替代方案是可以考虑使用MeanShift,MeanShift的优点就在于如果是像背景桌面的浅色纹理,图像分割的过程中相当于将这些小的浮动过滤掉,并且保留相对明显的纸张边缘,结果如下:原图处理后Meanshift的代码:1image=cv2.pyrMeanShiftFiltering(image,25,10)因为主要目的是预处理降噪,windowssize和colordistance都不用太大,避免浪费计算时间还有过度降噪。降噪后可以看

5、到桌面上的纹理都被抹去了,纸张边缘附近干净了很多。然而这还远远不够,图案本身,和图像里的其他物体都有很多明显的边缘,而且都是直线边缘。2)纸张边缘检测虽然降噪了,可是图像里还是有很多边缘明显的元素。怎么尽量只保留纸张的边缘呢,这时候可以考虑用分割算法,把图像分为纸张部分和其他部分,这样分割的mask边缘就和纸张边缘应该是差不多重合的。在这里可以考虑用GrabCut,这样对于简单的情况,比如纸张或画布和背景对比强烈的,直接把图像边缘的像素作为boundingbox就可以实现自动分割。当自动分割不精确的情况下再引入手动辅助分割,具体到我这里用的例子,背景和画面接近,所以需要手动辅助:结果如下:可以

6、看到,分割后的结果虽然能基本区分纸张形状了,可是边缘并不准确,另外键盘和部分桌面没能区分开来。这时可以继续用GrabCut+手动标注得到只有纸张的分割。或者为了用户友好的话,尽量少引入手动辅助,那么可以考虑先继续到下一步检测边缘,再做后期处理。假设我们考虑后者,那么我们得到的是如下的mask:这个mask并不精确,所以不能直接用于边缘检测,但是它大致标出了图片里最明显的边缘位置所在,所以可以考虑下面的思路:保留降噪后位于mask边缘附近的信息用于真正的边缘检测,而把其他部分都模糊处理,也就是说基于上面得到的mask做出下面的mask用于模糊处理:基于这个mask得到的用于边缘检测的图像如下:用

7、canny算子检测出边缘如下:I-13)直线检测对检测到的边缘使用Hough变换检测直线,我例子里用的是cv2.HoughLinesP,分辨率1像素和1。,可以根据图像大小设置检测的阈值和minLineLength去除大部分误检测。特别提一下的是如果使用OpenCV的Pythonbinding,OpenCV2和OpenCV3的结果结构是不一样的,如果进行代码移植需要相应的修改。检测到的结果如下:可以看到,有些线几乎重合在一起了,这是难以避免的,上图中一共检测到9条线,其中两对(下、右边缘)重合。可以通过距离判断和直线相对角度来判断并把重合线段合为一条:剩下的都是没有重合的线了。4)判断纸张边缘

8、那么如何选取纸张边缘的四条线呢(即使图像分割步骤非常好得分开了纸张和其他部分,这在有些情况下还是难以避免的,比如图案里有和边缘平行的线条),可以沿着提取线段的两边采样像素的灰度:在线段的两个端点之间平均采样左右两边像素的值,因为一般来说如果是纸张或者画布,边缘和背景的颜色在四边上应该都是类似的。然而这样做的话引入另外一个问题是需要区分线段的左”和右”,对于线段本身而言就是要区分前后。所以需要对画面里所有的线段端点进行排序,而这个排序的基准就是相对画布。具体到本文的例子就是把图像中心定义为所有线段的左”边,如上图。而决定线段端点前和后”可以用如下办法:先假设线段的前后端点,将两个端点坐标分别减去

9、中心点(红点)的坐标,然后将得到的两个向量a和b求叉积,如果叉积大于0则说明假设正确,如果0则交换假设的前后端点。线段端点的顺序确定后就可以进行采样了,简单起见可以分别采样左右两侧的像素灰度值,如果希望更准确可以采样RGB通道的值进行综合比较,下面是7条线段对应的两侧像素灰度的中值分布:22011111*200- TOC o 1-5 h z ISO-160-140-120-100-%。6080100120140160180200220可以看到其中有4个点距离非常近(红色),说明他们的像素灰度分布也很接近,把这4条选出来,结果如下:正是要的结果。5)计算四角的坐标接下来计算四条线的交点,方法点这

10、里。因为有4条线,会得到6个结果,因为在这种应用场景中,方形的物体在透视变换下不会出现凹角,所以直接舍弃离纸张中心最远的两个交点就得到了四个角的坐标,结果如下:这样就回到了一开始四角坐标已经得到的情况,直接进行透视变换就行了。CameraCalibration?写了这么多,其实有一条至关重要的假设,甚至可以说是最关键的步骤之一我一直没提,那就是CameraCalibration,如果有相机的情况下,metadata都知道,那么需要先坐CameraCalibration才能知道纸张或者画布的原始尺寸。我这里试的例子当然是没有的,也可以有,相应的算法OpenCV里也有现成的,不过即便如此还是非常麻

11、烦,所以我的所有流程都是默认原始尺寸已经获得了。再说了,就算没有,变换回方形之后使用者凭感觉进行简单轴缩放都比CameraCalibration方便得多。|古今名言敏而好学,不耻下问孔子业精于勤,荒于嬉;行成于思,毁于随一一韩愈兴于诗,立于礼,成于乐一一孔子己所不欲,勿施于人孔子读书破万卷,下笔如有神杜甫读书有三到,谓心到,眼到,口到一一朱熹立身以立学为先,立学以读书为本一一欧阳修读万卷书,行万里路一一刘彝黑发不知勤学早,白首方悔读书迟颜真卿书卷多情似故人,晨昏忧乐每相亲于谦书犹药也,善读之可以医愚一一-刘向莫等闲,白了少年头,空悲切一岳飞发奋识遍天下字,立志读尽人间书办轼鸟欲高H先振翅,人求上进先读书一一李苦禅立志宜思真品格,读书须尽苦功夫阮儿非淡泊无以明志,非宁静无以致远诸曷冗熟读唐诗二日首

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论