1. 什么是轮廓
边缘检测能够检测出边缘,但是边缘不是连续的,如果我们将边缘 连接为一个整体,我们便构造出了轮廓。
注意
- 对于opencv来说构建轮廓的对象是二值图像。所以我们首先要进行阈值分割或者边缘检测的处理。
- 查找轮廓,会更改原始的图像,所以,我们们通常使用原始的图像,拷贝一份在进行操作。
- 在opencv中,是从黑色的背景中查找白色对象,因此对象必须是白色,而背景必须是黑色
2. 使用的函数
cv2.findContours( )
查找轮廓图像的函数。cv2.drawContours( )
将查找到的轮廓绘制到图像上。
首先看第一个函数cv2.findContours( )
1.contours, hierarchy = cv2.findContours( image, mode, method)
相关参数的释义
contours 为轮廓
hierarchy 为图像的拓扑信息(轮廓的层次)
image 为原始图像
mode 为轮廓的检索模式
cv2.RETR_EXTERNAL :表示只检测外轮廓
cv2.RETR_LIST :检测的轮廓不建立等级关系
cv2.RETR_CCOMP :建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
cv2.RETR_TREE :建立一个等级树结构的轮廓(常用这一个)
-method 为轮廓的近似方法
cv2.CHAIN_APPROX_NONE :存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2), abs(y2-y1)) ==1
cv2.CHAIN_APPROX_SIMPLE:压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
cv2.CHAIN_APPROX_TC89_L1:使用teh-Chinl chain 近似算法
cv2.CHAIN_APPROX_TC89_KCOS:使用teh-Chinl chain 近似算法
2.r=cv2.drawContours(o, contours, contourIdx, color[, thickness])
r 为目标图像
o 原始图像
contours 需要绘制的边缘数组
contourldx 需要绘制的边缘索引,如果全部绘制,则为-1
color 绘制的颜色,位BGR格式的Scalar
thickness 可选,绘制是时所用的画笔的粗细
3. 代码实现
#%%图像轮廓的绘制 import cv2 import numpy as np import os img = cv2.imread(r"C:\\Users\\lihuanyu\\Desktop\\opencv\\image\\boyun.png") #拷贝一份 img1 = img.copy() #转换为黑色 gray = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY) #阈值分割-二值化 ret,binary = cv2.threshold(gray,127,225,cv2.THRESH_BINARY) #轮廓的提取 #image,contours,hierarchy = cv2.findContours(img2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) contours, hierarchy =cv2.findContours(binary,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) o=cv2.drawContours(img1,contours,-1,(0,255,0),5) cv2.imshow("origial",img) cv2.imshow("result",o) cv2.waitKey() cv2.destroyAllWindows()
结果