(纯新手教学)计算机视觉(opencv)实战十——轮廓特征(轮廓面积、 轮廓周长、外接圆与外接矩形)
轮廓特征详解
在图像处理和计算机视觉中,轮廓(Contour) 是物体边界的一种表现形式。通过提取图像中的轮廓,我们可以获取目标区域的形状、面积、周长、外接几何体等重要特征,为后续的目标识别、分类和检测奠定基础。
OpenCV 提供了一系列函数来计算和操作轮廓,本文将结合代码示例对常见的轮廓特征进行说明。
原图:
1. 轮廓面积 cv2.contourArea()
#--------轮廓特征--------
import cv2phone = 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)
,分别为矩形左上角坐标及宽高。常用于目标定位与裁剪。
总结
本文结合代码演示了 轮廓特征的核心方法:
面积:
cv2.contourArea()
周长:
cv2.arcLength()
按面积筛选轮廓
排序提取最大轮廓
外接圆、外接矩形
这些特征在 物体检测、目标识别、形状分析 等任务中非常常用。
通过这些几何特征,我们可以更好地理解和利用轮廓信息。
在计算机视觉和图像处理领域,轮廓特征(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)
质心(也叫 重心)是指轮廓的“几何中心”,它可以用于表示物体的位置。
如何计算?
计算轮廓的 矩,例如二阶矩。
使用矩的公式计算 质心。
M = cv2.moments(contour) cx = int(M['m10'] / M['m00']) cy = int(M['m01'] / M['m00'])
返回值:质心的坐标
(cx, cy)
。说明:质心常用于 目标定位,特别是跟踪物体时。
总结
轮廓特征是图像分析中的一个重要部分,它们帮助我们获取目标物体的形状、大小、位置等几何信息。常见的轮廓特征包括 面积、周长、外接矩形、外接圆、凸包、方向、质心 等。在实际应用中,轮廓特征被广泛应用于 目标识别、目标定位、形状分析 和 图像分割 等任务。通过提取这些特征,能够有效地理解和分析图像中的物体。