寻求低计算成本的多边形椭圆度(Ovalness)测量算法或二分类器
低成本多边形椭圆度计算与二分类方案
一、低成本椭圆度计算算法
1. 外接椭圆拟合偏差法
先给多边形顶点做最小二乘椭圆拟合,用两个核心指标衡量椭圆度:
- 多边形面积与拟合椭圆面积的比值,越接近1说明形状越贴合椭圆
- 多边形顶点到拟合椭圆的平均距离与椭圆长半轴的比值,越小说明偏差越小
将两个指标结合,比如定义椭圆度 = (多边形面积/椭圆面积) * (1 - 平均距离/长半轴),结果越接近1,形状越符合椭圆特征。
该方法计算量小,仅涉及基础矩阵运算和距离计算,运行效率高。
2. 形状矩特征法
利用多边形的二阶中心矩算出等效椭圆的长、短半轴,再对比多边形周长与等效椭圆周长的比值:
- 计算二阶矩矩阵的特征值λ₁、λ₂,等效椭圆长半轴
a=√λ₁,短半轴b=√λ₂ - 椭圆度 = 多边形周长 / 等效椭圆周长(等效椭圆周长用近似公式:
π*(3*(a+b)-√((3a+b)(a+3b))))
该方法复杂度为O(n)(n为多边形顶点数),仅需遍历一次顶点,计算成本极低。
二、现成库函数推荐
1. OpenCV(Python/C++)
用cv2.fitEllipse()直接拟合椭圆,自行计算椭圆度:
import cv2 import numpy as np def get_ovalness(polygon): # 多边形需转换为Nx1x2的numpy数组格式 ellipse = cv2.fitEllipse(polygon) center, axes, angle = ellipse a, b = axes[0]/2, axes[1]/2 ellipse_area = np.pi * a * b poly_area = cv2.contourArea(polygon) # 计算顶点到椭圆的平均距离 total_dist = 0 rad_angle = np.radians(angle) cos_a, sin_a = np.cos(rad_angle), np.sin(rad_angle) for pt in polygon.squeeze(): dx = pt[0] - center[0] dy = pt[1] - center[1] # 坐标转换到椭圆中心坐标系并旋转对齐 x_rot = dx * cos_a + dy * sin_a y_rot = -dx * sin_a + dy * cos_a # 计算当前顶点到椭圆的距离 if abs(x_rot) > a: dist = abs(dy) if abs(dx) > abs(dy) else abs(dx) else: y_ellipse = b * np.sqrt(1 - (x_rot/a)**2) dist = abs(y_rot - y_ellipse) if y_rot > 0 else abs(y_rot + y_ellipse) total_dist += dist avg_dist = total_dist / len(polygon) ovalness = (poly_area / ellipse_area) * (1 - avg_dist / max(a, b)) return ovalness
cv2.fitEllipse()底层是优化后的最小二乘拟合,速度快,适合批量处理多边形数据。
2. Shapely + scikit-image(Python)
若已使用Shapely处理多边形,可结合skimage.measure.fit_ellipse计算椭圆度:
from shapely.geometry import Polygon from skimage.measure import fit_ellipse import numpy as np def calc_ovalness(poly_coords): poly = Polygon(poly_coords) poly_perim = poly.length # 拟合椭圆 x, y = zip(*poly_coords) xc, yc, a, b, theta = fit_ellipse(np.array(list(zip(y, x)))) # 椭圆近似周长计算 ellipse_perim = np.pi * (3*(a+b) - np.sqrt((3*a + b)*(a + 3*b))) ovalness = poly_perim / ellipse_perim return ovalness
Shapely对多边形拓扑关系的处理更便捷,适合已有多边形数据的场景。
三、椭圆/非椭圆二分类实现
- 先用上述算法计算一批标注样本的椭圆度,统计阈值范围:比如椭圆样本的椭圆度大多在0.8~1.0区间,非椭圆样本在0.6以下。
- 简单场景直接用固定阈值判断:例如椭圆度≥0.7则判定为椭圆,否则为非椭圆(阈值可根据自身样本调整)。
- 若样本复杂,可提取椭圆度、面积周长比、矩特征等输入逻辑回归模型训练轻量分类器,计算成本低且分类效果更稳定。
参考示例
- 椭圆多边形示例:

- 非椭圆多边形示例1:

- 非椭圆多边形示例2:

内容的提问来源于stack exchange,提问作者Paul Jurczak
相关产品推荐
相关产品推荐

