OpenCV Python - 图像轮廓

轮廓是连接沿边界的所有连续点的曲线,具有相同的颜色或强度。 轮廓对于形状分析和物体检测非常有用。


寻找轮廓

在找到轮廓之前,我们应该应用阈值或 canny 边缘检测。 然后,通过使用findContours() 方法,我们可以找到二值图像中的轮廓。

findContours()函数使用指令如下 −

cv.findContours(image, mode, method, contours)

参数

findContours()函数的参数如下 −

  • image − 来源,一张 8 位单通道图像。
  • mode − 轮廓检索模式。
  • method − 轮廓近似法。

mode 参数值列举如下 −

  • cv.RETR_EXTERNAL − 仅检索最外层的轮廓。

  • cv.RETR_LIST − 在不建立任何层次关系的情况下检索所有轮廓。

  • cv.RETR_CCOMP − 检索所有轮廓并将它们组织成双层层次结构。

  • cv.RETR_TREE − 检索所有轮廓并重建嵌套轮廓的完整层次结构。

另一方面,近似方法可以是以下方法之一 −

  • cv.CHAIN_APPROX_NONE − 存储绝对所有的轮廓点。

  • cv.CHAIN_APPROX_SIMPLE − 压缩水平、垂直和对角线段,只保留它们的端点。


绘制轮廓

检测到轮廓向量后,使用 cv.drawContours() 函数在原始图像上绘制轮廓。

cv.drawContours()函数的命令如下 −

cv.drawContours(image, contours, contourIdx, color)

参数

drawContours()函数的参数如下 −

  • image − 目标图像。
  • contours − 所有输入轮廓。 每个轮廓都存储为一个点向量。
  • contourIdx − 指示要绘制的轮廓的参数。 如果为负,则绘制所有轮廓。
  • color − 轮廓的颜色。

示例

以下代码是在具有三个填充黑色的形状的输入图像上绘制轮廓的示例。

在第一步中,我们获得灰度图像,然后执行 canny 边缘检测。

然后在生成的图像上调用 findContours() 函数。 它的结果是一个点向量。 然后我们调用 drawContours() 函数。

完整代码如下 −

import cv2
import numpy as np

img = cv2.imread('shapes.png')
cv2.imshow('Original', img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

canny = cv2.Canny(gray, 30, 200)

contours, hierarchy = cv2.findContours(canny,
   cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
print("Number of Contours = " ,len(contours))
cv2.imshow('Canny Edges', canny)

cv2.drawContours(img, contours, -1, (0, 255, 0), 3)

cv2.imshow('Contours', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出

原始图像,经过 canny 边缘检测和绘制轮廓的图像将显示在单独的窗口中,如下所示 −

单独的窗口

经过canny边缘检测后,图像将如下所示 −

canny 边缘检测

绘制完轮廓后,图像如下 −

绘制轮廓