在计算机视觉领域,轮廓检测与分析是目标识别、图像分割的核心技术之一。本文将通过具体案例,结合OpenCV库,详细讲解轮廓的几何特征计算(面积、周长)、轮廓筛选与排序,以及模板匹配的实战应用,帮助你快速掌握这些关键技术。
一、轮廓检测基础:从图像到轮廓
1.1 图像预处理
轮廓检测的第一步通常是将图像转换为灰度图并进行二值化处理,以便突出目标轮廓。以下是关键步骤:
import cv2
# 读取原始图像(手机图片示例)
phone = cv2.imread('phone.png')
# 转换为灰度图(减少计算量,保留亮度信息)
phone_gray = cv2.cvtColor(phone, cv2.COLOR_BGR2GRAY)
# 二值化处理(阈值120,大于阈值的像素设为255,否则0)
phone_bin = cv2.threshold(phone_gray, 120, 255, cv2.THRESH_BINARY)[-1]
cv2.cvtColor:颜色空间转换函数,COLOR_BGR2GRAY表示将BGR三通道转为单通道灰度图。cv2.threshold:二值化函数,THRESH_BINARY模式会根据阈值将像素分为黑白两色。[-1]用于提取二值化后的图像(因threshold返回阈值和结果两个值)。
1.2 轮廓查找
通过cv2.findContours函数提取二值图像中的轮廓。该函数会遍历图像中的连通区域,返回轮廓列表。
# 查找轮廓(RETR_TREE表示树状结构检索所有轮廓,CHAIN_APPROX_NONE保存所有轮廓点)
contours = cv2.findContours(phone_bin, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[-2]
cv2.findContours:输入二值图像(需为单通道),输出轮廓列表。注意:OpenCV 3/4返回(轮廓, 层级),因此用[-2]取轮廓列表。- 参数说明:
RETR_TREE表示检索所有轮廓并重建嵌套结构;CHAIN_APPROX_NONE表示存储轮廓的所有顶点坐标。
二、轮廓的几何特征分析
轮廓检测后,我们常需要量化其几何特征(如面积、周长),用于筛选或分类目标。以下是两个核心指标的计算方法。
2.1 轮廓面积:cv2.contourArea
轮廓面积表示轮廓所围区域的像素数量,可用于判断轮廓的大小(如区分手机屏幕与小噪点)。
# 计算第0个轮廓的面积(默认返回绝对值)
area_0 = cv2.contourArea(contours[0])
print(f"轮廓0的面积: {
area_0}")
# 计算第1个轮廓的面积
area_1

最低0.47元/天 解锁文章
1386

被折叠的 条评论
为什么被折叠?



