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 – 轮廓的颜色。
示例
以下代码是在一个填充有黑色的三个形状的输入图像上绘制轮廓的示例。
在第一步中,我们获得一个灰度图像,然后进行边缘检测。
在结果图像上,我们调用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边缘检测 之后,图像将如下所示−
绘制轮廓之后,图像将如下所示 −