下面是详细的讲解“opencv python 图像轮廓/检测轮廓/绘制轮廓的方法”的完整攻略。
检测图像轮廓的方法主要是通过cv2.findContours函数实现,该函数接收三个参数,分别是输入图像、轮廓检索方式以及轮廓近似方法。返回值是包含检测到的轮廓信息的列表。以下是检测轮廓的基本步骤:
import cv2
import numpy as np
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, 0)
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
其中,轮廓检测的方式有以下几种:
- RETR_EXTERNAL 只检测最外层轮廓
- RETR_LIST 检测所有轮廓,但不建立轮廓层次结构
- RETR_CCOMP 检测所有轮廓,并将轮廓分层,每个轮廓存储到相应的层数中
- RETR_TREE 检测所有轮廓,并重建轮廓之间的层次关系
轮廓检测的近似方法有以下几种:
- CHAIN_APPROX_NONE 以折线段方式存储轮廓,包括所有的轮廓点
- CHAIN_APPROX_SIMPLE 压缩水平、垂直和斜率等方向的冗余点,只保留该方向的重点
绘制轮廓的方法是通过cv2.drawContours函数实现,该函数接收三个参数,分别是绘制轮廓的图像、要绘制的轮廓信息以及绘制的轮廓索引。以下是绘制轮廓的基本步骤:
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,127,255,0)
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
drawing = np.zeros(img.shape,np.uint8) # 创建一个黑色背景的图像
cv2.drawContours(drawing,contours,-1,(0,255,0),2)
cv2.imshow('output', drawing)
注意,第四个参数指定绘制轮廓的颜色,其中(0,255,0)代表纯绿色,(0,0,255)代表纯蓝色,(255,0,0)代表纯红色,(255,255,255)代表白色,(0,0,0)代表黑色等。
以下是两个例子,展示如何检测和绘制轮廓。
import cv2
import numpy as np
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,127,255,0)
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
# 绘制单个轮廓
drawing = np.zeros(img.shape,np.uint8)
cv2.drawContours(drawing,contours,0,(0,255,0),2)
cv2.imshow('output', drawing)
import cv2
import numpy as np
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,127,255,0)
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
# 绘制所有轮廓
drawing = np.zeros(img.shape,np.uint8)
for i in range(len(contours)):
cv2.drawContours(drawing,contours,i,(0,255,0),2)
cv2.imshow('output', drawing)
以上两个示例演示了如何检测并绘制单个轮廓和所有轮廓。通过了解其中的基本步骤,可以根据实际需求自由调整参数和细节,实现更加复杂的图像轮廓检测和绘制操作。