(纯新手教学)计算机视觉(opencv)实战十——轮廓特征(轮廓面积、 轮廓周长、外接圆与外接矩形)


轮廓特征详解

在图像处理和计算机视觉中,轮廓(Contour) 是物体边界的一种表现形式。通过提取图像中的轮廓,我们可以获取目标区域的形状、面积、周长、外接几何体等重要特征,为后续的目标识别、分类和检测奠定基础。

OpenCV 提供了一系列函数来计算和操作轮廓,本文将结合代码示例对常见的轮廓特征进行说明。


原图:

1. 轮廓面积 cv2.contourArea()

复制代码
#--------轮廓特征--------
import  cv2

phone = cv2.imread('phone.png')#读取原图
phone_gray = cv2.cvtColor(phone,cv2.COLOR_BGR2GRAY)#灰度图的处理
ret, phone_binary = cv2.threshold(phone_gray,120,255, cv2.THRESH_BINARY)#阈值处理为二值
_,contours, hierarchy = cv2.findContours(phone_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# contours = cv2.findContours(phone_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[-2]  # 通用



# cv2.contourArea(contour[, oriented]) -> retval     轮廓面积
# contour:顶点构成的二维向量组(如轮廓列表contours中的一个轮廓)
# oriented,定向区域标志,默认值为 False,返回面积的绝对值,Ture 时则根据轮廓方向返回带符号的数值
area_0 = cv2.contourArea(contours[0])
print(area_0)
area_1 = cv2.contourArea(contours[1])
print(area_1)
  • cv2.contourArea() 用于计算轮廓所包围的区域面积。

  • 参数说明:

    • contour:单个轮廓(点集)。

    • oriented:布尔值,默认为 False,返回面积绝对值;若为 True,则返回带符号的值(顺时针或逆时针)。

在实际应用中,面积可用于 过滤小轮廓 (噪声),或用于 目标筛选(如筛选面积最大的轮廓)。


2. 轮廓周长 cv2.arcLength()

复制代码
# arclength(InputArray curve, bool closed)            轮廓周长
# curve,输入的二维点集(轮廓顶点),可以是 vector 或 Mat 类型。
# closed,用于指示曲线是否封闭。
length = cv2.arcLength(contours[0],closed=True)
print(length)
  • cv2.arcLength() 用于计算轮廓的 周长

  • 参数:

    • curve:输入轮廓点集。

    • closed:是否闭合,通常为 True

周长可用于目标形状分析,例如判断目标是否接近圆形、多边形等。


3. 按面积筛选轮廓

复制代码
# 根据面积显示特定轮廓
a_list=[]
for i in contours:
    if cv2.contourArea(i)>10000:
        a_list.append(i)
image_copy = phone.copy()
image_copy = cv2.drawContours(image=image_copy, contours=a_list, contourIdx=-1,color=(0,255,0),thickness=3)
cv2.imshow('Contours_show_10000', image_copy)
cv2.waitKey(0)
  • 这里通过遍历所有 contours,利用 cv2.contourArea(i)>10000 进行筛选,仅保留面积大于 10000 的轮廓。

  • 通过 cv2.drawContours() 绘制符合条件的轮廓。

这种方法常用于 去除小噪声轮廓,只显示大目标。


4. 轮廓排序与最大轮廓提取

复制代码
# '''轮廓定位方法 根据轮廓面积进行排序'''
sortcnt = sorted(contours, key=cv2.contourArea, reverse=True)[0]  # 选取最大面积的轮廓
image_contours = cv2.drawContours(phone.copy(), contours=[sortcnt], contourIdx=-1, color=(0,255,255),thickness=3)#绘制轮廓
cv2.imshow('image_contours',image_contours)
cv2.waitKey(0)
  • 使用 Python 内置 sorted() 函数,按照 cv2.contourArea 计算的面积进行排序,reverse=True 表示从大到小排序。

  • 这里选取面积最大的轮廓 sortcnt,并绘制在图像上。

👉 常见应用:提取图像中最主要的目标区域。


5. 外接圆与外接矩形

复制代码
### 外接圆、外接矩形...
'''外接圆、外接矩形'''
cnt = contours[6]
(x,y),r = cv2.minEnclosingCircle(cnt)#计算轮廓的外接圆
phone_circle = cv2.circle(phone, (int(x),int(y)),int(r), (0,255,0),  2)#绘制外接圆的方法
cv2.imshow('phone_circle',phone_circle)
cv2.waitKey(0)

x,y,w,h = cv2.boundingRect(cnt)#计算轮廓的最小外接矩形
phone_rectangle = cv2.rectangle(phone, (x,y), (x+w,y+h), (0,255,0), 2)  # 在图像上绘制矩形
cv2.imshow('phone_rectangle',phone_rectangle)
cv2.waitKey(0)

外接圆 cv2.minEnclosingCircle()

  • 计算轮廓的最小外接圆。

  • 返回值:圆心坐标 (x,y) 和半径 r

  • 适用于检测近似圆形目标。

外接矩形 cv2.boundingRect()

  • 计算轮廓的最小外接矩形(水平的,不旋转)。

  • 返回 (x,y,w,h),分别为矩形左上角坐标及宽高。

  • 常用于目标定位与裁剪。


总结

本文结合代码演示了 轮廓特征的核心方法

  1. 面积cv2.contourArea()

  2. 周长cv2.arcLength()

  3. 按面积筛选轮廓

  4. 排序提取最大轮廓

  5. 外接圆、外接矩形

这些特征在 物体检测、目标识别、形状分析 等任务中非常常用。

通过这些几何特征,我们可以更好地理解和利用轮廓信息。


在计算机视觉和图像处理领域,轮廓特征 (Contour Features)用于描述图像中目标物体的形状、大小和位置等几何属性。轮廓是通过检测物体的边界(像素边缘)形成的,它是表示图像物体的一种重要方式。以下是常见的 轮廓特征,以及它们的详细说明:


1. 轮廓面积(Contour Area)

cv2.contourArea(contour)

  • 功能:计算轮廓所包围区域的面积。

  • 使用场景

    • 用于 目标筛选,例如去除小噪声或小物体。

    • 计算对象的 尺寸,并用面积来分类。

示例:

复制代码
area = cv2.contourArea(contour)
  • 返回值:轮廓的面积(float类型)。

  • 说明:面积可以帮助我们了解物体的大小,通常会用面积来进行阈值过滤,只保留大于某个面积的轮廓。


2. 轮廓周长(Contour Perimeter / Arc Length)

cv2.arcLength(contour, closed)

  • 功能:计算轮廓的周长或弧长。

  • 参数

    • contour:需要计算的轮廓。

    • closed:布尔值,是否闭合轮廓。

示例:

复制代码
length = cv2.arcLength(contour, closed=True)
  • 返回值:轮廓的周长(float类型)。

  • 说明 :周长可以描述物体的边界长度,对于形状的 复杂性分析 非常有用。


3. 外接矩形(Bounding Rectangle)

cv2.boundingRect(contour)

  • 功能:计算轮廓的最小外接矩形。

  • 使用场景

    • 目标定位,用于显示和裁剪。

    • 形状简化,通过矩形来描述目标,特别是当目标接近矩形时。

示例:

复制代码
x, y, w, h = cv2.boundingRect(contour)
  • 返回值 :矩形的 (x, y) 位置和 (w, h) 宽高。

  • 说明 :外接矩形简单直观,广泛用于目标定位,尤其是在 目标检测 中。


4. 最小外接圆(Minimum Enclosing Circle)

cv2.minEnclosingCircle(contour)

  • 功能:计算轮廓的最小外接圆,即能完全包围轮廓的最小圆形。

  • 使用场景

    • 判断目标是否接近 圆形

    • 碰撞检测 中,如果目标是圆形的,可以使用外接圆来简化计算。

示例:

复制代码
(x, y), r = cv2.minEnclosingCircle(contour)
  • 返回值 :圆心 (x, y) 和半径 r

  • 说明 :外接圆是目标的最小圆形框,它常用于检测 近似圆形的目标


5. 凸包(Convex Hull)

cv2.convexHull(contour)

  • 功能:计算轮廓的凸包,即包含轮廓的最小凸多边形。

  • 使用场景

    • 用于提取物体的 凸性。如果目标物体是凸形状,凸包几乎和物体本身一致。

    • 也可用于形状 简化,忽略内部凹陷。

示例:

复制代码
hull = cv2.convexHull(contour)
  • 返回值 :轮廓的 凸包,即包含所有轮廓点的最小凸多边形。

  • 说明 :凸包可以用来处理 不规则的形状,去除内凹部分,描述物体的外轮廓。


6. 轮廓的方向(Contour Orientation)

cv2.isContourConvex(contour)

  • 功能 :判断轮廓是否是 的。

  • 使用场景

    • 判断轮廓是否有内凹部分,从而判断物体的 凸凹性质

示例:

复制代码
is_convex = cv2.isContourConvex(contour)
  • 返回值 :布尔值,True 表示是凸的,False 表示有凹陷。

  • 说明 :该方法有助于确定形状的基本性质,例如 凸多边形凹多边形 的区别。


7. 最小外接椭圆(Min Area Rectangle)

cv2.fitEllipse(contour)

  • 功能:拟合轮廓到最小外接椭圆。

  • 使用场景

    • 用于 椭圆形物体的检测 ,或 旋转矩形 的定位。

示例:

复制代码
ellipse = cv2.fitEllipse(contour)
  • 返回值 :椭圆的 中心点长短轴旋转角度

  • 说明 :该特征可以帮助处理 非矩形目标 ,例如 椭圆形的目标


8. 轮廓近似(Contour Approximation)

cv2.approxPolyDP(contour, epsilon, closed)

  • 功能:通过近似多边形逼近轮廓,用于简化轮廓。

  • 使用场景

    • 对轮廓进行 简化,减少轮廓的点数,使其更适合后续处理。

示例:

复制代码
approx = cv2.approxPolyDP(contour, epsilon=0.02*cv2.arcLength(contour, True), closed=True)
  • 返回值 :简化后的 多边形点集

  • 说明 :该方法可以用来减少 轮廓点的数量 ,使轮廓变得更加简洁,常用于 形状检测


9. 轮廓的质心(Centroid)

质心(也叫 重心)是指轮廓的"几何中心",它可以用于表示物体的位置。

如何计算?

  1. 计算轮廓的 ,例如二阶矩

  2. 使用矩的公式计算 质心

    M = cv2.moments(contour)
    cx = int(M['m10'] / M['m00'])
    cy = int(M['m01'] / M['m00'])

  • 返回值 :质心的坐标 (cx, cy)

  • 说明 :质心常用于 目标定位,特别是跟踪物体时。


总结

轮廓特征是图像分析中的一个重要部分,它们帮助我们获取目标物体的形状、大小、位置等几何信息。常见的轮廓特征包括 面积、周长、外接矩形、外接圆、凸包方向质心 等。在实际应用中,轮廓特征被广泛应用于 目标识别、目标定位、形状分析图像分割 等任务。通过提取这些特征,能够有效地理解和分析图像中的物体。

相关推荐
PAQQ2 小时前
使用node-red+opencv+mqtt实现相机图像云端查看
人工智能·opencv·计算机视觉
zzywxc7872 小时前
如何利用AI IDE快速构建一个简易留言板系统
开发语言·前端·javascript·ide·vue.js·人工智能·前端框架
是乐谷2 小时前
Python图片转WebP常用库推荐:Pillow、Wand、cv2
大数据·运维·开发语言·人工智能·python·开源·pillow
机器之心2 小时前
混乱、内耗、丑闻:Meta考虑向Google、OpenAI低头
人工智能·openai
Stara05113 小时前
基于Ultralytics YOLO通用目标检测训练体系与PyTorch EfficientNet的图像分类体系实现
pytorch·深度学习·神经网络·yolo·目标检测·计算机视觉·迁移学习
葫三生3 小时前
三生原理的“阴阳元”能否构造新的代数结构?
前端·人工智能·算法·机器学习·数学建模
人工智能训练师3 小时前
部署在windows的docker中的dify知识库存储位置
linux·运维·人工智能·windows·docker·容器
AI 嗯啦3 小时前
深度学习----卷积神经网络实现数字识别
人工智能·深度学习·cnn
hfd19903 小时前
虚拟机逃逸攻防演练技术文章大纲
人工智能
大模型真好玩3 小时前
深入浅出LangGraph AI Agent智能体开发教程(二)—LangGraph预构建图API快速创建Agent
人工智能·python·mcp