【OpenCV Python】核心操作--轮廓

1.查找,绘制轮廓

opencv里查找轮廓需要四步:

1)使用cv2.cvtColor将图形颜色通道转到灰度空间。

2)使用cv2.Threshold将图形二值化

3)使用cv2.findContours查找到图形的轮廓

4)使用cv2.drawContours画出找到的轮廓

对于第三,第四步的两个新函数,其格式如下:

 cv2.findContours( src , 查找方式,近似方法) 关于查找方式待会再将,对于近似方法这个参数,可以是cv2.CHAIN_APPROX_SIMPLE,cv2.CHAIN_APPROX_NONE,他们的区别在于:

Cv2.CHAIN_APPROX_SIMPLE会返回所有轮廓的点,但cv2.CHAIN_APPROX_NONE只返回必要的几个点,毕竟两个点就能确定一条直线,从而节省内存。

Cv2.findContours会返回三个结果 image ,contours ,hier

image就是查找轮廓的原图形,

contours是查找到的轮廓点的坐标,这是一个数组,

hier是查找到的轮廓的层级结构,这个待会和查找方式一起讲。

 

Cv2.drawcontours( src , 轮廓坐标 ,轮廓层级 ,轮廓颜色,轮廓厚度),关于这个函数,轮廓坐标就是上面函数所返回的结果里的contours,轮廓层级就是指画出第几层轮廓,轮廓颜色一般是一个RGB格式的元组。

 

例子:

img = cv2.imread("contour_2.png",1)

img_gary=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换颜色空间

ret, thresh = cv2.threshold(img_gary,127,255,0)#二值化

image ,contours ,hier =cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#查找轮廓

img = cv2.drawContours(img ,contours, -1 , (0,0,255), 3)#画出轮廓

  

屏幕剪辑的捕获时间: 2018/4/15 19:38

2.轮廓层级

关于轮廓层级,一幅图像里可能有多个图形出现,这些图形可能相互嵌套,也可能相互独立,所以这些图形的轮廓会构成层级,如下图所示:

  

屏幕剪辑的捕获时间:2018/4/15 20:03

可以看出,该图像里存在多个轮廓,所以在查找轮廓时,需要给出参数说明怎么样去查找,然后在画出轮廓的时候,也要说明画第几层轮廓。所以:

cv2.findContours函数的查找方式这个参数里,我们需要设定查找方式,

一般可选参数有:

Cv2.RETR_LIST:将所有轮廓都放在一起,按一个层级去处理

Cv2.RETR_EXTERNAL:只查找最外面的层级

Cv2.RETR_TREE:最详细的查找方法,函数返回的层级结构里包含所有层级的相互关系

cv2.drawContours函数里的轮廓层级里,如果全部轮廓都画出来,则设置为-1,反之设置成对应的轮廓层级

例如,下面是只画第2层的结果:

img = cv2.drawContours(img ,contours, 2 , (0,0,255), 2)

 

屏幕剪辑的捕获时间: 2018/4/15 20:12

 

注:cv2.findContours返回的hier结构如下:

[[[ 6 -1  1 -1]

  [-1 -1  2  0]

  [-1 -1  3  1]

  [-1 -1  4  2]

  [ 5 -1 -1  3]

  [-1  4 -1 3]

  [-1  0 -1 -1]]]

每层分别是代表从第0到第6层的相互关系,其具体格式是:[Next, Previous ,First_Child, Parents]

Next表示同一级的下一个轮廓

Previous代表同一级的上一个轮廓

First_Child代表下一级的第一个子轮廓

Parents代表上一级的父轮廓

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值