轮廓检测

边缘检测虽然能够检测出边缘,但边缘是不连续的,检测到的边缘并不是一个整体。图像
轮廓是指将边缘连接起来形成的一个整体,用于后续的计算。OpenCV 提供了查找图像轮廓的函数 cv2.findContours(),该函数能够查找图像内的轮廓信
息,而函数 cv2.drawContours()能够将轮廓绘制出来。

API

contours, hierarchy = cv2.findContours( image, mode, method)
  1. 式中的返回值为:
  • contours:返回的轮廓

    • 该返回值返回的是一组轮廓信息,每个轮廓都是由若干个点所构成的。例如,contours[i]是第 i 个轮廓(下标从 0 开始),contours[i][j]是第 i 个轮廓内的第 j 个点。
    • 返回值 contours 的 type 属性是 list 类型,list 的每个元素都是图像的一个轮廓,用 Numpy中的 ndarray 结构表示。
    • 轮廓的个数:len(contours)
    • 某个轮廓中包含的点数:len(contours[i])
  • hierarchy:图像的拓扑信息(轮廓层次)
    • 图像内的轮廓可能位于不同的位置。比如,一个轮廓在另一个轮廓的内部。在这种情况下,我们将外部的轮廓称为父轮廓,内部的轮廓称为子轮廓。按照上述关系分类,一幅图像中所有轮廓之间就建立了父子关系。根据轮廓之间的关系,就能够确定一个轮廓与其他轮廓是如何连接的。比如,确定一个轮廓是某个轮廓的子轮廓,或者是某个轮廓的父轮廓。上述关系被称为层次(组织结构),返回值 hierarchy 就包含上述层次关系。每个轮廓 contours[i]对应 4 个元素来说明当前轮廓的层次关系。其形式为:

[Next,Previous,First_Child,Parent]
* Next:后一个轮廓的索引编号
* Previous:前一个轮廓的索引编号
* First_Child:第 1 个子轮廓的索引编号
* Parent:父轮廓的索引编号
如果上述各个参数所对应的关系为空时,也就是没有对应的关系时,则将该参数所对应的值设为“-1”.使用不同的 mode,得到轮廓的编号是不一样的,得到的 hierarchy 也不一样。

  1. 式中的参数为:
  • image:原始图像。必须是 8 位单通道二值图像。一般情况下,都是将图像处理为二值图像后,再将其作为 image 参数使用的。所有非零值被处理为 1,所有零值保持不变。也就是说灰度图像会被自动处理为二值图像。在实际操作时,可以根据需要,预先使用阈值处理等函数将待查找轮廓的图像处理为二值图像。
  • mode:轮廓的提取方式
    • cv2.RETR_EXTERNAL:只检测外轮廓
    • cv2.RETR_LIST:对检测到的轮廓不建立等级关系
    • cv2.RETR_CCOMP:检索所有轮廓并将它们组织成两级层次结构。上面的一层为外边界,下面的一层为内孔的边界。如果内孔内还有一个连通物体,那么这个物体的边界仍然位于顶层。
    • cv2.RETR_TREE:建立一个等级树结构的轮廓
  • method:轮廓的近似方法,即:如何表达轮廓
    • cv2.CHAIN_APPROX_NONE:存储所有的轮廓点,相邻两个点的像素位置差不超过 1
    • cv2.CHAIN_APPROX_SIMPLE:压缩水平方向、垂直方向、对角线方向的元素,只保留该方向的终点坐标。例如,在极端的情况下,一个矩形只需要用 4 个点来保存轮廓信息
    • cv2.CHAIN_APPROX_TC89_L1:使用 teh-Chinl chain 近似算法的一种风格
    • cv2.CHAIN_APPROX_TC89_KCOS:使用 teh-Chinl chain 近似算法的一种风格

使用函数 cv2.findContours()查找图像轮廓时,需要注意以下问题:
* 待处理的源图像必须是灰度二值图。因此,在通常情况下,都要预先对图像进行阈值分割或者边缘检测处理,得到满意的二值图像后再将其作为参数使用。
* 在 OpenCV 中,都是从黑色背景中查找白色对象。因此,对象必须是白色的,背景必须是黑色的。

image=cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]] )
  • 函数的返回值为 image,表示目标图像,即绘制了边缘的原始图像
  • image:待绘制轮廓的图像。需要注意,函数 cv2.drawContours()会在图像 image 上直接绘制轮廓。也就是说,在函数执行完以后,image 不再是原始图像,而是包含了轮廓的图像。因此,如果图像 image 还有其他用途的话,则需要预先复制一份,将该副本图像传递给函数 cv2.drawContours()使用
  • contours:需要绘制的轮廓。该参数的类型与函数 cv2.findContours()的输出 contours 相同,都是 list 类型
  • contourIdx:需要绘制的边缘索引,告诉函数 cv2.drawContours()要绘制某一条轮廓还是全部轮廓。如果该参数是一个整数或者为零,则表示绘制对应索引号的轮廓;如果该值为负数(通常为“-1”),则表示绘制全部轮廓
  • color:绘制的颜色,用 BGR 格式表示
  • thickness:可选参数,表示绘制轮廓时所用画笔的粗细。如将该值设置为“-1”,则表示要绘制实心轮廓
  • lineType:可选参数,表示绘制轮廓时所用的线型
  • hierarchy:对应函数 cv2.findContours()所输出的层次信息
  • maxLevel:控制所绘制的轮廓层次的深度。如果值为 0,表示仅仅绘制第 0 层的轮廓;如果值为其他的非零正数,表示绘制最高层及以下的相同数量层级的轮廓
  • offset:偏移参数。该参数使轮廓偏移到不同的位置展示出来
import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline
def cvshow(name, ndarray):img = cv2.imshow(name, ndarray)cv2.waitKey(0)cv2.destroyAllWindows()

绘制轮廓

# 将图像转化为单通道二值图像
src = cv2.imread("src.png")
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cvshow("src", src)
# 找出轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
src_copy = src.copy()
# 绘制某个轮廓  若想绘制所有轮廓 则直接传入contours
one = cv2.drawContours(src_copy, contours[2], -1, (0, 0, 255), 2)
cvshow("one", one)

通过split()方法对通道进行分割后,就得到了每个通道,此时单个通道就被转化为了二维数据,对应的就成了灰度图,所以你单独展示每一个通道时展示不出红色,蓝色,绿色的,展示出的都是灰度图。必须保持三个通道作为一个整体才可以单独显示出某个原色,就比如赋值操作,对其他两个通道赋值为0,就可以显示出剩下的一种原色,因为此时三个通道是作为一个整体的。

轮廓计算

con = contours[1]
# 计算面积
area = cv2.contourArea(con)
#计算周长,通常传入一个True,表示周长为闭合
length = cv2.arcLength(con, True)
print(area, length)
6767.5 395.8061298131943

轮廓拟合

矩形边界

retval = cv2.boundingRect(array)

  • 返回值 retval 表示返回的矩形边界的左上角顶点的坐标值及矩形边界的宽度和高度。
  • 参数 array 是灰度图像或轮廓。

该函数还可以是具有 4 个返回值的形式:
x,y,w,h = cv2.boundingRect( array )

  • 矩形边界左上角顶点的 x 坐标。
  • 矩形边界左上角顶点的 y 坐标。
  • 矩形边界的 x 方向的长度。
  • 矩形边界的 y 方向的长度。
retval = cv2.boundingRect(con)
print(retval)
cv2.rectangle(src_copy, (retval[0], retval[1]), (retval[0]+retval[2], retval[1]+retval[3]), (0, 255, 0), 2)
cvshow("res", src_copy)
(83, 273, 112, 121)

openCV——轮廓检测相关推荐

  1. OpenCV-Python实战(11)——OpenCV轮廓检测相关应用

    OpenCV-Python实战(11)--OpenCV轮廓检测相关应用 0. 前言 1. 轮廓绘制 2. 轮廓筛选 3. 轮廓识别 4. 轮廓匹配 小结 系列链接 0. 前言 在计算机视觉领域,轮廓通 ...

  2. OpenCV-Python实战(10)——详解 OpenCV 轮廓检测

    OpenCV-Python实战(10)--详解 OpenCV 轮廓检测 0. 前言 1. 轮廓介绍 2. 轮廓检测 3. 轮廓压缩 4. 图像矩 4. 1 一些基于矩的对象特征 4.2 Hu 不变矩 ...

  3. 基于Python的OpenCV轮廓检测聚类

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 简介 OpenCV的"findContours" ...

  4. c# opencv 轮廓检测_C#中OpenCVSharp实现轮廓检测

    OpenCv提供了函数 findContours()用于对物体轮廓进行检测,该函数实现算法是由S.suzuki K.Abe于1985年发表的.OpenCVSharp封装了这个函数,有2个参数(cont ...

  5. python opencv轮廓检测_OpenCV 轮廓检测的实现方法

    轮廓概述 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度.轮廓在形状分析和物体的检测和识别中很有用. 为了更加准确,要使用二值化图像.在寻找轮廓之前,要进行阈值化处理或 ...

  6. Python OpenCV -- 轮廓检测 (十四)

    轮廓检测 Canny 之类的边缘检测算法可以根据像素间的差异检测出轮廓边界,但是它并没有将轮廓作为一个整体 轮廓是构成任何一个形状的边界或外形线.直方图对比和模板匹配根据色彩的分布来进行匹配,以下包括 ...

  7. c# opencv 轮廓检测_基于OpenCV的区域分割、轮廓检测和阈值处理

    OpenCV是一个巨大的开源库,广泛用于计算机视觉,人工智能和图像处理领域.它在现实世界中的典型应用是人脸识别,物体检测,人类活动识别,物体跟踪等. 现在,假设我们只需要从整个输入帧中检测到一个对象. ...

  8. java opencv 轮廓检测,OpenCV 轮廓检测 - 雷霄骅(leixiaohua1020)的个人页面 - OSCHINA - 中文开源技术交流社区...

    使用OpenCV可以对图像的轮廓进行检测.这是之前用过的代码,挺简单的,回顾一下.主要要进行以下2步操作: 1.cvThreshold():对图像进行二值化处理 2.cvFindContours(): ...

  9. opencv 轮廓检测

    寻找轮廓是从黑色背景中寻找白色物体. import numpy as np import cv2 as cv im = cv.imread('test.jpg') imgray = cv.cvtCol ...

  10. python opencv 轮廓检测_opencv之轮廓检测与处理

    查找图像的轮廓在图像处理及应用中扮演着重要的角色. opencv中 查找轮廓的函数提供的是cv::findContours() 把查找的轮廓划到图像上cv::drawContours() 1.轮廓的查 ...

最新文章

  1. SQLServer异常捕获
  2. 汇编: loop指令
  3. 电子到底为什么会干涉?
  4. input type=submit 和button的区别及表单提交
  5. Pytorch专题实战——交叉熵损失函数(CrossEntropyLoss )
  6. [云计算]VXLAN的网关划分
  7. ue4风格化材质_在UE4中制作风格化场景:Bird House_资源库
  8. python idle界面_3.7 IDLE 用户界面
  9. LaTex关于数学公式的使用(11)--- 单位
  10. 蓝带 拱桥 区别_蓝带
  11. Ubuntu锐捷认证方法(vmware)
  12. iOS7设置状态栏颜色
  13. IntelliJ IDEA 15 Released 破解 注册码
  14. Ubuntu设置中没有网络标识(设置中缺少网络设置(Wired))
  15. 通讯方式:近场通讯和无线通讯
  16. 阿里巴巴区块链防食品欺诈平台进入试点阶段
  17. IC回收,回收电子,回收IC,电子产品回收公司
  18. 地磁传感器_磁感应计_电子罗盘(compass)原理
  19. python以写模式打开的文件无法进读操作_Python文件操作:文件的打开关闭读取写入...
  20. 做竞品分析,你找对竞争对手了吗?

热门文章

  1. Windows7计算机的程序文件名,Win7怎么显示文件后缀名_Win7显示文件的扩展名-192路由网...
  2. 痛心,京东程序员删库跑路获刑!
  3. 【云计算】云计算六大优点简单说明
  4. Dubbo的failsafe容错策略
  5. 研究生阶段记录3-PCR介绍
  6. 前公司未支付竞业限制补偿金,如何起诉?
  7. 计算机管理里面删打印机就卡住了,打印机任务无法删除怎么办-解决打印机任务无法删除的方法 - 河东软件园...
  8. 斜率、梯度(完全不一样的理解)
  9. 我在富士康挨踢了七年(十三.悉尼工作篇 )
  10. C#实现压缩文件及解压文件