Skip to main content

Generic badge Tests DOI

Skeletor

Unlike its namesake, this Python 3 library does not (yet) seek to conquer Eternia but to turn meshes into skeletons.

skeletor implements a number of different skeletonization methods, including mesh contraction, edge collapse, TEASAR, wavefront propagation and mean curvature skeletons -- see documentation and benchmarks below. We also provides a number of pre-/post-processing methods to clean up in- and outputs.

Please see the changelog for a summary of recent changes.

Install

pip3 install skeletor

For the dev version:

pip3 install git+https://github.com/navis-org/skeletor@master

Dependencies

Automatically installed with pip:

  • networkx
  • numpy
  • pandas
  • scipy
  • trimesh
  • tqdm
  • python-igraph
  • ncollpyde

Optional because not strictly required for the core functions but recommended:

  • navis-fastcore for sizeable speed-ups with most methods: pip3 install navis-fastcore
  • fastremap for sizeable speed-ups with some methods: pip3 install fastremap
  • robust_laplacian for more robust Laplacian operators: pip3 install robust_laplacian
  • pyglet is required by trimesh to preview meshes/skeletons in 3D: pip3 install pyglet

Documentation

Please see the documentation for details.

The change log can be found here.

Quickstart

For the impatient a quick example:

>>> import skeletor as sk
>>> mesh = sk.example_mesh()
>>> # To load and use your own mesh instead of the example mesh:
>>> # import trimesh as tm
>>> # mesh = tm.Trimesh(vertices, faces)  # or...
>>> # mesh = tm.load_mesh('mesh.obj')
>>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False)
>>> skel = sk.skeletonize.by_wavefront(fixed, waves=1, step_size=1)
>>> skel
<Skeleton(vertices=(1258, 3), edges=(1194, 2), method=wavefront)>

All skeletonization methods return a Skeleton object. These are just convenient objects to represent and inspect the results.

>>> # location of vertices (nodes)
>>> skel.vertices
array([[16744, 36720, 26407],
       ...,
       [22076, 23217, 24472]])
>>> # child -> parent edges
>>> skel.edges
array([[  64,   31],
       ...,
       [1257, 1252]])
>>> # Mapping for mesh to skeleton vertex indices
>>> skel.mesh_map
array([ 157,  158, 1062, ...,  525,  474,  547])
>>> # SWC table
>>> skel.swc.head()
   node_id  parent_id             x             y             z    radius
0        0         -1  16744.005859  36720.058594  26407.902344  0.000000
1        1         -1   5602.751953  22266.756510  15799.991211  7.542587
2        2         -1  16442.666667  14999.978516  10887.916016  5.333333
>>> # Save SWC file
>>> skel.save_swc('skeleton.swc')

If you installed pyglet (see above) you can also use trimesh's plotting capabilities to inspect the results:

>>> skel.show(mesh=True)

skeletor_example

Benchmarks

skeletor_examples

Each panel highlights one method (data points + fit); the faint lines in the background are the fits for all the other methods, so you can compare them at a glance (note the shared, logarithmic time axis).

Benchmarks were run on an Apple M3 Max (36 Gb memory) with the optional fastremap and navis-fastcore dependencies installed. Note some of these functions (e.g. contraction and TEASAR/vertex cluster skeletonization) can vary a lot in speed based on parameterization.

Contributing

Pull requests are always welcome!

References & Acknowledgments

Mesh contraction and the edge collapse approach are based on this paper: Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.

Mean curvature skeletons are based on the following paper: Tagliasacchi A, Alhashim I, Olson M, Zhang H. Mean Curvature Skeletons. Computer Graphics Forum (SGP). 2012;31(5):1735-1744.

The wavefront approach corresponds to a Reeb graph of the geodesic distance function on the mesh: connected level sets of the distance field are collapsed to their centroids to form the skeleton. The core construction was described by: Verroust A, Lazarus F. Extracting skeletal curves from 3D scattered data. The Visual Computer. 2000;16(1):15-25. See also the Reeb graph framing in Hilaga et al., Topology Matching for Fully Automatic Similarity Estimation of 3D Shapes, SIGGRAPH 2001 and Ge et al., Data Skeletonization via Reeb Graphs, NeurIPS 2011.

Some of the code in skeletor was modified from the Py_BL_MeshSkeletonization addon for Blender 3D created by #0K Srinivasan Ramachandran and published under GPL3.

The mesh TEASAR approach was adapted from the implementation in meshparty by Sven Dorkenwald, Casey Schneider-Mizell and Forrest Collman.

Release files for skeletor 1.7.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for skeletor 1.7.1
File Size Uploaded
skeletor-1.7.1.tar.gz 230.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for skeletor 1.7.1
File Interpreter ABI Platform
skeletor-1.7.1-py3-none-any.whl Python 3 none any Details

Total release size: 475.3 kB

Release files / skeletor-1.7.1.tar.gz

Download URL skeletor-1.7.1.tar.gz
Size 230.2 kB
Tags Source
SHA-256 checksum
How to use checksums
5fcd667a96e076175f938d2d0c5e0c54beaa88105713b69ccbfa643139788f72
BLAKE2b-256 checksum
How to use checksums
aeecb76867e3d0c3954e566e36b149843ef94065ae1cdae2c12184cc9346ea64
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.14

Release files / skeletor-1.7.1-py3-none-any.whl

Download URL skeletor-1.7.1-py3-none-any.whl
Size 245.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
efaf790356f0a6288ec9a2f9e38ba2d517bfbbb99cd61722e7bf22144252ad70
BLAKE2b-256 checksum
How to use checksums
6d2ccda2f7971836614c59007216936c66fae7215b88e057c1719e68ed03eb39
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.14

Release history Release notifications | RSS feed

This release

1.7.1 This release

2 release files

1.7.0

2 release files

1.6.0

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.3

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page