快速学会利用opencv对图像轮廓进行检测

一、引言

在OpenCV中,轮廓检测是一种常用的图像处理技术,用于找到图像中的对象的边界。轮廓是图像中相连的边界像素的连续曲线。

二、具体步骤

检测轮廓的API: 

  image, contours, hierarchy = cv2.findContours(img, mode, method)

参数:img:需要实现轮廓检测的原图

mode: 轮廓的检索模式,主要有四种方式:

    a)cv2.RETR_EXTERNAL:只检测外轮廓,所有子轮廓被忽略

    b)cv2.RETR_LIST:检测的轮廓不建立等级关系,所有轮廓属于同一等级

    c)cv2.RETR_CCOMP:返回所有的轮廓,只建立两个等级的轮廓。一个对象的外轮廓为第1级组织结构。而对象内部中空洞的轮廓为第2级组织结构,空洞中的任何对象的轮廓又是第 1 级组织结构。

    d)cv2.RETR_TREE:返回所有的轮廓,建立一个完整的组织结构的轮廓。

 method:轮廓的近似方法,主要有以下两种:

    a)cv2.CHAIN_APPROX_NONE:存储所有的轮廓点。

    b)cv2.CHAIN_APPROX_SIMPLE:压缩模式,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息。

返回值含义: 

 1、image:返回处理的原图

 2、contours:包含图像中所有轮廓的list对象。其中每一个独立的轮廓信息以边界点坐标     (x,y)的形式储存在numpy数组中。

 3、hierarchy:轮廓的层次结构。一个包含4个值的数组:[Next, Previous, First Child,     Parent]

   Next:与当前轮廓处于同一层级的下一条轮廓

   Previous:与当前轮廓处于同一层级的上一条轮廓

   First Child:当前轮廓的第一条子轮廓

   Parent:当前轮廓的父轮廓

注意:做轮廓检测前需要将图片读取为二值数据,即像素值只为0和255。

三、代码实现 

import cv2

# 读取图像
image = cv2.imread('phone.png')

# 将图像转换为灰度
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用阈值处理将图像转换为二值图像
ret, thresh = cv2.threshold(gray, 120, 255, 0)

# 执行轮廓检测
image_thresh,contours, hierarchy = cv2.findContours(thresh,  cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

# 绘制轮廓
contour_image = cv2.drawContours(image.copy(), contours=contours, contourIdx=-1,color=(0,255,0),thickness=3)

# 显示带有轮廓的图像
cv2.imshow('Contours', contour_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行前后结果对比:

 

上述示例的步骤如下:

  1. 读取图像并将其转换为灰度图像。
  2. 使用阈值处理将灰度图像转换为二值图像,这有助于明确目标的轮廓。
  3. 使用cv2.findContours()函数来检测图像中的轮廓。该函数返回轮廓的列表以及轮廓之间的层次信息。
  4. 使用cv2.drawContours()函数将检测到的轮廓绘制在原始图像上。
  5. 最后,显示带有轮廓的图像。

四、总结 

轮廓检测对于目标检测、形状分析、图像分割等应用非常有用。你可以进一步处理和分析检测到的轮廓,例如计算轮廓的面积、周长,查找特定形状的轮廓等。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一款流行的计算机视觉库,提供了许多图像处理和计算机视觉算法,包括轮廓识别。轮廓图像中所有连续的边缘的点的集合。通过识别轮廓,可以分析和提取图像中的有用信息。 下面是一个简单的示例代码,演示如何使用OpenCV进行轮廓识别: ```python import cv2 # 读取图像 img = cv2.imread('example.jpg') # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化处理 ret, thresh = cv2.threshold(gray, 127, 255, 0) # 寻找轮廓 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 绘制轮廓 cv2.drawContours(img, contours, -1, (0, 255, 0), 3) # 显示结果 cv2.imshow('contours', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上述代码中,我们首先读取图像,然后将其转换为灰度图像,并对其进行二值化处理。接着,使用`cv2.findContours()`函数寻找图像中的轮廓,并将它们存储在`contours`变量中。最后,使用`cv2.drawContours()`函数将轮廓绘制在原始图像上,并显示结果。 需要注意的是,`cv2.findContours()`函数返回两个值:`contours`和`hierarchy`。`contours`是一个包含所有轮廓信息的列表,每个轮廓都是一个包含点坐标的数组。`hierarchy`是一个包含轮廓层次结构信息的数组,可用于进一步分析轮廓之间的关系。在本例中,我们只使用了`contours`变量来绘制轮廓。 希望这个简单的示例可以帮助你了解如何使用OpenCV进行轮廓识别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值