图像轮廓检测方法

发布时间 2023-04-22 22:14:03作者: 落霞&孤鹜
 1 #图像轮廓
 2 #先将灰度图像二值化 这样轮廓更加清晰
 3 ret,thresh = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)
 4 #cv2.findContours(src,mode,method)
 5 #mode:轮廓检索模式
 6 #RETR_EXTERNAL:只检索最外面的轮廓;
 7 #RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;
 8 #RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
 9 #RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次;
10 #一般建议使用RETR_TREE,因为包含了所有类型轮廓
11 #methode:轮廓逼近方法
12 #CHAIN_APPROX_NONE: 以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)
13 #CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。
14 binary, contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
15 #绘制图像
16 #cv2.drawcontours(src,contours,contoursIndex,Line Color,LineSize)
17 #contours:轮廓
18 #contoursIndex:轮廓索引,-1代表图像中所有轮廓,其余只要不超过索引范围,则是代表图像中的某个轮廓的外或内轮廓
19 #LineColor:绘制线条的颜色 在opencv中颜色不是RGB而是BGR
20 #LineSize:线条粗细,注意如果线条太宽会导致内外轮廓无法分辨
21 #注意 drawcontours函数会更改并且保存src的图像,所以再使用之前需要用copy复制一个
22 draw_img = img_gray.copy()
23 res = cv2.drawContours(draw_img,contours,-1,(0,0,255),3)
24 Cv_Show('Contours',res)

轮廓特征

1 #注意 contour是一个数组,内含多个轮廓,所以是无法直接计算的需要先取出某一个轮廓
2 #下行就是取出第一个轮廓
3 cnt = contours[0]
4 #求面积
5 cv2.contourArea(cnt)
6 #求周长 True表示闭合的
7 cv2.arcLength(cnt,True)

轮廓近似

1 #轮廓近似
2 #epsilon 阈值 系数越小 离原轮廓差距越小
3 epsilon = 0.1 * cv2.arcLength(cnt,True)
4 approx = cv2.approxPolyDP(cnt,epsilon,True)
5 res = cv2.drawContours(draw_img,[approx],-1,(0,0,255),3)
6 Cv_Show('Approx',res)

轮廓应用

 1 #边界矩阵
 2 #就是外接矩阵
 3 x,y,w,h = cv2.boundingRect(cnt)
 4 res = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),3)
 5 Cv_Show('Rectangle',res)
 6 #外接圆
 7 (x,y),radius = cv2.minEnclosingCircle(cnt)
 8 center = (int(x),int(y))
 9 radius = int(radius)
10 res = cv2.circle(img,center,radius,(255,0,0),3)
11 Cv_Show('Circle',res)