Python OpenCV 图像轮廓查找与绘制详解
本文详解如何使用Python和OpenCV库查找并绘制图像轮廓。内容涵盖从二值化预处理、使用cv.findContours提取轮廓参数,到利用cv.drawContours进行可视化的完整流程,并包含代码示例与注意事项。
图像轮廓概念
轮廓是由一系列相连点构成的曲线,用于表征物体的基本外形。虽然轮廓与边缘概念相似,但二者存在区别:轮廓是连续的,而边缘未必连续(见下图)。在应用层面,边缘特征多用于图像区分(如人脸与手部识别),而轮廓则侧重于形态分析(如计算周长和面积),可以说边缘包含了轮廓的信息。

寻找轮廓的操作通常针对二值图像,因此一般需要先通过阈值分割或Canny边缘检测算法生成二值图。
注意:寻找轮廓针对的是白色物体,必须确保物体为白色且背景为黑色,否则可能会错误地提取到图片最外围的边框。
opencv找出图像轮廓
使用cv.findContours()函数来寻找轮廓:
import cv2 as cv
import numpy as np
img = cv.imread('j.png')
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(img_gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)
# 寻找二值图像的轮廓
contours, hierarchy = cv.findContours(
thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
print(len(contours))
- 参数2指定轮廓的查找方式,通常使用cv.RETR_TREE,表示提取所有轮廓并建立它们之间的层级关系。
- 参数3指定轮廓的近似方法。例如对于一条直线,可以存储其所有像素点,也可以仅存储起点和终点。使用cv.CHAIN_APPROX_SIMPLE表示用尽可能少的像素点来表示轮廓。
- 为简便起见,这两个参数也可以直接使用数值3和2来表示。
- 该函数返回两个值,hierarchy表示轮廓间的层级关系,通常可以忽略。我们主要关注contours,它记录了找到的所有轮廓,以链表形式存储,包含每条轮廓上所有像素点的坐标(x,y)。

opencv绘制图像轮廓
找到轮廓后,可以像图中那样用红色将其绘制出来:cv.drawContours()。
cv.drawContours(img, contours, -1, (0, 0, 255), 2) 其中参数2为获取的contours,参数3指定要绘制的轮廓编号,-1表示绘制所有轮廓,参数4为颜色(B/G/R通道,因此(0,0,255)代表红色),参数5为线条宽度。
经验之谈:很多人在绘图时使用了彩色却未生效,请检查绘图目标图像。在灰度图或二值图上绘制彩色线条显然无法显示颜色效果。
通常情况下,我们会先获取需要操作的特定轮廓,再进行绘制和分析: cnt = contours[1] cv.drawContours(img, [cnt], 0, (0, 0, 255), 2)
实验:找出并绘制图像轮廓
import cv2 as cv
import numpy as np
img = cv.imread('jiao.jpg')
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(img_gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)
# 寻找二值图像的轮廓
contours, hierarchy = cv.findContours(
thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
cnt = contours[1:6]
cv.drawContours(img, cnt, -1, (0, 0, 255), 2)
cv.imshow('result',img)
cv.waitKey(0)
cv.destroyAllWindows()
实验结果

以上就是python 基于opencv 绘制图像轮廓的详细内容,更多关于python 绘制图像轮廓的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













