Contour Features 边界特征

Posted aoru45

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Contour Features 边界特征相关的知识,希望对你有一定的参考价值。

查找轮廓 findContours
 
1 cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) → image, contours, hierarchy

 

 
参数解释
  • image:原图像,可以事先由compare()、inRange()、threshold()等得到binary的image图像
  • mode:轮廓检索模式
  • method:轮廓近似方法
mode参数可取值为
  1. CV_RETR_EXTERNAL 仅检索外部轮廓。
  2. CV_RETR_LIST 检索所有轮廓但是不建立层次关系。
  3. CV_RETR_CCOMP 检索所有轮廓并建立两级层次结构。
  4. CV_RETR_TREE 检索所有轮廓并建立嵌套轮廓层次结构。
method参数可取
 
  1. CV_CHAIN_APPROX_NONE 存储所有轮廓点。
  2. CV_CHAIN_APPROX_SIMPLE 压缩水平、垂直和对角线,仅留下其端点。
  3. CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS  应用了Teh-Chin链式近似算法的一种风格
 
计算图像的轮廓面积 cv2.contourArea()
 
1 cv2.contourArea(contour[, oriented]) → retval

 

 
计算图像的矩 cv2.moments()
 
1 cv2.moments(array[, binaryImage]) → retval

 

 
具体见代码
 
 1 import cv2
 2 import numpy as np
 3  
 4 img = cv2.imread(star.jpg,0)
 5 ret,thresh = cv2.threshold(img,127,255,0)
 6 contours,hierarchy = cv2.findContours(thresh, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
 7  
 8 cnt = contours[0]
 9 M = cv2.moments(cnt)
10 print(cv2.contourArea(cnt))
11 print(M)
12  
13 #得到{‘m00‘: 0.5, ‘m10‘: 53.83333333333333, ‘m01‘: 367.3333333333333, ‘m20‘: 5796.083333333333, ‘m11‘: 39549.541666666664, ‘m02‘: 269867.5833333333, ‘m30‘: 624050.9500000001, ‘m21‘: 4258186.233333333, ‘m12‘: 29055722.733333334, ‘m03‘: 198262758.70000002, ‘mu20‘: 0.027777777778283053, ‘mu11‘: -0.01388888888322981, ‘mu02‘: 0.027777777810115367, ‘mu30‘: -0.003703703638166189, ‘mu21‘: 0.0018518519221615293, ‘mu12‘: 0.001851847569924292, ‘mu03‘: -0.0037037134170532227, ‘nu20‘: 0.11111111111313221, ‘nu11‘: -0.05555555553291924, ‘nu02‘: 0.11111111124046147, ‘nu30‘: -0.020951311664420796, ‘nu21‘: 0.01047565641531008, ‘nu12‘: 0.010475631795338369, ‘nu03‘: -0.020951366982159467}
14  
15 #我们利用这个可以得到重心
16 cx = int(M[m10]/M[m00])
17 cy = int(M[m01]/M[m00])
18 #contourArea的结果和m00的结果一致
19  

 

 

轮廓周长计算  cv2.arcLength()
 
1 perimeter = cv2.arcLength(cnt,True)

 

 
  • 第一个参数是contour
  • 第二个参数指定形状是不是闭合轮廓,true就是闭合的,否则是曲线
 
轮廓近似
 
1 cv2.approxPolyDP(curve, epsilon, closed[, approxCurve]) → approxCurve

 

 
参数解释
  • curve:输入的2D点,比如findContours得到的contour
  • epsilon:精度
  • closed:是否闭合,跟之前说的一样
 
输出的是近似之后的Contour
 
轮廓线拟合
 
1 cv2.polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]]) → img

 

 
参数解释
  • img:输入图像
  • pts:要拟合的轮廓的集合,例如[contours[1],contours[2]]
  • isClosed:是否闭合,跟之前说的一样
  • color:颜色,例如(0,0,255)
  • thickness:厚度,1 2 3等等
  • linetype:线的类型
  • shift:定点坐标中小数位数
 1 import cv2 as cv
 2 import numpy as np
 3 img = cv.imread("test.jpg",0)
 4 _,contours,_ = cv.findContours(img,2,1)
 5 cnt = contours[0]
 6 epsilon = 0.01 * cv.arcLength(cnt,True)#这里用arcLength得到轮廓周长或者曲线长度
 7 approx = cv.approxPolyDP(cnt,epsilon,True)
 8 out_img = cv.polylines(img,[approx],True,(0,0,255),2)
 9 cv.imshow("image",out_img)
10 k  = cv.waitKey(1) & 0xFF
11 if k== 27:
12     cv.destroyAllWindows()

 

    
 
 
凸包检测
 
1 cv2.convexHull(points[, hull[, clockwise[, returnPoints]]]) → hull

 


 
参数解释
  • points:输入的2D点集,如findContours得到的contour
  • hull:输出凸包
  • clockwise:如果是True,则输出凸包顺序为顺时针方向,否则为逆时针方向
     
函数返回的是凸包(点集)
 
1 import cv2 as cv 
2 import numpy as np
3 img = cv.imread("test.jpg",0)
4 _,contours,_ = cv.findContours(img,2,1)
5 cnt = contours[1]
6 hull = cv.convexHull(cnt)
7 out_img = cv.polylines(img,[hull],True,(0,255,255),2)
8 cv.imshow("image",out_img)
9 cv.waitKey(0)

 

 
边界矩形
 
得到直边界矩形
 
1 cv2.boundingRect(points) → retval

 

 
参数解释
  • points:给出的需要确定边界的点集,例如contour
 
函数返回的是得到的边界矩形的四个顶点坐标
 
得到旋转矩形
 
1 cv2.minAreaRect(points) → retval

 

 
参数说明:
  • points :是findCountours得到的contour
使用
import cv2 as cv
import numpy as np
img = cv.imread("test.jpg",0)
_,contours,_ = cv.findContours(img,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)
cnt = contours[0]
rect_vertical = cv.boundingRect(cnt)
rect = cv.minAreaRect(cnt)#这里得到的是旋转矩形
box = cv.cv.BoxPoints(rect)#得到端点
box = np.int0(box)#向下取整

 

 
最小封闭圆
 
1 cv2.minEnclosingCircle(points) → center, radius

 


 
参数解释
  • points:输入点集,如contour
 
输出为圆中心点坐标和半径
 
 
椭圆拟合
 
1 cv2.fitEllipse(points) → retval

 


 
参数解释
  • points:输入点集,如contour
 
输出为椭圆,其属性有中心点坐标、两轴长、偏转角度
 
使用
 1 import cv2 as cv
 2 import numpy as np
 3 img = cv.imread("test.jpg",0)
 4 _,contours,_ = cv.findContours(img,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)
 5 cnt = contours[0]
 6 circle = cv.minEnclosingCircle(cnt)
 7 ellipse = cv.fitEllipse(cnt)
 8 out_1 = cv.circle(img,circle,(0,255,255),2)
 9 out_2 =cv.ellipse(img,ellipse,(0,255,255),2)
10 cv.imshow("img1",out_1)
11 cv.imshow("img2",out_2)
12 cv.waitKey(0)

 




以上是关于Contour Features 边界特征的主要内容,如果未能解决你的问题,请参考以下文章

《RefineMask:Towards High-Quality Instance Segmentation with Fine-Grained Features》论文笔记

Pyspark PCA 实施

OpenCV使用二维特征点(Features2D)和单映射(Homography)寻找已知物体

模型的特征数量必须与输入相匹配。模型 n_features 为 20,输入 n_features 为 4

模型的特征数量必须与输入相匹配。模型 n_features 为 40,输入 n_features 为 38

pyspark GBTRegressor 特征重要度 及排序