轮廓相关内容整理

轮廓

  • 从轮廓出发,推荐几个强大的几何科学库-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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值