图像轮廓
目录
cv2.findContours(img,mode,method)
mode:轮廓检索模式 RETR_EXTERNAL 只检索最外面的轮廓 RETR_LIST 检索所有的轮廓,并将其保存到一条链表当中 RETR_CCOMP 检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界 RETR_TREE 检索所有的轮廓,并重构嵌套轮廓的整个层次,也是最常用的模式
method:轮廓逼近方法 CHAIN_APPROX_NONE 以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列) CHAIN_APPROX_SIMPLE 压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分
轮廓提取
转换为二值图像
img = cv2.imread('contours.png') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
提取轮廓信息
#contours轮廓信息、hierarchy层级信息 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
注:Opencv3在开始多返回一个原二值图
绘制轮廓
#传入绘制图像,轮廓,轮廓索引,颜色模式,线条厚度 # 注意需要copy,要不原图会变。。。 draw_img = img.copy() res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)
轮廓特征相关计算
轮廓特征
# 提取轮廓信息 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) cnt = contours[0] #面积 cv2.contourArea(cnt) #周长,True表示闭合的 cv2.arcLength(cnt,True)
轮廓近似
cnt = contours[0] # 近似轮廓,epsilon指定周长的倍数为近似阈值,阈值越小与原图像越相似 epsilon = 0.15*cv2.arcLength(cnt,True) approx = cv2.approxPolyDP(cnt,epsilon,True)
边界矩形
# 获取外接矩形信息 x,y,w,h = cv2.boundingRect(cnt) # 绘制外接矩形 img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2) # 计算轮廓面积与边界矩形比 area = cv2.contourArea(cnt) x, y, w, h = cv2.boundingRect(cnt) rect_area = w * h extent = float(area) / rect_area print ('轮廓面积与边界矩形比',extent)
外接圆
(x,y),radius = cv2.minEnclosingCircle(cnt) center = (int(x),int(y)) radius = int(radius) img = cv2.circle(img,center,radius,(0,255,0),2)