Python OpenCV图像轮廓检测与绘制实战
本文详细介绍如何使用Python和OpenCV库进行图像轮廓识别。重点讲解cv2.findContours()函数的参数设置、返回值解析及不同检索模式,并演示如何通过cv2.drawContours()和cv2.minEnclosingCircle()实现轮廓绘制与外接圆计算,提供完整代码示例供参考。
Python OpenCV图像轮廓检测与绘制实战
本文分享利用Python和OpenCV库识别图像轮廓的具体实现代码,供读者参考学习。
任务目标:使用矩形或圆形边框标记图像中的云朵区域(无需覆盖所有云朵)。

轮廓检测基础与函数原型
### 轮廓检测基础
在OpenCV-Python中,主要使用cv2.findContours()函数来查找并检测物体的轮廓。
import cv2
img = cv2.imread('cloud.jpg')
# 灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
ret, binary = cv2.threshold(gray, 175, 255, cv2.THRESH_BINARY)
img1, contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 以圆形框出云朵
# for i in range(len(contours)):
# (x, y), radius = cv2.minEnclosingCircle(contours[i])
# center = (int(x), int(y))
# radius = int(radius)
# img = cv2.circle(img, center, radius, (0, 255, 0), 2)
#以云朵边界轮廓框出云朵
cv2.drawContours(img, contours, -1, (0, 0, 255), 3)
cv2.imshow("img", img)
cv2.waitKey(0)

关键注意点:cv2.findContours()函数仅接受二值图像作为输入,即黑白图像(非灰度图)。因此,读取原始图像后,需先将其转换为灰度图,再进一步转换为二值图。
### cv2.findContours()函数详解
该函数的基本调用格式如下。
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])
函数返回两个主要值:contours(轮廓列表)和hierarchy(层级结构)。注意:OpenCV 3版本会返回三个值,分别为img、contours和hierarchy。
findContours参数与返回值详解
### 参数说明
第一个参数指定用于寻找轮廓的输入图像。 第二个参数定义轮廓的检索模式,共有四种选项: 1. cv2.RETR_EXTERNAL:仅检测最外层轮廓。 2. cv2.RETR_LIST:检测所有轮廓,不建立任何等级关系。 3. cv2.RETR_CCOMP:建立两个等级的轮廓结构,上层为外边界,内层为内孔边界。若内孔中还存在连通物体,该物体的边界也位于顶层。 4. cv2.RETR_TREE:建立完整的等级树结构轮廓。 第三个参数method指定轮廓的近似算法: cv2.CHAIN_APPROX_NONE:存储轮廓上的所有点,相邻两点像素位置差不超过1,即满足max(abs(x1−x2),abs(y2−y1))==1。 cv2.CHAIN_APPROX_SIMPLE:压缩水平、垂直及对角线方向的元素,仅保留终点坐标。例如,矩形轮廓仅需4个点即可保存全部信息。 cv2.CHAIN_APPROX_TC89_L1或CV_CHAIN_APPROX_TC89_KCOS:采用teh-Chin链近似算法。
### 返回值解析
cv2.findContours()函数返回两个核心值:一个是轮廓本身,另一个是每条轮廓对应的属性信息。
### contour返回值类型
cv2.findContours()函数首先返回一个列表,列表中每个元素对应图像中的一个轮廓,在Python中由numpy的ndarray表示。这一概念至关重要,后续在drawContours中会用到。建议打印并观察contours的数据类型以加深理解。
print (type(contours))
print (type(contours[0]))
print (len(contours))
### hierarchy返回值结构
该函数还可返回一个可选的hierarchy结果,这是一个ndarray数组,其元素个数与轮廓数量一致。每个轮廓contours[i]对应4个hierarchy元素,即hierarchy[i][0]至hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓及内嵌轮廓的索引编号。若无对应项,该值为负数。

轮廓绘制与外接圆计算
### 轮廓的绘制方法
OpenCV提供了cv2.drawContours函数,用于在图像上绘制检测到的轮廓。
cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset ]]]]])
该函数的参数含义如下: 第一个参数指定要在哪幅图像上绘制轮廓; 第二个参数传入轮廓列表,在Python中为list类型; 第三个参数指定绘制轮廓列表中哪一条轮廓,若设为-1,则绘制所有轮廓。 后续参数较为简单,其中thickness参数用于设定轮廓线宽度,若设为-1(即cv2.FILLED),则表示采用填充模式绘制。

OpenCV还通过cv2.minEnclosingCircle()函数帮助找到对象的外接圆,该圆是所有能包含对象的圆中面积最小的一个。
(x,y),radius = cv2.minEnclosingCircle(contours[i])
center = (int(x),int(y))
radius = int(radius)
img = cv2.circle(img,center,radius,(0,255,0),2)

本文内容已收录至《python图片处理操作》专题,欢迎点击学习更多相关技巧。
以上就是本文的全部内容,希望能为读者的学习带来帮助,同时也欢迎大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













