一、引言
在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()
运行前后结果对比:
上述示例的步骤如下:
- 读取图像并将其转换为灰度图像。
- 使用阈值处理将灰度图像转换为二值图像,这有助于明确目标的轮廓。
- 使用
cv2.findContours()
函数来检测图像中的轮廓。该函数返回轮廓的列表以及轮廓之间的层次信息。 - 使用
cv2.drawContours()
函数将检测到的轮廓绘制在原始图像上。 - 最后,显示带有轮廓的图像。
四、总结
轮廓检测对于目标检测、形状分析、图像分割等应用非常有用。你可以进一步处理和分析检测到的轮廓,例如计算轮廓的面积、周长,查找特定形状的轮廓等。