OpenCV Python - 图像轮廓


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

寻找轮廓

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

findContours()函数的使用命令如下 -

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

参数

findContours()函数的参数如下 -

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

模式参数的值枚举如下 -

  • 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()函数的参数如下 -

  • 图像 - 目标图像。
  • 轮廓 - 所有输入轮廓。每个轮廓都存储为点向量。
  • 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()

输出

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

单独的窗口

经过精明的边缘检测后,图像将如下 -

精明的边缘检测

绘制轮廓后,图像如下 -

轮廓已绘制