【Python】【OpenCV】轮廓检测
Code:
1 import cv2 2 import numpy as np 3 4 img = np.zeros((200, 200), dtype=np.uint8) 5 img[50:150, 50:150] = 255 6 7 # ret, thresh = cv2.threshold(img, 127, 255, 0) 8 contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 9 color = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) 10 img = cv2.drawContours(color, contours, -1, (0, 255, 0), 2) 11 cv2.imshow('hierarchy', img) 12 cv2.waitKey() 13 cv2.destroyAllWindows()
1、创建一个200x200的正方形,初始化为0的array数组,数据类型为uint8。
2、获取中心正方形,大小为100x100,并将中心区域的灰度级置为255。
3、对img图像进行二值化,threshold(src, threshold, maxval, type) 方法,将图像分割为目标物体和背景两部分:
src:输入的源图像,灰度图像最常见。
thresh:设定的阈值,用于对图像进行分割。
maxval:当像素值超过阈值时,赋予的新的像素值。
type:阈值化类型,包括cv2.THRESH_BINARY(大于阈值的像素设为maxval,小于阈值的像素设为0)、cv2.THRESH_BINARY_INV(大于阈值的像素设为0,小于阈值的像素设为maxval)等多种类型。
对传入的img进行阈值化处理,0表示简单阈值化方法,即当像素点上的灰度级大于127时,则该点灰度级置为255,否则置为0。(本随笔中可以省略此段代码,但是针对其他多灰度级分布的灰度图或者彩色图这一步是必要的)
4、对img图像进行查找轮廓,findContours(image, mode, method) 方法,在二值图像中查找轮廓:
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-Chinl chain 近似算法进行轮廓压缩。
函数的返回值包括两部分:
contours:轮廓的坐标信息,以列表形式返回。每个轮廓都是一个由点坐标构成的数组。
hierarchy:轮廓的层次结构信息,以多维数组形式返回。
5、将img转换成BGR图像。
6、绘画轮廓,drawContours() 方法:
image:输入的图像,可以是彩色图像或灰度图像。
contours:要绘制的轮廓,通常是通过 findContours 函数获取到的轮廓列表。
contourIdx:指定要绘制的轮廓在列表中的索引。如果设置为 -1,则绘制所有的轮廓。
color:轮廓线的颜色,可以是一个三元组 (B, G, R) 表示的颜色值。
thickness:轮廓线的厚度,如果设置为 -1,则填充轮廓内部。