轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析和物体的检测和识别中很有用。
• 为了更加准确,要使用二值化图像。在寻找轮廓之前,要进行阈值化处理或者 Canny 边界检测。
• 查找轮廓的函数会修改原始图像。如果你在找到轮廓之后还想使用原始图像的话,你应该将原始图像存储到其他变量中。
• 在 OpenCV 中,查找轮廓就像在黑色背景中超白色物体。你应该记住,要找的物体应该是白色而背景应该是黑色。
让我们看看如何在一个二值图像中查找轮廓:
cv2.findContours()
是 OpenCV 中用于查找图像中轮廓的函数。该函数的基本语法如下:
contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
参数说明:
image
: 输入图像,通常为二值图像(例如阈值化后的图像)。mode
: 轮廓检索模式,有如下几种选择:cv2.RETR_EXTERNAL
: 只检测最外层的轮廓。cv2.RETR_LIST
: 检测所有轮廓,不建立轮廓层次。cv2.RETR_CCOMP
: 检测所有轮廓,建立两层轮廓层次。cv2.RETR_TREE
: 检测所有轮廓,建立完整的轮廓层次。
method
: 轮廓逼近方法,有如下几种选择:cv2.CHAIN_APPROX_NONE
: 存储所有的轮廓点。cv2.CHAIN_APPROX_SIMPLE
: 压缩水平、垂直和斜率方向的元素,只保留其端点。cv2.CHAIN_APPROX_TC89_L1
和cv2.CHAIN_APPROX_TC89_KCOS
: 应用 Teh-Chin 链逼近算法。
contours
: 输出参数,存储检测到的轮廓。hierarchy
: 输出参数,存储轮廓的层次信息。offset
: 可选参数,偏移值,通常不需要使用。
import cv2
# 读取图像
img = cv2.imread( r"C:\Users\mzd\Desktop\opencv\images.jpg")
# 将图像转换为灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用阈值处理图像
ret, thresh = cv2.threshold(gray, 127, 255, 0)
# 查找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 在原始图像上绘制轮廓
cv2.drawContours(img, contours, -1, (0, 255, 0), 2)
# 显示原始图像和带有轮廓的图像
cv2.imshow('Original Image', img)
cv2.imshow('Contour Image', thresh)
# 等待用户按下任意键
cv2.waitKey(0)
cv2.destroyAllWindows()
这个示例演示了如何使用 cv2.findContours()
函数查找图像中的轮廓,并使用 cv2.drawContours()
函数在原始图像上绘制这些轮廓。