边缘(edge):不同区域的分界线。图像局部灰度显著变化的部分。一阶导数的局部极大值,二阶导数的过零点。
轮廓(contour):物体在场景中的完整边界。边缘的连接构成轮廓。
边缘和轮廓关系,网上有一个解释的比较清楚:
- 一般认为轮廓是对物体的完整边界的描述,边缘点一个个连接起来构成轮廓。边缘可以是一段边缘,而轮廓一般是完整的。
opencv中轮廓检测主要由cv2.findContours函数实现的。
函数定义如下
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])
- image:寻找轮廓的图片对象,8位单通道图像矩阵,可以是灰度图,但更常用的是二值图像,一般是经过Canny、拉普拉斯等边缘检测算子处理过的二值图像。
- 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.CH