Python 如何计算二维向量形状的中轴?

Python 如何计算二维向量形状的中轴?,python,svg,medial-axis,Python,Svg,Medial Axis,我有一个2D形状,作为SVG中的路径元素存储。这些形状由贝塞尔曲线和线段组成 我在生成的形状上也有一组空间相等的点 使用弧长参数化 如何使用SVG或这些点来确定形状的中轴 我正在使用Python,但任何形式的伪代码或算法建议都将不胜感激 下面是我正在处理的形状类型的一个示例,红点是曲线上的采样点 您可以从skimage(scikit图像)中看到代码。您将找到骨骼化代码和中轴代码(skimage.形态学.medial_axis) 可从以下地址获取来源: 该算法计算图像的中轴变换 随着距离的脊线变

我有一个2D形状,作为SVG中的路径元素存储。这些形状由贝塞尔曲线和线段组成

我在生成的形状上也有一组空间相等的点 使用弧长参数化

如何使用SVG或这些点来确定形状的中轴

我正在使用Python,但任何形式的伪代码或算法建议都将不胜感激


下面是我正在处理的形状类型的一个示例,红点是曲线上的采样点


您可以从skimage(scikit图像)中看到代码。您将找到骨骼化代码和中轴代码(skimage.形态学.medial_axis)

可从以下地址获取来源:

该算法计算图像的中轴变换 随着距离的脊线变换

该算法的不同步骤如下

A lookup table is used, that assigns 0 or 1 to each configuration of
   the 3x3 binary square, whether the central pixel should be removed
   or kept. 

We want a point to be removed if it has more than one neighbor
   and if removing it does not change the number of connected components.


The distance transform to the background is computed, as well as
   the cornerness of the pixel.

The foreground (value of 1) points are ordered by
   the distance transform, then the cornerness.

A cython function is called to reduce the image to its skeleton. It
   processes pixels in the order determined at the previous step, and
   removes or maintains a pixel according to the lookup table. 

Because
   of the ordering, it is possible to process all pixels in only one
   pass.

我希望它会帮助你

有点晚,但这里有:

上面的图片显示:(我已经用一个在线工具将OP的图像转换成SVG 因此,参差不齐的边界是红点的伪影) 1.叠加的中间轴和比例轴变换(MAT和SAT)。 2.仅缩放轴变换。 3.仅中轴变换。 4.许多双叉中的一个(见下文)。 5.SAT中的单3叉(垫子中有许多)

要查找中轴(MA)或中轴变换(MAT)(上图中的紫色曲线),请使用以下算法 可以使用(基于 由Choi、Choi、Moon和Wee编写-请参见 还处理相交形状和带孔的形状)。其他算法也存在

该算法比查找二值图像(如位图)骨架更难实现 (也称为grassfire或离散变换),但有几个优点(如分析性)。 为了简化事情,下面的讨论只处理简单的情况 (非相交)没有孔的形状

一些定义
  • 曲线-带参数t的参数化贝塞尔曲线∈ [0,1]. 换句话说,, 矢量图形中使用的典型曲线
  • 形状(Ω)-(定义直接取自论文)-“连通域的闭包” 中的有界开子集ℝ²由有限个相互不相交的 简单闭合曲线。”为了回答这个问题,可以进一步假设 这个形状没有洞。简单地说,它是由 由多条曲线给出的边界-上图中填充的灰色部分
  • 边界-形状的边界。换句话说,一个索引的曲线序列 使t=0处任何曲线的起点对应于上一条曲线 曲线在t=1处的端点。假设边界为正方向 (即,沿边界以逆时针方向行走,形状 将始终位于您的左侧)
  • 边界点-形状边界上由 标识曲线和t曲线参数的索引
  • 最大圆盘-形状内的圆盘未被任何其他圆盘遮挡 也在形状内。每个最大磁盘都可以识别 通过1个或多个(通常为2个)边界点及其中心点
  • n叉-在n处切向接触形状边界的最大圆盘 要点
  • 分支点-n>=3的n叉最大圆盘中心。换句话说 在MA平面树中形成顶点的MA上的点
  • 中轴(MA)-所有n叉中心的结合
  • 中轴变换(MAT)-所有n叉的结合。换句话说,, 定义中包括最大圆盘的半径
  • 接触点(cp)-连接到唯一最大圆盘的边界点 已经找到了
  • 锐角-边界点,通常位于曲线参数t=0或 t=1,它是不可微的(不光滑的),并且形成一个内部 角度<180°
  • 暗角-与锐角相同,但角度>180°
  • Cp图-顶点不一定是平面的图 因此,联络点也包含关于所有被发现人员的信息 最大磁盘数,然后是整个垫。图中的每个顶点(cp) 具有以下边缘:
    • 下一步-通过行走从当前接触点找到的第一个接触点 沿边界逆时针旋转
    • prev-通过行走从当前接触点找到的第一个接触点 沿边界顺时针方向
    • 下一步-通过绕路线找到的第一个接触点 逆时针方向的最大圆盘
    • prev around(上一个循环)-通过循环找到的第一个接触点 顺时针方向的最大圆盘。 我们可以将上述每一项视为接触点上的运算符(.) 通过沿边移动另一个接触点,例如,如果a是接触点, 接下来是另一个接触点
一些注释
  • 中轴变换形成一个无根平面树,树的叶子位于 每个单叉中心(包括尖角);如果形状有洞 那么MAT是一个平面图
  • 可以通过应用 缩放轴变换(SAT)(上图中的红色曲线)到MAT。这个 实现这样的转变,, 基于 研究。然而,演示通过确保SAT是一个子集来改进算法 并保证拓扑保持
算法概述
  • 找到所有的单叉;它们正是树木叶片的中轴。这些 尖角和单尖头是否与边界点接触 最大局部向内曲率。将单叉的接触点添加到cp图中。 请注意,由于单尖头只有一个接触点,因此边缘紧随其后 prev-around将再次返回找到的联系人
  • 对于一组具有代表性的边界点(