OpenCV-Python——图像轮廓

图像轮廓与边缘的区别:边缘是不连续的,轮廓是连续的,将边缘连接起来,就能构成轮廓。
图像轮廓的绘制需要用到两个函数:cv2.findContours()和cv2.drawContours()
res,contours,hierarchy = cv2.findContours(image,mode,method)

  • res:处理后的图像
  • contours:返回的轮廓数组,每个轮廓由一条曲线(一系列坐标)构成
  • hierarchy:图像的拓扑信息(轮廓层次)
  • 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:使用 teh-Chinl chain近似算法(暂不明)
  • cv2.CHAIN_APPROX_TC89_KCOS:使用 teh-Chinl chain近似算法(暂不明)

res = cv2.drawContours(img,contours,contourIdx,color[,thickness])

  • res:处理后的图像
  • img:需要处理的原图像,处理这里会改变原图像,因此要先将原图像拷贝
  • contours:轮廓
  • contourIdx:需要绘制的轮廓的下标,-1表示绘制所有轮廓
  • color:需要绘制的轮廓的颜色,由(B,G,R)元组表示
  • thickness:轮廓的粗细

示例代码

img = cv2.imread('test.png')
#转化为灰度图
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#转化为二值图
_,binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
image,contours,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
res = cv2.drawContours(img.copy(),contours,-1,(255,0,0))
cv2.imshow('org',img)
cv2.imshow('res',res)
cv2.waitKey()
cv2.destroyAllWindows()

效果:
原图:OpenCV-Python——图像轮廓_第1张图片效果图:OpenCV-Python——图像轮廓_第2张图片

你可能感兴趣的:(opencv)