Python OpenCV 图像区域轮廓标记,可用于框选各种小纸条
Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。本篇博客是这个系列的第 54 篇。
学在前面
上篇 OpenCV 博客原计划完成一个 识别银行卡号 的项目,但是写的过程中发现,技术储备不足,我无法在下述图片中,提取出卡号区域,也就无法进行后续的识别了,再次意识到了自己技术还不达标,继续学习。完不成,就实现其它学习项目。
轮廓识别实战
先看一下最终实现的效果,针对一张图片(该图片前景色和背景色差异较大),进行轮廓标记。
图片基本处理
转换成灰度图,高斯模糊去噪,Canny 边缘检测,这些都是图像处理的基本函数,使用方法已经在前文进行过相关学习。
运行上述代码之后,获取基本边缘数据。
轮廓检测
下面就是检测图像轮廓具体位置的代码了:
在 cv.findContours(edges, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
中,第二个参数使用的是 cv.RETR_LIST
,该参数值表示检测所有轮廓,不建立等级关系,彼此独立。如果只想获取轮廓边缘信息,不关心是否嵌套在另一个轮廓之内,使用该参数值即可。
第三个参数使用的是 cv.CHAIN_APPROX_SIMPLE
,表示压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需 4 个点来保存轮廓信息,这也是为了后面便于计算。
观察上图,可以发现最外侧的边缘面积是最大的,所以依据面积进行排序,依据其他值也可以,获取面积最大的轮廓。
对轮廓进行简单绘制,获得下图效果。
遍历轮廓,计算轮廓近似
先看代码:
一个新的函数 cv.arcLength
,该函数的原型如下:
该函数用于计算轮廓的周长。
下面的 cv.approxPolyDP
函数原型如下:
函数参数如下:
curve
:源图像的某个轮廓;epsilon
:距离值,表示多边形的轮廓接近实际轮廓的程度,值越小,越精确;closed
:轮廓是否闭合。
最重要的参数就是 epsilon
简单记忆为:该值越小,得到的多边形角点越多,轮廓越接近实际轮廓,该参数是一个准确度参数。
该函数返回值为轮廓近似多边形的角点。
绘制轮廓
最后判断,当上文返回的角点为 4 的时候,提取轮廓,代码如下:
更换图片,进行再次轮廓检测,注意修改轮廓近似部分代码即可。
橡皮擦的小节
希望今天的 1 个小时(貌似不太够)你有所收获,我们下篇博客见~
虫。博主 ID:梦想橡皮擦,希望大家<font color="red">点赞</font>、<font color="red">评论</font>、<font color="red">收藏</font>。
版权声明: 本文为 InfoQ 作者【梦想橡皮擦】的原创文章。
原文链接:【http://xie.infoq.cn/article/16559cc03b7dd1c4af22722cf】。文章转载请联系作者。
评论