【OpenCV3.3+Python3.6】图像轮廓检测

31 篇文章 1 订阅
31 篇文章 0 订阅

 图像轮廓检测

 

轮廓检测的原理是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现的结果

api介绍

findContours发现轮廓

drawContours绘制轮廓

 

1.函数原型:cv2.findContours(image, mode, method, contours=None, hierarchy=None, offset=None)

参数说明:

(1)image:原图

(2)mode:轮廓的检索模式,有四种,常用的是 cv2.RETR_EXTERNAL
枚举    说明
              cv2.RETR_EXTERNAL    表示只检测外轮廓
              cv2.RETR_LIST    检测的轮廓不建立等级关系
              cv2.RETR_CCOMP    建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
              cv2.RETR_TREE    建立一个等级树结构的轮廓
(3)method:轮廓的近似办法,常用 cv2.CHAIN_APPROX_SIMPLE
枚举    说明
              cv2.CHAIN_APPROX_NONE    存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1

              cv2.CHAIN_APPROX_SIMPLE    压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息

函数返回参数:

(1)contours:轮廓本身,

(2)hierarchy:是每条轮廓对应的属性,一般使用contour

(3)如果有三个返回参数的话。image:原图像
 

注意:

OpenCV旧版,返回三个参数:

im2, contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

要想返回三个参数: 把OpenCV 降级成3.4.3.18 就可以了,

在终端输入pip install opencv-python==3.4.3.18

OpenCV 新版调用,返回两个参数:  

contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

 

2.函数原型:cv2.drawContours(image, contours, contourIdx, color, thickness, lineType, hierarchy, maxLevel, offset) 

(1)image :目标图像

(2)contours - 所有的输入轮廓,每个轮廓为点矢量(a point vector)/点向量 形式,与findcontours中的返回值 contours 的列表list形式一致

(3)contourIdx - 指定轮廓列表的索引 ID(将被绘制),若为负数,则所有的轮廓将会被绘制。

(4)color - 绘制轮廓的颜色。

(5)thickness - 绘制轮廓线条的宽度,若为负值或CV.FILLED则将填充轮廓内部区域

(6)lineType - Line connectivity,(有的翻译线型,有的翻译线的连通性)

(7)hierarchy - 层次结构信息,与函数findcontours()的hierarchy有

(8)maxLevel - 绘制轮廓的最高级别。
              0,则绘制指定轮廓
              1,则绘制该轮廓和所有嵌套轮廓(nested contours)
              2,则绘制该轮廓、嵌套轮廓(nested contours)/子轮廓和嵌套-嵌套轮廓(all the nested-to-nested contours)/孙轮廓,等等。该参数只有在层级结构时才用到。

(9)offset - 按照偏移量移动所有的轮廓(点坐标)。
 

代码奉上

import cv2
import numpy as np


# 轮廓检测
img = cv2.imread('240.bmp')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 获取灰度图
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)  # 利用阈值自动选择的方法获取二值图像
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  # 检测轮廓
cv2.drawContours(img, contours, -1, (0, 255, 0), 1)  # 画出轮廓
cv2.imshow('gray', binary)
cv2.imshow('res', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

原图:

轮廓检测结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Demo.demo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值