轮廓
- 从轮廓出发,推荐几个强大的几何科学库-python
文章目录
什么是轮廓
- 图像中连续的像素边界,由相同像素值组成的曲线,它们接连相同的颜色或者灰度值,具有连续性
opencv库常见相关操作
获取轮廓
-
cv2.findContours
# opencv3.x image, contours, hierarchy = cv2.findContours( image, mode, method) # opencv4.x contours, hierarchy = cv2.findContours( image, mode, method) ''' # 返回值 1.image : 与函数参数中的原始图像image一致 在opencv4.x中该返回值已经被取消 2.contours(轮廓) :返回的轮廓 <class 'list'> list中的每个元素都是图像的一个轮廓,用Numpy中的ndarray结构表示,包含轮廓(多边形)的所有点 3.hierarchy :图像的拓扑信息(轮廓层次) [Next,Previous,First_Child,Parent] Next: 后一个轮廓的索引编号 Previous: 前一个轮廓的索引编号 First_Child: 第1个子轮廓的索引编号 Parent: 父轮廓的索引编号 -1: 没有对应关系 # 参数 1.image : 原始图像。 8位单通道图像,所有非零值被处理为1,所有零值保持不变。也就是说灰度图像会被自动处理为二值图像。在实际操作中,可以根据需要,预先使用阈值处理等函数将待查找轮廓的图像处理为二值图像。 2.mode : 轮廓检索模式 cv2.RETR_EXTERNAL:只检测外轮廓 cv2.RETR_LIST:对检测到的轮廓不建立等级关系 cv2.RETR_CCOMP:检索所有轮廓并将它们组织成两级层次结构。上面的一层为外边界,下面的一层为内孔的边界。如果内孔内还有一个连通物体,那么这个物体的边界仍 然位于顶层 cv2.RETR_TREE:建立一个等级树结构的轮廓 3.method : 轮廓的近似方法,决定如何表达轮廓 cv2.CHAIN_APPROX_NONE:存储所有的轮廓点,相邻两个点的像素位置差不超过 1,即 max(abs(x1-x2),abs(y2-y1))=1 cv2.CHAIN_APPROX_SIMPLE:压缩水平方向、垂直方向、对角线方向的元素,只保留该方向的终点坐标。例如,在极端的情况下,一个矩形只需要用 4 个点来保存轮廓信息 cv2.CHAIN_APPROX_TC89_L1:使用 teh-Chinl chain 近似算法的一种风格 cv2.CHAIN_APPROX_TC89_KCOS:使用 teh-Chinl chain 近似算法的一种风格 '''
-
cv2.drawContours
# cv2.drawContours(image, contours, contourIdx, color, thickness, lineType, hierarchy, maxLevel, offset) # 画轮廓的函数 ''' image:要绘制轮廓的目标图像,底图 contours:轮廓数据,python列表,包含所有轮廓的点集 contourldx: 指定要绘制的轮廓的索引,如果是负值,则绘制所有的轮廓 color: 轮廓线条的颜色。三通道底图时使用BGR格式 thickness: 轮廓线条的厚度,如果为负值(如cv2.FILLED),则填充轮廓内部 lineType: 线条的类型,有8(8-connected line)、4(4-connected line)和cv2.LINE_AA(抗锯齿线) hierarchy(可选):轮廓层次结构,通常由cv2.findContours()返回,如果提供,该参数将用于绘制轮廓的层次结构 maxLevel(可选):用于绘制轮廓层次结构的最大层次,默认值为0,表示只绘制当前层次的轮廓,如果为负值,则绘制所有层次的轮廓 offset(可选): 轮廓点坐标的偏移量,默认值为(0,0) '''
快速获取最大轮廓
-
cv2.contourArea
# areas = cv2.contourArea(contour[, oriented_area]) # 计算给定轮廓的面积,输入参数可以是一个轮廓,也可以是一个点集或者一个层次结构 ''' 通过格林公式计算轮廓面积 oriented_area = True 表示计算有向面积 轮廓的面积计算是基于轮廓点的坐标,因此轮廓点的顺序(顺时针或逆时针)会影响有向面积的值。 '''
-
sorted
# sorted(sorted(iterable, key=None, reverse=False)) ''' iterable: 可迭代对象 key : 用来比较的元素,只能传入一个参数(确定一个排序依据) reverse:True时表示逆序(从高到低),False表示正序(从低到高) ## 可使用lambda函数作为key ''' ''' 将cv2.contourArea得到的轮廓面积集和送入sorted即可找到面积最大的轮廓 '''
cv2.approxPolyDP
# points_list = cv2.approxPolyDP(curve, epsilon, closed)
# 用于对轮廓进行多边形近似。这个函数可以简化轮廓的形状,通过减少轮廓点的数量,同时尽可能保留原始轮廓的形状。
'''
# 返回值
points_list : 多边形点的数组,每个多边形由一个点的列表组成
# 参数
curve : 输入的轮廓点数组,通常是 cv2.findContours 函数返回的结果
epsilon:近似参数,表示轮廓点之间的最大距离。这个值越小,近似后的多边形越接近原始轮廓,但轮廓点的数量会越多;值越大,近似后的多边形越简单,但可能会丢失一些细节
closed:布尔值,表示近似后的多边形是否是闭合的。如果为 True,则近似后的多边形是闭合的;如果为 False,则近似后的多边形可能不是闭合的。
'''
轮廓到矩形
-
cv2.minAreaRect
# Box2D = cv2.minAreaRect(points) # 计算给定轮廓的最小面积矩形(bounding box)。这个矩形不一定是正方形或矩形,它可能是一个平行四边形,取决于轮廓的形状。 ''' # 返回值 Box2D对象: box:一个包含四个顶点的数组,表示最小面积矩形的顶点,顶点按照顺时针或逆时针顺序排列。 center:矩形的中心点坐标。 size:矩形的宽度和高度,是一个包含宽度和高度的元组 (width, height)。 angle:矩形的旋转角度,以度为单位,相对于水平轴。 # 参数 points:多边形的点集 '''
-
cv2.boundingRect
# tuple(x,y,width,height) = cv2.boundingRect(points[, depth]) # 计算一个点集的边界矩形。这个函数会返回包含所有点的最小矩形的左上角坐标和尺寸。 ''' # 返回值 包含x y width height 的元组 最小矩形的左上角坐标和尺寸 # 参数 points:输入的点集,可以是一个点的数组或者二维点集(例如,由 cv2.findContours 返回的轮廓点)。 depth:(可选)输出数组的深度,如果设置为 -1,则输出数组的深度与输入数组相同。 '''
最小外接圆,最小外接椭圆
-
cv2.minEnclosingCircle
# tuple(center, radius, errors) = cv2.minEnclosingCircle(points) # 用于计算一组点的最小包围圆。这个函数会找到一个圆,使得所有点都尽可能地靠近圆周,并且圆的面积是最小的 ''' # 返回值: center: 圆心坐标(x,y) radius: 圆的半径 errors: 一个布尔值数组,表示每个点是否在院内或圆上。如果 errors 为 None,则表示所有点都在圆内或圆上。 # 参数 points:点集 '''
-
cv2.ellipse
# cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]) # 用于在图像上绘制椭圆。这个函数可以用于绘制具有任意中心、轴长度、旋转角度和起始/结束角度的椭圆。 ''' img:要在其上绘制椭圆的图像 center:椭圆的中心点坐标 (x, y) axes:一个包含半轴长度的元组 h_size, w_size,其中 h_size 是沿 y 轴的半轴长度,w_size 是沿 x 轴的半轴长度 angle:椭圆相对于 x 轴的旋转角度(以度为单位) startAngle:椭圆的起始角度,以度为单位 endAngle:椭圆的结束角度,以度为单位 color:绘制椭圆的颜色,以 BGR 格式指定 thickness:线条的粗细。如果为负值(例如 -1),则椭圆将被填充 lineType:线条的类型,可以是 cv2.LINE_4, cv2.LINE_8 等 shift:角度和轴长度的缩放因子 '''
轮廓的性质/属性
- 长宽比:边界矩形的长宽比
- Extend:轮廓面积与边界矩形面积的比
- Solidity:轮廓面积与凸包的比
- 与轮廓面积相等的圆形的直径
- 方向:对象的方向,下面的方法还会返回长轴和短轴的长度
- 掩膜和像素点
- 最大值和最小值及它们的位置
- 平均颜色及平均灰度
- 极点
shapely库
简介
一个强大的python库,用于处理和分析二维集和对象(用于操作和分析笛卡尔坐标系中的几何对象),基于GEOS(Geometry Engine - Open Source)库实现,提供了丰富的几何操作功能,如计算面积、长度、交集和并集等等。hapely在地理信息系统(GIS)、计算几何学和空间分析等领域有广泛应用。
几何对象(继承Geometry类)
- 点:Point
- 线:LineString
- 多边形:Polygon
- 多点集合:MultiPoint
- 多线集合:MultiLineString
- 多多边形集合:MultiPolygon
基本用法
- 创建几何对象
- 基本属性和操作
- 几何操作
- 空间关系
- 高级应用
相关地址
- github https://github.com/shapely/shapely
- 文档 https://shapely.readthedocs.io/en/stable/
pyclipper
简介
- pyclipper是Angus Johnson’s Clipper库的Python封装版本。它提供了一系列用于多边形裁剪和偏移的算法,这些算法既快速又准确,能够处理复杂的多边形运算
- 主要特点:
- 支持多种多边形运算(并集、交集、差集等)
- 高效的多边形偏移(膨胀/收缩)
- 处理自交多边形和多个多边形
- 支持整数和浮点数坐标
相关地址
- github https://github.com/fonttools/pyclipper
scikit-geometry
简介
- 简介:scikit-geometry包含了大量的几何算法。目前,scikit-geometry的大部分功能来自于成熟稳定的计算几何算法库(CGAL)包,这是一系列用C++编写的几何算法集合。
- 支持的类型
Point2
,Point3
Segment2
,Ray2
,Line2
,Segment3
,Ray3
,Line3
Vector2
,Vector3
Circle2
IsoRectangle2
,Bbox2
Plane3
,Triangle3
Polyhedron3
相关地址
- github https://github.com/scikit-geometry/scikit-geometry