图像轮廓检测方法

复制代码
 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)
复制代码

 

posted @   落霞&孤鹜  阅读(70)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示