skeletor
@@ -398,518 +401,526 @@Top-level functions and classes
tucked away into submodules (see side-bar or above table). -View Source
-# This script is part of skeletor (http://www.github.com/navis-org/skeletor). -# Copyright (C) 2018 Philipp Schlegel -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. - -r""" -# What is skeletor? - -Unlike its [namesake](https://en.wikipedia.org/wiki/Skeletor), this `skeletor` -does not (yet) seek to conquer Eternia but to turn meshes into skeletons. - -Before we get started some terminology: - -- a *mesh* is something that consists of *vertices* and *faces* -- a *skeleton* is a (hierarchical) tree-like structure consisting of *vertices* - (also called *nodes*) and *edges* that connect them - -Skeletons are useful for a range of reasons. For example: - -1. Typically smaller (less vertices) than the mesh -2. Have an implicit sense of topology (e.g. "this node is distal to that node") - -Extracting skeletons from meshes (or other types of data such as voxels) is -non-trivial and there are a great many research papers exploring various -different approaches (see [Google scholar](https://scholar.google.com/scholar -?hl=en&as_sdt=0%2C5&q=skeleton+extraction&btnG=)). - -`skeletor` implements some algorithms that I found useful in my work with -neurons. In my experience there is unfortuntely no magic bullet when it -comes to skeletonization and chances are you will have to fiddle around a bit -to get decent results. - -# Installation - -From PyPI: -```bash -pip3 install skeletor -``` - -For the bleeding-edge version from Github: -```bash -pip3 install git+https://github.com/navis-org/skeletor@master -``` - -# Getting started - -A skeletonization pipeline typically consists of: - -1. Some pre-processing of the mesh (e.g. fixing some potential errors like - degenerate faces, unreferenced vertices, etc.) -2. The skeletonization itself -3. Some post-processing of the skeleton (e.g. adding radius information) - ------- - -Here is a complete list of available functions: - -| function | description | -| ------------------------------------------- | ----------------------------------------------------------- | -| **example data** | | -| `skeletor.example_mesh()` | load an example mesh | -| **pre-processing** | | -| `skeletor.pre.fix_mesh()` | fix some common errors found in meshes | -| `skeletor.pre.remesh()` | re-generate mesh (uses Blender 3D) | -| `skeletor.pre.simplify()` | reduce mesh complexity (uses Blender 3D) | -| `skeletor.pre.contract()` | contract mesh to facilitate skeletonization [1] | -| **skeletonization** | | -| `skeletor.skeletonize.by_wavefront()` | very fast, works well for tubular meshes (like neurons) | -| `skeletor.skeletonize.by_vertex_clusters()` | very fast but needs mesh to be contracted (see above) | -| `skeletor.skeletonize.by_edge_collapse()` | presented in [1] but never got this to work well | -| `skeletor.skeletonize.by_teasar()` | very fast and robust, works on mesh surface | -| `skeletor.skeletonize.by_tangent_ball()` | very fast, best on smooth meshes | -| **postprocessing** | | -| `skeletor.post.clean_up()` | fix some potential errors in the skeleton | -| `skeletor.post.radii()` | add radius information using various method | - ------- - -See docstrings of the respective functions for details. - -A pipeline might look like this: - - 1. `skeletor.pre.fix_mesh()` to fix the mesh - 2. `skeletor.pre.simplify()` to simplify the mesh - 3. `skeletor.pre.contract()` to contract the mesh [1] - 4. `skeletor.skeletonize.vertex_clusters()` to generate a skeleton - 5. `skeletor.post.clean_up()` to clean up some potential issues with the skeleton - 6. `skeletor.post.radii()` to extract radii either by k-nearest neighbours or ray-casting - -In my experience there is no one-size-fits-all. You will have to play around to -find the right approach and parameters to get nice skeletons for your meshes. -If you need help just open an [issue](https://github.com/navis-org/skeletor/issues). - -Also check out the Gotchas below! - -# Examples - -First load the example mesh (a fruit fly neuron): - -```Python ->>> import skeletor as sk ->>> mesh = sk.example_mesh() ->>> mesh -<trimesh.Trimesh(vertices.shape=(6582, 3), faces.shape=(13772, 3))> -``` - -Next see if there is stuff to fix in the mesh (degenerate faces, duplicate -vertices, etc.): - -```Python ->>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False) ->>> fixed -<trimesh.Trimesh(vertices.shape=(6213, 3), faces.shape=(12805, 3))> -``` - -Now for tubular meshes like this neuron, the "wave front" skeletonization method -performs really well: it works by casting waves across the mesh and collapsing -the resulting rings into a skeleton (kinda like when you throw a stone in a -pond and track the expanding ripples). - -```Python ->>> 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 bundle the various outputs of the skeletonization. - -```Python ->>> # x/y/z location of skeleton 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 -``` - -SWC is a commonly used format for saving skeletons. `Skeleton` objects -have a method for quickly saving a correctly formatted SWC file: - -```Python ->>> skel.save_swc('~/Documents/my_skeleton.swc') -``` - -If you installed `pyglet` (see above) you can also use `trimesh`'s plotting -capabilities to inspect the results: - -```Python ->>> skel.show(mesh=True) -``` - -<img src="https://github.com/navis-org/skeletor/raw/master/_static/example1.png" alt="skeletor_example" width="100%"/> - -That looks pretty good already but let's run some pro-forma postprocessing. - -```Python ->>> sk.post.clean_up(skel, inplace=True) -<Skeleton(vertices=(1071, 3), edges=(1070, 2))> -``` - -So that would be a full pipeline mesh to skeleton. Don't expect your own meshes -to produce such nice results off the bat though. Chances are you will need to -play around to find the right recipe. If you don't know where to start, I suggest -you try out mesh contraction + vertex clustering first: - -```Python ->>> import skeletor as sk ->>> mesh = sk.example_mesh() ->>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False) ->>> # Contract mesh to 10% (0.1) of original volume ->>> cont = sk.pre.contract(fixed, epsilon=0.1) ->>> # Skeletonize ->>> skel = sk.skeletonize.by_vertex_clusters(cont, sampling_dist=100) ->>> # Replace contracted mesh with original for postprocessing and plotting ->>> skel.mesh = fixed ->>> # Add radii (vertex cluster method does not do that automatically) ->>> sk.post.radii(skel, method='knn') ->>> skel.show(mesh=True) -``` - -# Gotchas - -- while this is a general purpose library, my personal focus is on neurons and - this has certainly influenced things like default parameter values and certain - post-processing steps -- meshes need to be triangular (we are using `trimesh`) -- use `sk.pre.simplify` if your mesh is very complex (half a million vertices is - where things start getting sluggish) -- a good mesh contraction is often half the battle -- if the mesh consists of multiple disconnected pieces the skeleton will - likewise be fragmented (i.e. will have multiple roots) - -# Benchmarks - -<img src="https://github.com/navis-org/skeletor/raw/master/benchmarks/benchmark_2.png" alt="skeletor_benchmark" width="100%"/> - -[Benchmarks](https://github.com/navis-org/skeletor/blob/master/benchmarks/skeletor_benchmark.ipynb) -were run on a 2018 MacBook Pro (2.2 GHz Core i7, 32Gb memory) with optional -`fastremap` dependency installed. Note some of these functions (e.g. -contraction and TEASAR/vertex cluster skeletonization) vary a lot in -speed based on parameterization. - -# What about algorithm `X`? - -`skeletor` contains some algorithms that I found easy enough to implement -and useful for my work with neurons. If you have some interesting paper/approach -that could make a nice addition to `skeletor`, please get in touch on Github. -Pull requests are always welcome! - -# References - -`[1] 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.` - -The abstract and the paper can be found [here](http://visgraph.cse.ust.hk/projects/skeleton/). -Also see [this](https://www.youtube.com/watch?v=-H7n59YQCRM&feature=youtu.be) YouTube video. - -Some of the code in skeletor was modified from the -[Py_BL_MeshSkeletonization](https://github.com/aalavandhaann/Py_BL_MeshSkeletonization) -addon created by #0K Srinivasan Ramachandran and published under GPL3. - -# Top-level functions and classes -At top-level we only expose `example_mesh()` and the `Skeleton` class (which -you probably won't ever need to touch manually). Everything else is neatly -tucked away into submodules (see side-bar or above table). - -""" - -__version__ = "1.2.0" -__version_vector__ = (1, 2, 0) - -from . import skeletonize -from . import pre -from . import post - -from .skeletonize.base import Skeleton -from .data import example_mesh + + + + +-__docformat__ = "numpy" - -__all__ = ['Skeleton', 'example_mesh', 'pre', 'post', 'skeletonize'] -1# This script is part of skeletor (http://www.github.com/navis-org/skeletor). + 2# Copyright (C) 2018 Philipp Schlegel + 3# + 4# This program is free software: you can redistribute it and/or modify + 5# it under the terms of the GNU General Public License as published by + 6# the Free Software Foundation, either version 3 of the License, or + 7# (at your option) any later version. + 8# + 9# This program is distributed in the hope that it will be useful, + 10# but WITHOUT ANY WARRANTY; without even the implied warranty of + 11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 12# GNU General Public License for more details. + 13# + 14# You should have received a copy of the GNU General Public License + 15# along with this program. + 16 + 17r""" + 18# What is skeletor? + 19 + 20Unlike its [namesake](https://en.wikipedia.org/wiki/Skeletor), this `skeletor` + 21does not (yet) seek to conquer Eternia but to turn meshes into skeletons. + 22 + 23Before we get started some terminology: + 24 + 25- a *mesh* is something that consists of *vertices* and *faces* + 26- a *skeleton* is a (hierarchical) tree-like structure consisting of *vertices* + 27 (also called *nodes*) and *edges* that connect them + 28 + 29Skeletons are useful for a range of reasons. For example: + 30 + 311. Typically smaller (less vertices) than the mesh + 322. Have an implicit sense of topology (e.g. "this node is distal to that node") + 33 + 34Extracting skeletons from meshes (or other types of data such as voxels) is + 35non-trivial and there are a great many research papers exploring various + 36different approaches (see [Google scholar](https://scholar.google.com/scholar + 37?hl=en&as_sdt=0%2C5&q=skeleton+extraction&btnG=)). + 38 + 39`skeletor` implements some algorithms that I found useful in my work with + 40neurons. In my experience there is unfortuntely no magic bullet when it + 41comes to skeletonization and chances are you will have to fiddle around a bit + 42to get decent results. + 43 + 44# Installation + 45 + 46From PyPI: + 47```bash + 48pip3 install skeletor + 49``` + 50 + 51For the bleeding-edge version from Github: + 52```bash + 53pip3 install git+https://github.com/navis-org/skeletor@master + 54``` + 55 + 56# Getting started + 57 + 58A skeletonization pipeline typically consists of: + 59 + 601. Some pre-processing of the mesh (e.g. fixing some potential errors like + 61 degenerate faces, unreferenced vertices, etc.) + 622. The skeletonization itself + 633. Some post-processing of the skeleton (e.g. adding radius information) + 64 + 65------ + 66 + 67Here is a complete list of available functions: + 68 + 69| function | description | + 70| ------------------------------------------- | ----------------------------------------------------------- | + 71| **example data** | | + 72| `skeletor.example_mesh()` | load an example mesh | + 73| **pre-processing** | | + 74| `skeletor.pre.fix_mesh()` | fix some common errors found in meshes | + 75| `skeletor.pre.remesh()` | re-generate mesh (uses Blender 3D) | + 76| `skeletor.pre.simplify()` | reduce mesh complexity (uses Blender 3D) | + 77| `skeletor.pre.contract()` | contract mesh to facilitate skeletonization [1] | + 78| **skeletonization** | | + 79| `skeletor.skeletonize.by_wavefront()` | very fast, works well for tubular meshes (like neurons) | + 80| `skeletor.skeletonize.by_vertex_clusters()` | very fast but needs mesh to be contracted (see above) | + 81| `skeletor.skeletonize.by_edge_collapse()` | presented in [1] but never got this to work well | + 82| `skeletor.skeletonize.by_teasar()` | very fast and robust, works on mesh surface | + 83| `skeletor.skeletonize.by_tangent_ball()` | very fast, best on smooth meshes | + 84| **postprocessing** | | + 85| `skeletor.post.clean_up()` | fix some potential errors in the skeleton | + 86| `skeletor.post.radii()` | add radius information using various method | + 87 + 88------ + 89 + 90See docstrings of the respective functions for details. + 91 + 92A pipeline might look like this: + 93 + 94 1. `skeletor.pre.fix_mesh()` to fix the mesh + 95 2. `skeletor.pre.simplify()` to simplify the mesh + 96 3. `skeletor.pre.contract()` to contract the mesh [1] + 97 4. `skeletor.skeletonize.vertex_clusters()` to generate a skeleton + 98 5. `skeletor.post.clean_up()` to clean up some potential issues with the skeleton + 99 6. `skeletor.post.radii()` to extract radii either by k-nearest neighbours or ray-casting +100 +101In my experience there is no one-size-fits-all. You will have to play around to +102find the right approach and parameters to get nice skeletons for your meshes. +103If you need help just open an [issue](https://github.com/navis-org/skeletor/issues). +104 +105Also check out the Gotchas below! +106 +107# Examples +108 +109First load the example mesh (a fruit fly neuron): +110 +111```Python +112>>> import skeletor as sk +113>>> mesh = sk.example_mesh() +114>>> mesh +115<trimesh.Trimesh(vertices.shape=(6582, 3), faces.shape=(13772, 3))> +116``` +117 +118Next see if there is stuff to fix in the mesh (degenerate faces, duplicate +119vertices, etc.): +120 +121```Python +122>>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False) +123>>> fixed +124<trimesh.Trimesh(vertices.shape=(6213, 3), faces.shape=(12805, 3))> +125``` +126 +127Now for tubular meshes like this neuron, the "wave front" skeletonization method +128performs really well: it works by casting waves across the mesh and collapsing +129the resulting rings into a skeleton (kinda like when you throw a stone in a +130pond and track the expanding ripples). +131 +132```Python +133>>> skel = sk.skeletonize.by_wavefront(fixed, waves=1, step_size=1) +134>>> skel +135<Skeleton(vertices=(1258, 3), edges=(1194, 2), method=wavefront)> +136``` +137 +138All skeletonization methods return a `Skeleton` object. These are just +139convenient objects to bundle the various outputs of the skeletonization. +140 +141```Python +142>>> # x/y/z location of skeleton vertices (nodes) +143>>> skel.vertices +144array([[16744, 36720, 26407], +145 ..., +146 [22076, 23217, 24472]]) +147>>> # child -> parent edges +148>>> skel.edges +149array([[ 64, 31], +150 ..., +151 [1257, 1252]]) +152>>> # Mapping for mesh to skeleton vertex indices +153>>> skel.mesh_map +154array([ 157, 158, 1062, ..., 525, 474, 547]) +155>>> # SWC table +156>>> skel.swc.head() +157 node_id parent_id x y z radius +1580 0 -1 16744.005859 36720.058594 26407.902344 0.000000 +1591 1 -1 5602.751953 22266.756510 15799.991211 7.542587 +1602 2 -1 16442.666667 14999.978516 10887.916016 5.333333 +161``` +162 +163SWC is a commonly used format for saving skeletons. `Skeleton` objects +164have a method for quickly saving a correctly formatted SWC file: +165 +166```Python +167>>> skel.save_swc('~/Documents/my_skeleton.swc') +168``` +169 +170If you installed `pyglet` (see above) you can also use `trimesh`'s plotting +171capabilities to inspect the results: +172 +173```Python +174>>> skel.show(mesh=True) +175``` +176 +177<img src="https://github.com/navis-org/skeletor/raw/master/_static/example1.png" alt="skeletor_example" width="100%"/> +178 +179That looks pretty good already but let's run some pro-forma postprocessing. +180 +181```Python +182>>> sk.post.clean_up(skel, inplace=True) +183<Skeleton(vertices=(1071, 3), edges=(1070, 2))> +184``` +185 +186So that would be a full pipeline mesh to skeleton. Don't expect your own meshes +187to produce such nice results off the bat though. Chances are you will need to +188play around to find the right recipe. If you don't know where to start, I suggest +189you try out mesh contraction + vertex clustering first: +190 +191```Python +192>>> import skeletor as sk +193>>> mesh = sk.example_mesh() +194>>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False) +195>>> # Contract mesh to 10% (0.1) of original volume +196>>> cont = sk.pre.contract(fixed, epsilon=0.1) +197>>> # Skeletonize +198>>> skel = sk.skeletonize.by_vertex_clusters(cont, sampling_dist=100) +199>>> # Replace contracted mesh with original for postprocessing and plotting +200>>> skel.mesh = fixed +201>>> # Add radii (vertex cluster method does not do that automatically) +202>>> sk.post.radii(skel, method='knn') +203>>> skel.show(mesh=True) +204``` +205 +206# Gotchas +207 +208- while this is a general purpose library, my personal focus is on neurons and +209 this has certainly influenced things like default parameter values and certain +210 post-processing steps +211- meshes need to be triangular (we are using `trimesh`) +212- use `sk.pre.simplify` if your mesh is very complex (half a million vertices is +213 where things start getting sluggish) +214- a good mesh contraction is often half the battle +215- if the mesh consists of multiple disconnected pieces the skeleton will +216 likewise be fragmented (i.e. will have multiple roots) +217 +218# Benchmarks +219 +220<img src="https://github.com/navis-org/skeletor/raw/master/benchmarks/benchmark_2.png" alt="skeletor_benchmark" width="100%"/> +221 +222[Benchmarks](https://github.com/navis-org/skeletor/blob/master/benchmarks/skeletor_benchmark.ipynb) +223were run on a 2018 MacBook Pro (2.2 GHz Core i7, 32Gb memory) with optional +224`fastremap` dependency installed. Note some of these functions (e.g. +225contraction and TEASAR/vertex cluster skeletonization) vary a lot in +226speed based on parameterization. +227 +228# What about algorithm `X`? +229 +230`skeletor` contains some algorithms that I found easy enough to implement +231and useful for my work with neurons. If you have some interesting paper/approach +232that could make a nice addition to `skeletor`, please get in touch on Github. +233Pull requests are always welcome! +234 +235# References +236 +237`[1] 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.` +238 +239The abstract and the paper can be found [here](http://visgraph.cse.ust.hk/projects/skeleton/). +240Also see [this](https://www.youtube.com/watch?v=-H7n59YQCRM&feature=youtu.be) YouTube video. +241 +242Some of the code in skeletor was modified from the +243[Py_BL_MeshSkeletonization](https://github.com/aalavandhaann/Py_BL_MeshSkeletonization) +244addon created by #0K Srinivasan Ramachandran and published under GPL3. +245 +246# Top-level functions and classes +247At top-level we only expose `example_mesh()` and the `Skeleton` class (which +248you probably won't ever need to touch manually). Everything else is neatly +249tucked away into submodules (see side-bar or above table). +250 +251""" +252 +253__version__ = "1.2.1" +254__version_vector__ = (1, 2, 1) +255 +256from . import skeletonize +257from . import pre +258from . import post +259 +260from .skeletonize.base import Skeleton +261from .data import example_mesh +262 +263__docformat__ = "numpy" +264 +265__all__ = ['Skeleton', 'example_mesh', 'pre', 'post', 'skeletonize'] +
View Source
-class Skeleton: - """Class representing a skeleton. - - Typically returned as results from a skeletonization. - - Attributes - ---------- - swc : pd.DataFrame, optional - SWC table. - vertices : (N, 3) array - Vertex (node) positions. - edges : (M, 2) array - Indices of connected vertex pairs. - radii : (N, ) array, optional - Radii for each vertex (node) in the skeleton. - mesh : trimesh, optional - The original mesh. - mesh_map : array, optional - Same length as ``mesh``. Maps mesh vertices to vertices (nodes) - in the skeleton. - skel_map : array of arrays, optional - Inverse of `mesh_map`: maps skeleton vertices (nodes) to mesh - vertices. - method : str, optional - Which method was used to generate the skeleton. - - """ - - def __init__(self, swc, mesh=None, mesh_map=None, method=None): - self.swc = swc - self.mesh = mesh - self.mesh_map = mesh_map - self.method = method - - def __str__(self): - """Summary.""" - return self.__repr__() - - def __repr__(self): - """Return quick summary of the skeleton's geometry.""" - elements = [] - if hasattr(self, 'vertices'): - elements.append(f'vertices={self.vertices.shape}') - if hasattr(self, 'edges'): - elements.append(f'edges={self.edges.shape}') - if hasattr(self, 'method'): - elements.append(f'method={self.method}') - return f'<Skeleton({", ".join(elements)})>' - - @property - def edges(self): - """Return skeleton edges.""" - return self.swc.loc[self.swc.parent_id >= 0, - ['node_id', 'parent_id']].values - - @property - def vertices(self): - """Return skeleton vertices (nodes).""" - return self.swc[['x', 'y', 'z']].values - - @property - def radius(self): - """Return radii.""" - if 'radius' not in self.swc.columns: - raise ValueError('No radius info found. Run `skeletor.post.radii()`' - ' to get them.') - return self.swc['radius'].values, - - @property - def skeleton(self): - """Skeleton as trimesh Path3D.""" - if not hasattr(self, '_skeleton'): - lines = [tm.path.entities.Line(e) for e in self.edges] - - self._skeleton = tm.path.Path3D(entities=lines, - vertices=self.vertices, - process=False) - return self._skeleton - - @property - def skel_map(self): - """Skeleton vertex (nodes) to mesh vertices. Based on `mesh_map`.""" - if isinstance(self.mesh_map, type(None)): - return None - return pd.DataFrame(self.mesh_map - ).reset_index(drop=False - ).groupby(0)['index'].apply(np.array - ).values - - def reindex(self, inplace=False): - """Clean up skeleton.""" - x = self - if not inplace: - x = x.copy() - - # Re-index to make node IDs continous again - x.swc, new_ids = reindex_swc(x.swc) - - # Update mesh map - if not isinstance(x.mesh_map, type(None)): - x.mesh_map = np.array([new_ids.get(i, i) for i in x.mesh_map]) - - if not inplace: - return x - - def copy(self): - """Return copy of the skeleton.""" - return Skeleton(swc=self.swc.copy() if not isinstance(self.swc, type(None)) else None, - mesh=self.mesh.copy() if not isinstance(self.mesh, type(None)) else None, - mesh_map=self.mesh_map.copy() if not isinstance(self.mesh_map, type(None)) else None) - - def get_graph(self): - """Generate networkX representation of the skeletons. - - Distance between nodes will be used as edge weights. - - Returns - ------- - networkx.DiGraph - - """ - not_root = self.swc.parent_id >= 0 - nodes = self.swc.loc[not_root] - parents = self.swc.set_index('node_id').loc[self.swc.loc[not_root, 'parent_id'].values] - - dists = nodes[['x', 'y', 'z']].values - parents[['x', 'y', 'z']].values - dists = np.sqrt((dists ** 2).sum(axis=1)) - - G = nx.DiGraph() - G.add_weighted_edges_from([(s, t, w) for s, t, w in zip(nodes, parents, dists)]) - - return G - - def save_swc(self, filepath): - """Save skeleton in SWC format. - - Parameters - ---------- - filepath : path-like - Filepath to save SWC to. - - """ - header = dedent(f"""\ - # SWC format file - # based on specifications at http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html - # Created on {datetime.date.today()} using skeletor (https://github.com/navis-org/skeletor) - # PointNo Label X Y Z Radius Parent - # Labels: - # 0 = undefined, 1 = soma, 5 = fork point, 6 = end point - """) - - # Make copy of SWC table - swc = self.swc.copy() - - # Set all labels to undefined - swc['label'] = 0 - swc.loc[~swc.node_id.isin(swc.parent_id.values), 'label'] = 6 - n_childs = swc.groupby('parent_id').size() - bp = n_childs[n_childs > 1].index.values - swc.loc[swc.node_id.isin(bp), 'label'] = 5 - - # Add radius if missing - if 'radius' not in swc.columns: - swc['radius'] = 0 - - # Get things in order - swc = swc[['node_id', 'label', 'x', 'y', 'z', 'radius', 'parent_id']] - - # Adjust column titles - swc.columns = ['PointNo', 'Label', 'X', 'Y', 'Z', 'Radius', 'Parent'] - - with open(filepath, 'w') as file: - # Write header - file.write(header) - - # Write data - writer = csv.writer(file, delimiter=' ') - writer.writerows(swc.astype(str).values) - - def scene(self, mesh=False, **kwargs): - """Return a Scene object containing the skeleton. - - Returns - ------- - scene : trimesh.scene.scene.Scene - Contains the skeleton and optionally the mesh. + - """ - if mesh: - if isinstance(self.mesh, type(None)): - raise ValueError('Skeleton has no mesh.') - - self.mesh.visual.face_colors = [100, 100, 100, 100] - - # Note the copy(): without it the transform in show() changes - # the original meshes - sc = tm.Scene([self.mesh.copy(), self.skeleton.copy()], **kwargs) - else: - sc = tm.Scene(self.skeleton.copy(), **kwargs) - - return sc - - def show(self, mesh=False, **kwargs): - """Render the skeleton in an opengl window. Requires pyglet. - - Parameters - ---------- - mesh : bool - If True, will render transparent mesh on top of the - skeleton. - - Returns - -------- - scene : trimesh.scene.Scene - Scene with skeleton in it. - - """ - scene = self.scene(mesh=mesh) - - # I encountered some issues if object space is big and the easiest - # way to work around this is to apply a transform such that the - # coordinates have -5 to +5 bounds - fac = 5 / np.fabs(self.skeleton.bounds).max() - scene.apply_transform(np.diag([fac, fac, fac, 1])) - - return scene.show(**kwargs) -
33class Skeleton: + 34 """Class representing a skeleton. + 35 + 36 Typically returned as results from a skeletonization. + 37 + 38 Attributes + 39 ---------- + 40 swc : pd.DataFrame, optional + 41 SWC table. + 42 vertices : (N, 3) array + 43 Vertex (node) positions. + 44 edges : (M, 2) array + 45 Indices of connected vertex pairs. + 46 radii : (N, ) array, optional + 47 Radii for each vertex (node) in the skeleton. + 48 mesh : trimesh, optional + 49 The original mesh. + 50 mesh_map : array, optional + 51 Same length as ``mesh``. Maps mesh vertices to vertices (nodes) + 52 in the skeleton. + 53 skel_map : array of arrays, optional + 54 Inverse of `mesh_map`: maps skeleton vertices (nodes) to mesh + 55 vertices. + 56 method : str, optional + 57 Which method was used to generate the skeleton. + 58 + 59 """ + 60 + 61 def __init__(self, swc, mesh=None, mesh_map=None, method=None): + 62 self.swc = swc + 63 self.mesh = mesh + 64 self.mesh_map = mesh_map + 65 self.method = method + 66 + 67 def __str__(self): + 68 """Summary.""" + 69 return self.__repr__() + 70 + 71 def __repr__(self): + 72 """Return quick summary of the skeleton's geometry.""" + 73 elements = [] + 74 if hasattr(self, 'vertices'): + 75 elements.append(f'vertices={self.vertices.shape}') + 76 if hasattr(self, 'edges'): + 77 elements.append(f'edges={self.edges.shape}') + 78 if hasattr(self, 'method'): + 79 elements.append(f'method={self.method}') + 80 return f'<Skeleton({", ".join(elements)})>' + 81 + 82 @property + 83 def edges(self): + 84 """Return skeleton edges.""" + 85 return self.swc.loc[self.swc.parent_id >= 0, + 86 ['node_id', 'parent_id']].values + 87 + 88 @property + 89 def vertices(self): + 90 """Return skeleton vertices (nodes).""" + 91 return self.swc[['x', 'y', 'z']].values + 92 + 93 @property + 94 def radius(self): + 95 """Return radii.""" + 96 if 'radius' not in self.swc.columns: + 97 raise ValueError('No radius info found. Run `skeletor.post.radii()`' + 98 ' to get them.') + 99 return self.swc['radius'].values, +100 +101 @property +102 def skeleton(self): +103 """Skeleton as trimesh Path3D.""" +104 if not hasattr(self, '_skeleton'): +105 lines = [tm.path.entities.Line(e) for e in self.edges] +106 +107 self._skeleton = tm.path.Path3D(entities=lines, +108 vertices=self.vertices, +109 process=False) +110 return self._skeleton +111 +112 @property +113 def skel_map(self): +114 """Skeleton vertex (nodes) to mesh vertices. Based on `mesh_map`.""" +115 if isinstance(self.mesh_map, type(None)): +116 return None +117 return pd.DataFrame(self.mesh_map +118 ).reset_index(drop=False +119 ).groupby(0)['index'].apply(np.array +120 ).values +121 +122 @property +123 def leafs(self): +124 """Leaf nodes (includes root).""" +125 swc = self.swc +126 leafs = swc[~swc.node_id.isin(swc.parent_id.values) | (swc.parent_id < 0)] +127 return leafs.copy() +128 +129 def reindex(self, inplace=False): +130 """Clean up skeleton.""" +131 x = self +132 if not inplace: +133 x = x.copy() +134 +135 # Re-index to make node IDs continous again +136 x.swc, new_ids = reindex_swc(x.swc) +137 +138 # Update mesh map +139 if not isinstance(x.mesh_map, type(None)): +140 x.mesh_map = np.array([new_ids.get(i, i) for i in x.mesh_map]) +141 +142 if not inplace: +143 return x +144 +145 def copy(self): +146 """Return copy of the skeleton.""" +147 return Skeleton(swc=self.swc.copy() if not isinstance(self.swc, type(None)) else None, +148 mesh=self.mesh.copy() if not isinstance(self.mesh, type(None)) else None, +149 mesh_map=self.mesh_map.copy() if not isinstance(self.mesh_map, type(None)) else None) +150 +151 def get_graph(self): +152 """Generate networkX representation of the skeletons. +153 +154 Distance between nodes will be used as edge weights. +155 +156 Returns +157 ------- +158 networkx.DiGraph +159 +160 """ +161 not_root = self.swc.parent_id >= 0 +162 nodes = self.swc.loc[not_root] +163 parents = self.swc.set_index('node_id').loc[self.swc.loc[not_root, 'parent_id'].values] +164 +165 dists = nodes[['x', 'y', 'z']].values - parents[['x', 'y', 'z']].values +166 dists = np.sqrt((dists ** 2).sum(axis=1)) +167 +168 G = nx.DiGraph() +169 G.add_weighted_edges_from([(s, t, w) for s, t, w in zip(nodes.node_id.values, +170 nodes.parent_id.values, dists)]) +171 +172 return G +173 +174 def save_swc(self, filepath): +175 """Save skeleton in SWC format. +176 +177 Parameters +178 ---------- +179 filepath : path-like +180 Filepath to save SWC to. +181 +182 """ +183 header = dedent(f"""\ +184 # SWC format file +185 # based on specifications at http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html +186 # Created on {datetime.date.today()} using skeletor (https://github.com/navis-org/skeletor) +187 # PointNo Label X Y Z Radius Parent +188 # Labels: +189 # 0 = undefined, 1 = soma, 5 = fork point, 6 = end point +190 """) +191 +192 # Make copy of SWC table +193 swc = self.swc.copy() +194 +195 # Set all labels to undefined +196 swc['label'] = 0 +197 swc.loc[~swc.node_id.isin(swc.parent_id.values), 'label'] = 6 +198 n_childs = swc.groupby('parent_id').size() +199 bp = n_childs[n_childs > 1].index.values +200 swc.loc[swc.node_id.isin(bp), 'label'] = 5 +201 +202 # Add radius if missing +203 if 'radius' not in swc.columns: +204 swc['radius'] = 0 +205 +206 # Get things in order +207 swc = swc[['node_id', 'label', 'x', 'y', 'z', 'radius', 'parent_id']] +208 +209 # Adjust column titles +210 swc.columns = ['PointNo', 'Label', 'X', 'Y', 'Z', 'Radius', 'Parent'] +211 +212 with open(filepath, 'w') as file: +213 # Write header +214 file.write(header) +215 +216 # Write data +217 writer = csv.writer(file, delimiter=' ') +218 writer.writerows(swc.astype(str).values) +219 +220 def scene(self, mesh=False, **kwargs): +221 """Return a Scene object containing the skeleton. +222 +223 Returns +224 ------- +225 scene : trimesh.scene.scene.Scene +226 Contains the skeleton and optionally the mesh. +227 +228 """ +229 if mesh: +230 if isinstance(self.mesh, type(None)): +231 raise ValueError('Skeleton has no mesh.') +232 +233 self.mesh.visual.face_colors = [100, 100, 100, 100] +234 +235 # Note the copy(): without it the transform in show() changes +236 # the original meshes +237 sc = tm.Scene([self.mesh.copy(), self.skeleton.copy()], **kwargs) +238 else: +239 sc = tm.Scene(self.skeleton.copy(), **kwargs) +240 +241 return sc +242 +243 def show(self, mesh=False, **kwargs): +244 """Render the skeleton in an opengl window. Requires pyglet. +245 +246 Parameters +247 ---------- +248 mesh : bool +249 If True, will render transparent mesh on top of the +250 skeleton. +251 +252 Returns +253 -------- +254 scene : trimesh.scene.Scene +255 Scene with skeleton in it. +256 +257 """ +258 scene = self.scene(mesh=mesh) +259 +260 # I encountered some issues if object space is big and the easiest +261 # way to work around this is to apply a transform such that the +262 # coordinates have -5 to +5 bounds +263 fac = 5 / np.fabs(self.skeleton.bounds).max() +264 scene.apply_transform(np.diag([fac, fac, fac, 1])) +265 +266 return scene.show(**kwargs) +
Class representing a skeleton.
@@ -941,32 +952,33 @@Attributes
View Source
-def __init__(self, swc, mesh=None, mesh_map=None, method=None): - self.swc = swc - self.mesh = mesh - self.mesh_map = mesh_map - self.method = method -
Return skeleton vertices (nodes).
Attributes
Skeleton as trimesh Path3D.
Attributes
Leaf nodes (includes root).
+View Source
-def reindex(self, inplace=False): - """Clean up skeleton.""" - x = self - if not inplace: - x = x.copy() - # Re-index to make node IDs continous again - x.swc, new_ids = reindex_swc(x.swc) +
129 def reindex(self, inplace=False): +130 """Clean up skeleton.""" +131 x = self +132 if not inplace: +133 x = x.copy() +134 +135 # Re-index to make node IDs continous again +136 x.swc, new_ids = reindex_swc(x.swc) +137 +138 # Update mesh map +139 if not isinstance(x.mesh_map, type(None)): +140 x.mesh_map = np.array([new_ids.get(i, i) for i in x.mesh_map]) +141 +142 if not inplace: +143 return x +
Clean up skeleton.
Attributes
View Source
-def copy(self): - """Return copy of the skeleton.""" - return Skeleton(swc=self.swc.copy() if not isinstance(self.swc, type(None)) else None, - mesh=self.mesh.copy() if not isinstance(self.mesh, type(None)) else None, - mesh_map=self.mesh_map.copy() if not isinstance(self.mesh_map, type(None)) else None) -
145 def copy(self): +146 """Return copy of the skeleton.""" +147 return Skeleton(swc=self.swc.copy() if not isinstance(self.swc, type(None)) else None, +148 mesh=self.mesh.copy() if not isinstance(self.mesh, type(None)) else None, +149 mesh_map=self.mesh_map.copy() if not isinstance(self.mesh_map, type(None)) else None) +
Return copy of the skeleton.
Attributes
View Source
-def get_graph(self): - """Generate networkX representation of the skeletons. - - Distance between nodes will be used as edge weights. - - Returns - ------- - networkx.DiGraph - - """ - not_root = self.swc.parent_id >= 0 - nodes = self.swc.loc[not_root] - parents = self.swc.set_index('node_id').loc[self.swc.loc[not_root, 'parent_id'].values] + ++ + def + get_graph(self) - dists = nodes[['x', 'y', 'z']].values - parents[['x', 'y', 'z']].values - dists = np.sqrt((dists ** 2).sum(axis=1)) + - G = nx.DiGraph() - G.add_weighted_edges_from([(s, t, w) for s, t, w in zip(nodes, parents, dists)]) - - return G -+
151 def get_graph(self): +152 """Generate networkX representation of the skeletons. +153 +154 Distance between nodes will be used as edge weights. +155 +156 Returns +157 ------- +158 networkx.DiGraph +159 +160 """ +161 not_root = self.swc.parent_id >= 0 +162 nodes = self.swc.loc[not_root] +163 parents = self.swc.set_index('node_id').loc[self.swc.loc[not_root, 'parent_id'].values] +164 +165 dists = nodes[['x', 'y', 'z']].values - parents[['x', 'y', 'z']].values +166 dists = np.sqrt((dists ** 2).sum(axis=1)) +167 +168 G = nx.DiGraph() +169 G.add_weighted_edges_from([(s, t, w) for s, t, w in zip(nodes.node_id.values, +170 nodes.parent_id.values, dists)]) +171 +172 return G +
Generate networkX representation of the skeletons.
@@ -1128,63 +1158,63 @@Returns
174 def save_swc(self, filepath): +175 """Save skeleton in SWC format. +176 +177 Parameters +178 ---------- +179 filepath : path-like +180 Filepath to save SWC to. +181 +182 """ +183 header = dedent(f"""\ +184 # SWC format file +185 # based on specifications at http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html +186 # Created on {datetime.date.today()} using skeletor (https://github.com/navis-org/skeletor) +187 # PointNo Label X Y Z Radius Parent +188 # Labels: +189 # 0 = undefined, 1 = soma, 5 = fork point, 6 = end point +190 """) +191 +192 # Make copy of SWC table +193 swc = self.swc.copy() +194 +195 # Set all labels to undefined +196 swc['label'] = 0 +197 swc.loc[~swc.node_id.isin(swc.parent_id.values), 'label'] = 6 +198 n_childs = swc.groupby('parent_id').size() +199 bp = n_childs[n_childs > 1].index.values +200 swc.loc[swc.node_id.isin(bp), 'label'] = 5 +201 +202 # Add radius if missing +203 if 'radius' not in swc.columns: +204 swc['radius'] = 0 +205 +206 # Get things in order +207 swc = swc[['node_id', 'label', 'x', 'y', 'z', 'radius', 'parent_id']] +208 +209 # Adjust column titles +210 swc.columns = ['PointNo', 'Label', 'X', 'Y', 'Z', 'Radius', 'Parent'] +211 +212 with open(filepath, 'w') as file: +213 # Write header +214 file.write(header) +215 +216 # Write data +217 writer = csv.writer(file, delimiter=' ') +218 writer.writerows(swc.astype(str).values) +
View Source
-def save_swc(self, filepath): - """Save skeleton in SWC format. - - Parameters - ---------- - filepath : path-like - Filepath to save SWC to. - - """ - header = dedent(f"""\ - # SWC format file - # based on specifications at http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html - # Created on {datetime.date.today()} using skeletor (https://github.com/navis-org/skeletor) - # PointNo Label X Y Z Radius Parent - # Labels: - # 0 = undefined, 1 = soma, 5 = fork point, 6 = end point - """) - - # Make copy of SWC table - swc = self.swc.copy() - - # Set all labels to undefined - swc['label'] = 0 - swc.loc[~swc.node_id.isin(swc.parent_id.values), 'label'] = 6 - n_childs = swc.groupby('parent_id').size() - bp = n_childs[n_childs > 1].index.values - swc.loc[swc.node_id.isin(bp), 'label'] = 5 - - # Add radius if missing - if 'radius' not in swc.columns: - swc['radius'] = 0 - - # Get things in order - swc = swc[['node_id', 'label', 'x', 'y', 'z', 'radius', 'parent_id']] - - # Adjust column titles - swc.columns = ['PointNo', 'Label', 'X', 'Y', 'Z', 'Radius', 'Parent'] - - with open(filepath, 'w') as file: - # Write header - file.write(header) - - # Write data - writer = csv.writer(file, delimiter=' ') - writer.writerows(swc.astype(str).values) -
Save skeleton in SWC format.
@@ -1199,40 +1229,40 @@Parameters
View Source
-def scene(self, mesh=False, **kwargs): - """Return a Scene object containing the skeleton. - - Returns - ------- - scene : trimesh.scene.scene.Scene - Contains the skeleton and optionally the mesh. + ++ + def + scene(self, mesh=False, **kwargs) - """ - if mesh: - if isinstance(self.mesh, type(None)): - raise ValueError('Skeleton has no mesh.') + - self.mesh.visual.face_colors = [100, 100, 100, 100] - - # Note the copy(): without it the transform in show() changes - # the original meshes - sc = tm.Scene([self.mesh.copy(), self.skeleton.copy()], **kwargs) - else: - sc = tm.Scene(self.skeleton.copy(), **kwargs) - - return sc -+
220 def scene(self, mesh=False, **kwargs): +221 """Return a Scene object containing the skeleton. +222 +223 Returns +224 ------- +225 scene : trimesh.scene.scene.Scene +226 Contains the skeleton and optionally the mesh. +227 +228 """ +229 if mesh: +230 if isinstance(self.mesh, type(None)): +231 raise ValueError('Skeleton has no mesh.') +232 +233 self.mesh.visual.face_colors = [100, 100, 100, 100] +234 +235 # Note the copy(): without it the transform in show() changes +236 # the original meshes +237 sc = tm.Scene([self.mesh.copy(), self.skeleton.copy()], **kwargs) +238 else: +239 sc = tm.Scene(self.skeleton.copy(), **kwargs) +240 +241 return sc +
Return a Scene object containing the skeleton.
@@ -1247,42 +1277,42 @@Returns
View Source
-def show(self, mesh=False, **kwargs): - """Render the skeleton in an opengl window. Requires pyglet. - - Parameters - ---------- - mesh : bool - If True, will render transparent mesh on top of the - skeleton. - - Returns - -------- - scene : trimesh.scene.Scene - Scene with skeleton in it. - - """ - scene = self.scene(mesh=mesh) + ++ + def + show(self, mesh=False, **kwargs) - # I encountered some issues if object space is big and the easiest - # way to work around this is to apply a transform such that the - # coordinates have -5 to +5 bounds - fac = 5 / np.fabs(self.skeleton.bounds).max() - scene.apply_transform(np.diag([fac, fac, fac, 1])) + - return scene.show(**kwargs) -+
243 def show(self, mesh=False, **kwargs): +244 """Render the skeleton in an opengl window. Requires pyglet. +245 +246 Parameters +247 ---------- +248 mesh : bool +249 If True, will render transparent mesh on top of the +250 skeleton. +251 +252 Returns +253 -------- +254 scene : trimesh.scene.Scene +255 Scene with skeleton in it. +256 +257 """ +258 scene = self.scene(mesh=mesh) +259 +260 # I encountered some issues if object space is big and the easiest +261 # way to work around this is to apply a transform such that the +262 # coordinates have -5 to +5 bounds +263 fac = 5 / np.fabs(self.skeleton.bounds).max() +264 scene.apply_transform(np.diag([fac, fac, fac, 1])) +265 +266 return scene.show(**kwargs) +
Render the skeleton in an opengl window. Requires pyglet.
@@ -1306,42 +1336,42 @@Returns
View Source
-def example_mesh(): - """Load and return example mesh. + ++ + def + example_mesh() - The example mesh is a fruit fly neuron (an olfactory projection neuron of - the DA1 glomerulus) segmented from an EM image data set. It is part of the - Janelia hemibrain data set (see [here](https://neuprint.janelia.org)) [1]. + - References - ---------- - [1] Louis K. Scheffer et al., eLife. 2020. doi: 10.7554/eLife.57443 - A connectome and analysis of the adult Drosophila central brain - - Returns - ------- - trimesh.Trimesh - - Examples - -------- - >>> import skeletor as sk - >>> # Load this example mesh - >>> mesh = sk.example_mesh() - - """ - return tm.load_mesh(obj_path) -+
43def example_mesh(): +44 """Load and return example mesh. +45 +46 The example mesh is a fruit fly neuron (an olfactory projection neuron of +47 the DA1 glomerulus) segmented from an EM image data set. It is part of the +48 Janelia hemibrain data set (see [here](https://neuprint.janelia.org)) [1]. +49 +50 References +51 ---------- +52 [1] Louis K. Scheffer et al., eLife. 2020. doi: 10.7554/eLife.57443 +53 A connectome and analysis of the adult Drosophila central brain +54 +55 Returns +56 ------- +57 trimesh.Trimesh +58 +59 Examples +60 -------- +61 >>> import skeletor as sk +62 >>> # Load this example mesh +63 >>> mesh = sk.example_mesh() +64 +65 """ +66 return tm.load_mesh(obj_path) +
Load and return example mesh.
diff --git a/docs/search.js b/docs/search.js index 25f2077..bce596f 100644 --- a/docs/search.js +++ b/docs/search.js @@ -1,6 +1,6 @@ window.pdocSearch = (function(){ /** elasticlunr - http://weixsong.github.io * Copyright (C) 2017 Oliver Nightingale * Copyright (C) 2017 Wei Song * MIT Licensed */!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;uUnlike its namesake, this skeletor
\ndoes not (yet) seek to conquer Eternia but to turn meshes into skeletons.
Before we get started some terminology:
\n\n- \n
- a mesh is something that consists of vertices and faces \n
- a skeleton is a (hierarchical) tree-like structure consisting of vertices\n(also called nodes) and edges that connect them \n
Skeletons are useful for a range of reasons. For example:
\n\n- \n
- Typically smaller (less vertices) than the mesh \n
- Have an implicit sense of topology (e.g. \"this node is distal to that node\") \n
Extracting skeletons from meshes (or other types of data such as voxels) is\nnon-trivial and there are a great many research papers exploring various\ndifferent approaches (see Google scholar).
\n\nskeletor
implements some algorithms that I found useful in my work with\nneurons. In my experience there is unfortuntely no magic bullet when it\ncomes to skeletonization and chances are you will have to fiddle around a bit\nto get decent results.
Installation
\n\nFrom PyPI:
\n\npip3 install skeletor\n
For the bleeding-edge version from Github:
\n\npip3 install git+https://github.com/navis-org/skeletor@master\n
Getting started
\n\nA skeletonization pipeline typically consists of:
\n\n- \n
- Some pre-processing of the mesh (e.g. fixing some potential errors like\ndegenerate faces, unreferenced vertices, etc.) \n
- The skeletonization itself \n
- Some post-processing of the skeleton (e.g. adding radius information) \n
\n\n
Here is a complete list of available functions:
\n\nfunction | \ndescription | \n
---|---|
example data | \n\n |
skeletor.example_mesh() | \n load an example mesh | \n
pre-processing | \n\n |
skeletor.pre.fix_mesh() | \n fix some common errors found in meshes | \n
skeletor.pre.remesh() | \n re-generate mesh (uses Blender 3D) | \n
skeletor.pre.simplify() | \n reduce mesh complexity (uses Blender 3D) | \n
skeletor.pre.contract() | \n contract mesh to facilitate skeletonization [1] | \n
skeletonization | \n\n |
skeletor.skeletonize.by_wavefront() | \n very fast, works well for tubular meshes (like neurons) | \n
skeletor.skeletonize.by_vertex_clusters() | \n very fast but needs mesh to be contracted (see above) | \n
skeletor.skeletonize.by_edge_collapse() | \n presented in [1] but never got this to work well | \n
skeletor.skeletonize.by_teasar() | \n very fast and robust, works on mesh surface | \n
skeletor.skeletonize.by_tangent_ball() | \n very fast, best on smooth meshes | \n
postprocessing | \n\n |
skeletor.post.clean_up() | \n fix some potential errors in the skeleton | \n
skeletor.post.radii() | \n add radius information using various method | \n
\n\n
See docstrings of the respective functions for details.
\n\nA pipeline might look like this:
\n\n- \n
skeletor.pre.fix_mesh()
to fix the mesh \nskeletor.pre.simplify()
to simplify the mesh \nskeletor.pre.contract()
to contract the mesh [1] \nskeletor.skeletonize.vertex_clusters()
to generate a skeleton \nskeletor.post.clean_up()
to clean up some potential issues with the skeleton \nskeletor.post.radii()
to extract radii either by k-nearest neighbours or ray-casting \n
In my experience there is no one-size-fits-all. You will have to play around to\nfind the right approach and parameters to get nice skeletons for your meshes.\nIf you need help just open an issue.
\n\nAlso check out the Gotchas below!
\n\nExamples
\n\nFirst load the example mesh (a fruit fly neuron):
\n\n>>> import skeletor as sk\n>>> mesh = sk.example_mesh()\n>>> mesh\n<trimesh.Trimesh(vertices.shape=(6582, 3), faces.shape=(13772, 3))>\n
Next see if there is stuff to fix in the mesh (degenerate faces, duplicate\nvertices, etc.):
\n\n>>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False)\n>>> fixed\n<trimesh.Trimesh(vertices.shape=(6213, 3), faces.shape=(12805, 3))>\n
Now for tubular meshes like this neuron, the \"wave front\" skeletonization method\nperforms really well: it works by casting waves across the mesh and collapsing\nthe resulting rings into a skeleton (kinda like when you throw a stone in a\npond and track the expanding ripples).
\n\n>>> skel = sk.skeletonize.by_wavefront(fixed, waves=1, step_size=1)\n>>> skel\n<Skeleton(vertices=(1258, 3), edges=(1194, 2), method=wavefront)>\n
All skeletonization methods return a Skeleton
object. These are just\nconvenient objects to bundle the various outputs of the skeletonization.
>>> # x/y/z location of skeleton vertices (nodes)\n>>> skel.vertices\narray([[16744, 36720, 26407],\n ...,\n [22076, 23217, 24472]])\n>>> # child -> parent edges\n>>> skel.edges\narray([[ 64, 31],\n ...,\n [1257, 1252]])\n>>> # Mapping for mesh to skeleton vertex indices\n>>> skel.mesh_map\narray([ 157, 158, 1062, ..., 525, 474, 547])\n>>> # SWC table\n>>> skel.swc.head()\n node_id parent_id x y z radius\n0 0 -1 16744.005859 36720.058594 26407.902344 0.000000\n1 1 -1 5602.751953 22266.756510 15799.991211 7.542587\n2 2 -1 16442.666667 14999.978516 10887.916016 5.333333\n
SWC is a commonly used format for saving skeletons. Skeleton
objects\nhave a method for quickly saving a correctly formatted SWC file:
>>> skel.save_swc('~/Documents/my_skeleton.swc')\n
If you installed pyglet
(see above) you can also use trimesh
's plotting\ncapabilities to inspect the results:
>>> skel.show(mesh=True)\n
That looks pretty good already but let's run some pro-forma postprocessing.
\n\n>>> sk.post.clean_up(skel, inplace=True)\n<Skeleton(vertices=(1071, 3), edges=(1070, 2))>\n
So that would be a full pipeline mesh to skeleton. Don't expect your own meshes\nto produce such nice results off the bat though. Chances are you will need to\nplay around to find the right recipe. If you don't know where to start, I suggest\nyou try out mesh contraction + vertex clustering first:
\n\n>>> import skeletor as sk\n>>> mesh = sk.example_mesh()\n>>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False)\n>>> # Contract mesh to 10% (0.1) of original volume\n>>> cont = sk.pre.contract(fixed, epsilon=0.1)\n>>> # Skeletonize\n>>> skel = sk.skeletonize.by_vertex_clusters(cont, sampling_dist=100)\n>>> # Replace contracted mesh with original for postprocessing and plotting\n>>> skel.mesh = fixed\n>>> # Add radii (vertex cluster method does not do that automatically)\n>>> sk.post.radii(skel, method='knn')\n>>> skel.show(mesh=True)\n
Gotchas
\n\n- \n
- while this is a general purpose library, my personal focus is on neurons and\nthis has certainly influenced things like default parameter values and certain\npost-processing steps \n
- meshes need to be triangular (we are using
trimesh
) \n - use
sk.pre.simplify
if your mesh is very complex (half a million vertices is\nwhere things start getting sluggish) \n - a good mesh contraction is often half the battle \n
- if the mesh consists of multiple disconnected pieces the skeleton will\nlikewise be fragmented (i.e. will have multiple roots) \n
Benchmarks
\n\n\n\nBenchmarks\nwere run on a 2018 MacBook Pro (2.2 GHz Core i7, 32Gb memory) with optional\nfastremap
dependency installed. Note some of these functions (e.g.\ncontraction and TEASAR/vertex cluster skeletonization) vary a lot in\nspeed based on parameterization.
What about algorithm X
?
\n\nskeletor
contains some algorithms that I found easy enough to implement\nand useful for my work with neurons. If you have some interesting paper/approach\nthat could make a nice addition to skeletor
, please get in touch on Github.\nPull requests are always welcome!
References
\n\n[1] 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.
The abstract and the paper can be found here.\nAlso see this YouTube video.
\n\nSome of the code in skeletor was modified from the\nPy_BL_MeshSkeletonization\naddon created by #0K Srinivasan Ramachandran and published under GPL3.
\n\nTop-level functions and classes
\n\nAt top-level we only expose example_mesh()
and the Skeleton
class (which\nyou probably won't ever need to touch manually). Everything else is neatly\ntucked away into submodules (see side-bar or above table).
Class representing a skeleton.
\n\nTypically returned as results from a skeletonization.
\n\nAttributes
\n\n- \n
- swc (pd.DataFrame, optional):\nSWC table. \n
- vertices ((N, 3) array):\nVertex (node) positions. \n
- edges ((M, 2) array):\nIndices of connected vertex pairs. \n
- radii ((N, ) array, optional):\nRadii for each vertex (node) in the skeleton. \n
- mesh (trimesh, optional):\nThe original mesh. \n
- mesh_map (array, optional):\nSame length as
mesh
. Maps mesh vertices to vertices (nodes)\nin the skeleton. \n - skel_map (array of arrays, optional):\nInverse of
mesh_map
: maps skeleton vertices (nodes) to mesh\nvertices. \n - method (str, optional):\nWhich method was used to generate the skeleton. \n
Return skeleton edges.
\n"}, "skeletor.Skeleton.vertices": {"fullname": "skeletor.Skeleton.vertices", "modulename": "skeletor", "qualname": "Skeleton.vertices", "type": "variable", "doc": "Return skeleton vertices (nodes).
\n"}, "skeletor.Skeleton.radius": {"fullname": "skeletor.Skeleton.radius", "modulename": "skeletor", "qualname": "Skeleton.radius", "type": "variable", "doc": "Return radii.
\n"}, "skeletor.Skeleton.skeleton": {"fullname": "skeletor.Skeleton.skeleton", "modulename": "skeletor", "qualname": "Skeleton.skeleton", "type": "variable", "doc": "Skeleton as trimesh Path3D.
\n"}, "skeletor.Skeleton.skel_map": {"fullname": "skeletor.Skeleton.skel_map", "modulename": "skeletor", "qualname": "Skeleton.skel_map", "type": "variable", "doc": "Skeleton vertex (nodes) to mesh vertices. Based on mesh_map
.
Clean up skeleton.
\n", "signature": "(self, inplace=False)", "funcdef": "def"}, "skeletor.Skeleton.copy": {"fullname": "skeletor.Skeleton.copy", "modulename": "skeletor", "qualname": "Skeleton.copy", "type": "function", "doc": "Return copy of the skeleton.
\n", "signature": "(self)", "funcdef": "def"}, "skeletor.Skeleton.get_graph": {"fullname": "skeletor.Skeleton.get_graph", "modulename": "skeletor", "qualname": "Skeleton.get_graph", "type": "function", "doc": "Generate networkX representation of the skeletons.
\n\nDistance between nodes will be used as edge weights.
\n\nReturns
\n\n- \n
- networkx.DiGraph \n
Save skeleton in SWC format.
\n\nParameters
\n\n- \n
- filepath (path-like):\nFilepath to save SWC to. \n
Return a Scene object containing the skeleton.
\n\nReturns
\n\n- \n
- scene (trimesh.scene.scene.Scene):\nContains the skeleton and optionally the mesh. \n
Render the skeleton in an opengl window. Requires pyglet.
\n\nParameters
\n\n- \n
- mesh (bool):\nIf True, will render transparent mesh on top of the\nskeleton. \n
Returns
\n\n- \n
- scene (trimesh.scene.Scene):\nScene with skeleton in it. \n
Load and return example mesh.
\n\nThe example mesh is a fruit fly neuron (an olfactory projection neuron of\nthe DA1 glomerulus) segmented from an EM image data set. It is part of the\nJanelia hemibrain data set (see here) [1].
\n\nReferences
\n\n[1] Louis K. Scheffer et al., eLife. 2020. doi: 10.7554/eLife.57443\nA connectome and analysis of the adult Drosophila central brain
\n\nReturns
\n\n- \n
- trimesh.Trimesh \n
Examples
\n\n>>> import skeletor as sk\n>>> # Load this example mesh\n>>> mesh = sk.example_mesh()\n
The skeletor.post
module contains functions to post-process skeletons after\nskeletonization.
Fixing issues with skeletons
\n\nDepending on your mesh, pre-processing and the parameters you chose for\nskeletonization, chances are that your skeleton will not come out perfectly.
\n\nskeletor.post.clean_up
can help you solve some potential issues:
- \n
- skeleton nodes (vertices) that outside or right on the surface instead of\ncentered inside the mesh \n
- superfluous \"hairs\" on otherwise straight bits \n
Computing radius information
\n\nOnly skeletor.skeletonize.by_wavefront()
provides radii off the bat. For all\nother methods, you might want to run skeletor.post.radii
can help you\n(re-)generate radius information for the skeletons.
Extract radii for given skeleton table.
\n\nImportant
\n\nThis function really only produces useful radii if the skeleton is centered\ninside the mesh. by_wavefront
does that by default whereas all other\nskeletonization methods don't. Your best bet to get centered skeletons is\nto contract the mesh first (sk.pre.contract
).
Parameters
\n\n- \n
- s (skeletor.Skeleton):\nSkeleton to clean up. \n
- mesh (trimesh.Trimesh, optional):\nOriginal mesh (e.g. before contraction). If not provided will\nuse the mesh associated with
s
. \n method (\"knn\" | \"ray\"):\nWhether and how to add radius information to each node::
\n\n- \n
- \"knn\" uses k-nearest-neighbors to get radii: fast but\n potential for being very wrong \n
- \"ray\" uses ray-casting to get radii: slower but sometimes\n less wrong \n
\n- aggregate (\"mean\" | \"median\" | \"max\" | \"min\" | \"percentile75\"):\nFunction used to aggregate radii over sample (i.e. across\nk nearest-neighbors or ray intersections) \n
- validate (bool):\nIf True, will try to fix potential issues with the mesh\n(e.g. infinite values, duplicate vertices, degenerate faces)\nbefore skeletonization. Note that this might make changes to\nyour mesh inplace! \n
- **kwargs: Keyword arguments are passed to the respective method: \n
For method \"knn\"::
\n\nn : int (default 5)\n Radius will be the mean over n nearest-neighbors.\n
\n\nFor method \"ray\"::
\n\nn_rays : int (default 20)\n Number of rays to cast for each node.\nprojection : \"sphere\" (default) | \"tangents\"\n Whether to cast rays in a sphere around each node or in a\n circle orthogonally to the node's tangent vector.\nfallback : \"knn\" (default) | None | number\n If a point is outside or right on the surface of the mesh\n the raycasting will return nonesense results. We can either\n ignore those cases (``None``), assign a arbitrary number or\n we can fall back to radii from k-nearest-neighbors (``knn``).\n
\n\nReturns
\n\n- \n
- None: But attaches
radius
to the skeleton's SWC table. Existing\nvalues are replaced! \n
Clean up the skeleton.
\n\nThis function bundles a bunch of procedures to clean up the skeleton:
\n\n- \n
- Remove twigs that are running parallel to their parent branch \n
- Move nodes outside the mesh back inside (or at least snap to surface) \n
Note that this is not a magic bullet and some of this will not work (well)\nif the original mesh was degenerate (e.g. internal faces or not watertight)\nto begin with.
\n\nParameters
\n\n- \n
- s (skeletor.Skeleton):\nSkeleton to clean up. \n
- mesh (trimesh.Trimesh, optional):\nOriginal mesh (e.g. before contraction). If not provided will\nuse the mesh associated with
s
. \n - validate (bool):\nIf True, will try to fix potential issues with the mesh\n(e.g. infinite values, duplicate vertices, degenerate faces)\nbefore cleaning up. Note that this might change your mesh\ninplace! \n
- inplace (bool):\nIf False will make and return a copy of the skeleton. If True,\nwill modify the
s
inplace. \n - **kwargs: Keyword arguments are passed to the bundled function. \n
For skeletor.postprocessing.drop_parallel_twigs
::
theta : float (default 0.01)\n For each twig we generate the dotproduct between the tangent\n vectors of it and its parents. If these line up perfectly the\n dotproduct will equal 1. theta
determines how much that\n value can differ from 1 for us to still prune the twig: higher\n theta = more pruning.
Returns
\n\n- \n
- s_clean (skeletor.Skeleton):\nHopefully improved skeleton. \n
The skeletor.pre
module contains functions to pre-process meshes before\nskeletonization.
Fixing faulty meshes
\n\nSome skeletonization methods are susceptible to faulty meshes (degenerate faces,\nwrong normals, etc.). If your skeleton looks off, it might be worth a shot\ntrying to fix the mesh using skeletor.pre.fix_mesh()
.
Mesh contraction
\n\nAs a rule of thumb: the more your mesh looks like a skeleton, the easier it is\nto extract one (duh). Mesh contraction using skeletor.pre.contract()
[1] can\nhelp you to get your mesh \"in shape\".
References
\n\n[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh\n contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.
\n"}, "skeletor.pre.fix_mesh": {"fullname": "skeletor.pre.fix_mesh", "modulename": "skeletor.pre", "qualname": "fix_mesh", "type": "function", "doc": "Try to fix some common problems with mesh.
\n\n- \n
- Remove infinite values \n
- Merge duplicate vertices \n
- Remove duplicate and degenerate faces \n
- Remove unreference vertices \n
- Drop winglets (faces that have only one adjacent face) \n
- Fix normals (Optional) \n
- Remove disconnected fragments (Optional) \n
Parameters
\n\n- \n
- mesh (mesh-like object):\nMesh to fix. Must have
.vertices
and.faces
\nproperties. \n - remove_disconnected (False | int):\nIf a number is given, will iterate over the mesh's\nconnected components and remove those consisting of\nless than the given number of vertices. For example,\n
remove_disconnected=5
will drop parts of the\nmesh that consist of five or less connected\nvertices. \n - inplace (bool):\nIf True, will perform fixes on the input mesh.\nIf False, will make a copy first. This is silently\nignored if
mesh
is not already a trimesh. \n
Returns
\n\n- \n
- fixed mesh (trimesh.Trimesh): \n
Simplify mesh using Blender 3D.
\n\nUses Blender's \"decimate\" modifier in \"collapse\" mode.
\n\nParameters
\n\n- \n
- mesh (trimesh.Trimesh):\nMesh to simplify. \n
- ratio (float):\nFactor to which to reduce faces. For example, a ratio of 0.5 will\nreduce the number of faces to 50%. \n
Returns
\n\n- \n
- trimesh.Trimesh: Simplified mesh. \n
Remesh mesh using Blender 3D.
\n\nUses Blender's \"remesh\" modifier in \"voxel\" mode.
\n\nParameters
\n\n- \n
- mesh (trimesh.Trimesh):\nMesh to remesh. \n
- voxel_size (float):\nSize of individual voxels (edge length). \n
- adaptivity (float):\nReduces final face count where detail is not important. \n
Returns
\n\n- \n
- trimesh.Trimesh: Remeshed mesh. \n
Contract mesh.
\n\nIn a nutshell: this function contracts the mesh by applying rounds of\n_constraint_ Laplacian smoothing. This function can be fairly expensive\nand I highly recommend you play around with SL
to contract the\nmesh in as few steps as possible. The contraction doesn't have to be perfect\nfor good skeletonization results (<10%, i.e. epsilon<0.1
).
Also: parameterization matters a lot! Default parameters will get you there\nbut playing around with SL
and WH0
might speed things up by an order of\nmagnitude.
Parameters
\n\n- \n
- mesh (mesh obj):\nThe mesh to be contracted. Can be any object (e.g.\na trimesh.Trimesh) that has
.vertices
and.faces
\nproperties or a tuple(vertices, faces)
or a dictionary\n{'vertices': vertices, 'faces': faces}
.\nVertices and faces must be (N, 3) numpy arrays. \n - epsilon (float (0-1), optional):\nTarget contraction rate as measured by the sum of all face\nareas in the contracted versus the original mesh. Algorithm\nwill stop once mesh is contracted below this threshold.\nDepending on your mesh (number of faces, shape) reaching a\nstrong contraction can be extremely costly with comparatively\nlittle benefit for the subsequent skeletonization. Note that\nthe algorithm might stop short of this target if
iter_lim
\nortime_lim
is reached first or if the sum of face areas\nis increasing from one iteration to the next instead of\ndecreasing. \n - iter_lim (int (>1), optional):\nMaximum rounds of contractions. \n
- time_lim (int, optional):\nMaximum run time in seconds. Note that this limit is not\nchecked during but after each round of contraction. Hence,\nthe actual total time will likely overshoot
time_lim
. \n - precision (float, optional):\nSets the precision for finding the least-square solution.\nThis is the main determinant for speed vs quality: lower\nvalues will take (much) longer but will get you closer to an\noptimally contracted mesh. Higher values will be faster but\nthe iterative contractions might stop early. \n
- SL (float, optional):\nFactor by which the contraction matrix is multiplied for\neach iteration. Higher values = quicker contraction, lower\nvalues = more likely to get you an optimal contraction. \n
- WH0 (float, optional):\nInitial weight factor for the attraction constraints.\nThe ratio of the initial weights
WL0
andWH0
\ncontrols the smoothness and the degree of contraction of the\nfirst iteration result, thus it determines the amount of\ndetails retained in subsequent and final contracted meshes:\nhigherWH0
= more details retained. \n - WL0 (\"auto\" | float):\nInitial weight factor for the contraction constraints. By\ndefault (\"auto\"), this will be set to
1e-3 * sqrt(A)
\nwithA
being the average face area. This ensures that\ncontraction forces scale with the coarseness of the mesh. \n operator (\"cotangent\" | \"umbrella\"):\nWhich Laplacian operator to use:
\n\n- \n
- The \"cotangent\" operator (default) takes both topology\nand geometry of the mesh into account and is hence a\nbetter descriptor of the curvature flow. This is the\noperator used in the original paper. \n
- The \"umbrella\" operator (aka \"uniform weighting\") uses\nonly topological features of the mesh. This also makes\nit more robust against flaws in the mesh! Use it when\nthe cotangent operator produces oddly contracted meshes. \n
\n- progress (bool):\nWhether or not to show a progress bar. \n
- validate (bool):\nIf True, will try to fix potential issues with the mesh\n(e.g. infinite values, duplicate vertices, degenerate faces)\nbefore collapsing. Degenerate meshes can lead to effectively\ninfinite runtime for this function! \n
Returns
\n\n- \n
- trimesh.Trimesh: Contracted copy of original mesh. The final contraction rate\nis attached to the mesh as
.epsilon
property. \n
References
\n\n[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh\n contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.
\n", "signature": "(\n mesh,\n epsilon=1e-06,\n iter_lim=100,\n time_lim=None,\n precision=1e-07,\n SL=2,\n WH0=1,\n WL0='auto',\n operator='cotangent',\n progress=True,\n validate=True\n)", "funcdef": "def"}, "skeletor.skeletonize": {"fullname": "skeletor.skeletonize", "modulename": "skeletor.skeletonize", "type": "module", "doc": "The skeletor.skeletonize
module contains functions to for skeletonization\nof meshes.
There are several approaches to skeletonizing a mesh. Which one to pick depends\n(among other things) on the shape of your mesh and the skeleton quality you want\nto get out of it. In general, unless you mesh already looks like a tube I\nrecommend looking into mesh contraction 4.
\n\nPlease see the documentation of the individual functions for details but here\nis a quick summary:
\n\nfunction | \nspeed | \nrobust | \nradii 1 | \nmesh map 2 | \ndescription | \n
---|---|---|---|---|---|
skeletor.skeletonize.by_wavefront() | \n +++ | \n++ | \nyes | \nyes | \nworks well for tubular meshes | \n
skeletor.skeletonize.by_vertex_clusters() | \n ++ | \n+ | \nno | \nyes | \nbest with contracted meshes 3 | \n
skeletor.skeletonize.by_teasar() | \n + | \n++ | \nno | \nyes | \nworks on mesh surface | \n
skeletor.skeletonize.by_tangent_ball() | \n ++ | \n0 | \nyes | \nyes | \nworks with mesh normals | \n
skeletor.skeletonize.by_edge_collapse() | \n - | \n0 | \nno | \nno | \npublished with [1] - never got this to work well | \n
References
\n\n[1] 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.
\n\n
Skeletonize a mesh mesh using the TEASAR algorithm [1].
\n\nThis algorithm finds the longest path from a root vertex, invalidates all\nvertices that are within inv_dist
. Then picks the second longest (and\nstill valid) path and does the same. Rinse & repeat until all vertices have\nbeen invalidated. It's fast + works very well with tubular meshes, and with\ninv_dist
you have control over the level of detail. Note that by its\nnature the skeleton will be exactly on the surface of the mesh.
Based on the implementation by Sven Dorkenwald, Casey Schneider-Mizell and\nForrest Collman in meshparty
(https://github.com/sdorkenw/MeshParty).
Parameters
\n\n- \n
- mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n
.vertices
and.faces
properties (e.g. a\ntrimesh.Trimesh) or a tuple(vertices, faces)
or a\ndictionary{'vertices': vertices, 'faces': faces}
. \n - inv_dist (int | float):\nDistance along the mesh used for invalidation of vertices.\nThis controls how detailed (or noisy) the skeleton will be. \n
- min_length (float, optional):\nIf provided, will skip any branch that is shorter than\n
min_length
. Use this to get rid of noise but note that\nit will lead to vertices not being mapped to skeleton nodes.\nSuch vertices will show up with index -1 in\nSkeleton.mesh_map
. \n - root (int, optional):\nVertex ID of a root. If not provided will use
0
. \n - progress (bool, optional):\nIf True, will show progress bar. \n
Returns
\n\n- \n
- skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization. \n
References
\n\n[1] Sato, M., Bitter, I., Bender, M. A., Kaufman, A. E., & Nakajima, M.\n (n.d.). TEASAR: tree-structure extraction algorithm for accurate and\n robust skeletons. In Proceedings the Eighth Pacific Conference on\n Computer Graphics and Applications. IEEE Comput. Soc.\n https://doi.org/10.1109/pccga.2000.883951
\n", "signature": "(mesh, inv_dist, min_length=None, root=None, progress=True)", "funcdef": "def"}, "skeletor.skeletonize.by_wavefront": {"fullname": "skeletor.skeletonize.by_wavefront", "modulename": "skeletor.skeletonize", "qualname": "by_wavefront", "type": "function", "doc": "Skeletonize a mesh using wave fronts.
\n\nThe algorithm tries to find rings of vertices and collapse them to\ntheir center. This is done by propagating a wave across the mesh starting at\na single seed vertex. As the wave travels across the mesh we keep track of\nwhich vertices are are encountered at each step. Groups of connected\nvertices that are \"hit\" by the wave at the same time are considered rings\nand subsequently collapsed. By its nature this works best with tubular meshes.
\n\nParameters
\n\n- \n
- mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n
.vertices
and.faces
properties (e.g. a\ntrimesh.Trimesh) or a tuple(vertices, faces)
or a\ndictionary{'vertices': vertices, 'faces': faces}
. \n - waves (int):\nNumber of waves to run across the mesh. Each wave is\ninitialized at a different vertex which produces slightly\ndifferent rings. The final skeleton is produced from a mean\nacross all waves. More waves produce higher resolution\nskeletons but also introduce more noise. \n
- origins (int | list of ints, optional):\nVertex ID(s) where the wave(s) are initialized. If we run\nout of origins (either because less
origins
thanwaves
\nor because no origin for one of the connected components)\nwill fall back to semi-random origin. \n - step_size (int):\nValues greater 1 effectively lead to binning of rings. For\nexample a stepsize of 2 means that two adjacent vertex rings\nwill be collapsed to the same center. This can help reduce\nnoise in the skeleton (and as such counteracts a large\nnumber of waves). \n
- radius_agg (\"mean\" | \"median\" | \"max\" | \"min\" | \"percentile75\" | \"percentile25\"):\nFunction used to aggregate radii over sample (i.e. the\nvertices forming a ring that we collapse to its center). \n
- progress (bool):\nIf True, will show progress bar. \n
Returns
\n\n- \n
- skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization. \n
Skeletonize a (contracted) mesh by clustering vertices.
\n\nThe algorithm traverses the mesh graph and groups vertices together that\nare within a given distance to each other. This uses the geodesic\n(along-the-mesh) distance, not simply the Eucledian distance. Subsequently\nthese groups of vertices are collapsed and re-connected respecting the\ntopology of the input mesh.
\n\nThe graph traversal is fast and scales well, so this method is well suited\nfor meshes with lots of vertices. On the downside: this implementation is\nnot very clever and you might have to play around with the parameters\n(mostly sampling_dist
) to get decent results.
Parameters
\n\n- \n
- mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n
.vertices
and.faces
properties (e.g. a\ntrimesh.Trimesh) or a tuple(vertices, faces)
or a\ndictionary{'vertices': vertices, 'faces': faces}
. \n - sampling_dist (float | int):\nMaximal distance at which vertices are clustered. This\nparameter should be tuned based on the resolution of your\nmesh (see Examples). \n
cluster_pos (\"median\" | \"center\"):\nHow to determine the x/y/z coordinates of the collapsed\nvertex clusters (i.e. the skeleton's nodes)::
\n\n- \n
- \"median\": Use the vertex closest to cluster's center of\nmass. \n
- \"center\": Use the center of mass. This makes for smoother\nskeletons but can lead to nodes outside the mesh. \n
\n- progress (bool):\nIf True, will show progress bar. \n
Examples
\n\n>>> import skeletor as sk\n>>> mesh = sk.example_mesh()\n>>> cont = sk.pre.contract(mesh, epsilon=0.1)\n>>> skel = sk.skeletonize.vertex_cluster(cont)\n>>> skel.mesh = mesh\n
Returns
\n\n- \n
- skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization. \n
Skeletonize a (contracted) mesh by iteratively collapsing edges.
\n\nThis algorithm (described in [1]) iteratively collapses edges that are part\nof a face until no more faces are left. Edges are chosen based on a cost\nfunction that penalizes collapses that would change the shape of the object\nor would introduce long edges.
\n\nThis is somewhat sensitive to the dimensions of the input mesh: too large\nand you might experience slow-downs or numpy OverflowErrors; too low and\nyou might get skeletons that don't quite match the mesh (e.g. too few nodes).\nIf you experience either, try down- or up-scaling your mesh, respectively.
\n\nParameters
\n\n- \n
- mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n
.vertices
and.faces
properties (e.g. a\ntrimesh.Trimesh) or a tuple(vertices, faces)
or a\ndictionary{'vertices': vertices, 'faces': faces}
. \n - shape_weight (float, optional):\nWeight for shape costs which penalize collapsing edges that\nwould drastically change the shape of the object. \n
- sample_weight (float, optional):\nWeight for sampling costs which penalize collapses that\nwould generate prohibitively long edges. \n
- progress (bool):\nIf True, will show progress bar. \n
Returns
\n\n- \n
- skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization. \n
References
\n\n[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh\n contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.
\n", "signature": "(mesh, shape_weight=1, sample_weight=0.1, progress=True)", "funcdef": "def"}, "skeletor.skeletonize.by_tangent_ball": {"fullname": "skeletor.skeletonize.by_tangent_ball", "modulename": "skeletor.skeletonize", "qualname": "by_tangent_ball", "type": "function", "doc": "Skeletonize a mesh by finding the maximal tangent ball.
\n\nThis algorithm casts a ray from every mesh vertex along its inverse normals\n(requires ncollpyde
). It then creates a sphere that is tangent to the\nvertex and to where the ray hit the inside of a face on the opposite side.\nNext it drops spheres that overlap with another, larger sphere. Modified\nfrom [1].
The method works best on smooth meshes and is rather sensitive to errors in\nthe mesh such as incorrect normals (see skeletor.pre.fix_mesh
), internal\nfaces, noisy surface (try smoothing or downsampling) or holes in the mesh.
Parameters
\n\n- \n
- mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n
.vertices
and.faces
properties (e.g. a\ntrimesh.Trimesh) or a tuple(vertices, faces)
or a\ndictionary{'vertices': vertices, 'faces': faces}
. \n
Returns
\n\n- \n
- skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization. \n
Examples
\n\n>>> import skeletor as sk\n>>> mesh = sk.example_mesh()\n>>> fixed = sk.pre.fix_mesh(mesh, fix_normals=True, remove_disconnected=10)\n>>> skel = sk.skeletonize.by_tangent_ball(fixed)\n
References
\n\n[1] Ma, J., Bae, S.W. & Choi, S. 3D medial axis point approximation using\n nearest neighbors and the normal field. Vis Comput 28, 7\u201319 (2012).\n https://doi.org/10.1007/s00371-011-0594-7
\n", "signature": "(mesh)", "funcdef": "def"}}, "docInfo": {"skeletor": {"qualname": 0, "fullname": 1, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 2771}, "skeletor.Skeleton": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 161}, "skeletor.Skeleton.__init__": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 3}, "skeletor.Skeleton.edges": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 6}, "skeletor.Skeleton.vertices": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 7}, "skeletor.Skeleton.radius": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 5}, "skeletor.Skeleton.skeleton": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 7}, "skeletor.Skeleton.skel_map": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 15}, "skeletor.Skeleton.reindex": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 5, "bases": 0, "doc": 6}, "skeletor.Skeleton.copy": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 3, "bases": 0, "doc": 8}, "skeletor.Skeleton.get_graph": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 3, "bases": 0, "doc": 34}, "skeletor.Skeleton.save_swc": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 4, "bases": 0, "doc": 29}, "skeletor.Skeleton.scene": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 6, "bases": 0, "doc": 35}, "skeletor.Skeleton.show": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 6, "bases": 0, "doc": 60}, "skeletor.example_mesh": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 2, "bases": 0, "doc": 156}, "skeletor.post": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 139}, "skeletor.post.radii": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 12, "bases": 0, "doc": 406}, "skeletor.post.clean_up": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 10, "bases": 0, "doc": 303}, "skeletor.pre": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 143}, "skeletor.pre.fix_mesh": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 29, "bases": 0, "doc": 204}, "skeletor.pre.simplify": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 4, "bases": 0, "doc": 83}, "skeletor.pre.remesh": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 8, "bases": 0, "doc": 86}, "skeletor.pre.contract": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 27, "bases": 0, "doc": 762}, "skeletor.skeletonize": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 437}, "skeletor.skeletonize.by_teasar": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 12, "bases": 0, "doc": 380}, "skeletor.skeletonize.by_wavefront": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 15, "bases": 0, "doc": 388}, "skeletor.skeletonize.by_vertex_clusters": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 10, "bases": 0, "doc": 475}, "skeletor.skeletonize.by_edge_collapse": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 12, "bases": 0, "doc": 297}, "skeletor.skeletonize.by_tangent_ball": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 3, "bases": 0, "doc": 386}}, "length": 29, "save": true}, "index": {"qualname": {"root": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.Skeleton.skel_map": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 13}}}}}}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}}, "w": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}}, "df": 1}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.Skeleton.edges": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.vertices": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.radius": {"tf": 1}}, "df": 1}}, "i": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.Skeleton.reindex": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.Skeleton.skel_map": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.example_mesh": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.Skeleton.copy": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "b": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}}}}, "fullname": {"root": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.Skeleton.skel_map": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 29}, "n": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 13, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6}}}}}}}}}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}}, "w": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}}, "df": 1}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.Skeleton.edges": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.vertices": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.radius": {"tf": 1}}, "df": 1}}, "i": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.Skeleton.reindex": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.Skeleton.skel_map": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.example_mesh": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.Skeleton.copy": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 3}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "b": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}}}}, "annotation": {"root": {"docs": {}, "df": 0}}, "default_value": {"root": {"docs": {}, "df": 0}}, "signature": {"root": {"0": {"6": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "7": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}, "1": {"0": {"0": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 3, "e": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}, "2": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "5": {"0": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}, "docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}, "docs": {"skeletor.Skeleton.__init__": {"tf": 1.4142135623730951}, "skeletor.Skeleton.reindex": {"tf": 1.4142135623730951}, "skeletor.Skeleton.copy": {"tf": 1.4142135623730951}, "skeletor.Skeleton.get_graph": {"tf": 1.4142135623730951}, "skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}, "skeletor.Skeleton.scene": {"tf": 1.4142135623730951}, "skeletor.Skeleton.show": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 19, "s": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "f": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 7}}}, "w": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1.4142135623730951}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 14}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 6}}, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 3}}}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}}, "df": 6}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}}}}}, "x": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "k": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 4}}}}}, "n": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 3}}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 2.23606797749979}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}}, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}, "h": {"0": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "l": {"0": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}}, "bases": {"root": {"docs": {}, "df": 0}}, "doc": {"root": {"0": {"0": {"0": {"0": {"0": {"0": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "5": {"8": {"5": {"9": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "1": {"1": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}, "5": {"8": {"5": {"9": {"4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "9": {"4": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 7, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "1": {"0": {"0": {"7": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "s": {"0": {"0": {"3": {"7": {"1": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}, "docs": {"skeletor": {"tf": 1}}, "df": 1}, "6": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "7": {"0": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "1": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "8": {"8": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}, "1": {"0": {"9": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "docs": {}, "df": 0}, "9": {"4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "2": {"5": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "8": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "8": {"0": {"5": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "3": {"7": {"7": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "4": {"9": {"9": {"9": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "5": {"7": {"9": {"9": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 1}}, "df": 1}, "8": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "6": {"0": {"docs": {"skeletor.skeletonize": {"tf": 2}}, "df": 1}, "4": {"4": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"4": {"4": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 3.7416573867739413}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 2.23606797749979}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 11, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "2": {"0": {"0": {"0": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}, "8": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "docs": {}, "df": 0}, "1": {"2": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "8": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "2": {"0": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}, "2": {"0": {"7": {"6": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "2": {"6": {"6": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "3": {"2": {"1": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "4": {"4": {"7": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "6": {"4": {"0": {"7": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "8": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}, "3": {"1": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "2": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "b": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "3": {"3": {"3": {"3": {"3": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "6": {"7": {"2": {"0": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "9": {"docs": {"skeletor": {"tf": 2}}, "df": 1}, "docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.Skeleton": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}, "4": {"4": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "7": {"4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}, "5": {"0": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}, "2": {"5": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "4": {"2": {"5": {"8": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "6": {"0": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"4": {"4": {"3": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}}, "df": 4}, "6": {"2": {"1": {"3": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "5": {"8": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "6": {"6": {"6": {"6": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"5": {"1": {"9": {"5": {"3": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "5": {"4": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "docs": {}, "df": 0}, "6": {"5": {"1": {"0": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2, "\u2013": {"1": {"9": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}, "8": {"6": {"1": {"7": {"docs": {"skeletor.skeletonize": {"tf": 2}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"3": {"9": {"5": {"1": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "9": {"0": {"2": {"3": {"4": {"4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "1": {"6": {"0": {"1": {"6": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"8": {"5": {"1": {"6": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "9": {"1": {"2": {"1": {"1": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 38.09199390948182}, "skeletor.Skeleton": {"tf": 8}, "skeletor.Skeleton.__init__": {"tf": 1.7320508075688772}, "skeletor.Skeleton.edges": {"tf": 1.7320508075688772}, "skeletor.Skeleton.vertices": {"tf": 1.7320508075688772}, "skeletor.Skeleton.radius": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skel_map": {"tf": 2.23606797749979}, "skeletor.Skeleton.reindex": {"tf": 1.7320508075688772}, "skeletor.Skeleton.copy": {"tf": 1.7320508075688772}, "skeletor.Skeleton.get_graph": {"tf": 4}, "skeletor.Skeleton.save_swc": {"tf": 3.872983346207417}, "skeletor.Skeleton.scene": {"tf": 3.872983346207417}, "skeletor.Skeleton.show": {"tf": 5.196152422706632}, "skeletor.example_mesh": {"tf": 8.246211251235321}, "skeletor.post": {"tf": 5.656854249492381}, "skeletor.post.radii": {"tf": 10.198039027185569}, "skeletor.post.clean_up": {"tf": 8.774964387392123}, "skeletor.pre": {"tf": 5.0990195135927845}, "skeletor.pre.fix_mesh": {"tf": 8.366600265340756}, "skeletor.pre.simplify": {"tf": 5.916079783099616}, "skeletor.pre.remesh": {"tf": 6.4031242374328485}, "skeletor.pre.contract": {"tf": 12.36931687685298}, "skeletor.skeletonize": {"tf": 14.966629547095765}, "skeletor.skeletonize.by_teasar": {"tf": 9.433981132056603}, "skeletor.skeletonize.by_wavefront": {"tf": 9.16515138991168}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 14.177446878757825}, "skeletor.skeletonize.by_edge_collapse": {"tf": 8.366600265340756}, "skeletor.skeletonize.by_tangent_ball": {"tf": 12.84523257866513}}, "df": 29, "w": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "h": {"0": {"docs": {"skeletor.pre.contract": {"tf": 2}}, "df": 1}, "docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4, "a": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 8}}}}, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}}, "df": 4, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 5}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}}, "df": 2, "s": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}}, "df": 2}}}, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 12, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 2.449489742783178}, "skeletor.pre.fix_mesh": {"tf": 2}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_teasar": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 13}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2.449489742783178}}, "df": 2, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 4}}}}}, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 2.449489742783178}}, "df": 2}}}, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 3}, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}}, "df": 2}}}}, "l": {"0": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}}, "i": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor": {"tf": 4}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 3}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 14, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}}}, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 9, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "f": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}}, "n": {"docs": {"skeletor": {"tf": 3.3166247903554}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.6457513110645907}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 14, "t": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 6, "o": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2}}}}}}, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}}, "df": 3}}}}}}}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 4}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 4}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 3}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}}, "df": 2}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "v": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}}}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}}, "df": 2}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 2.449489742783178}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 2}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 11}, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}, "g": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1, "d": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 10, "k": {"docs": {"skeletor": {"tf": 3.4641016151377544}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2}}, "df": 5, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 3.605551275463989}, "skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 5.196152422706632}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post": {"tf": 2}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 3}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 12}, "n": {"docs": {"skeletor": {"tf": 4.123105625617661}, "skeletor.Skeleton": {"tf": 2.23606797749979}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1.4142135623730951}, "skeletor.Skeleton.show": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2.23606797749979}, "skeletor.post.clean_up": {"tf": 2.6457513110645907}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 22, "s": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 8}, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 3}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 12}}}}}, "e": {"docs": {"skeletor": {"tf": 3}, "skeletor.post": {"tf": 1}, "skeletor.skeletonize": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 8}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}}}, "g": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {"skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "i": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "f": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "p": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1}}, "e": {"docs": {}, "df": 0, "p": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}}, "o": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 3.605551275463989}, "skeletor.post": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 5, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "w": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "c": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}, "r": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7}}}}}, "g": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "b": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}}}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}}}}}}}, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}}}}}}}, "m": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.scene": {"tf": 2.23606797749979}, "skeletor.Skeleton.show": {"tf": 2}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}}, "df": 2}, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}}}, "y": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}}, "df": 5}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}, "t": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}, "w": {"docs": {}, "df": 0, "c": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}}, "df": 4}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}}, "df": 2}}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 3}}}, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 3}}}, "e": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 3}}, "t": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "l": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1, "u": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2}}}}, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 7, "f": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 6}, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 7}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7}}}}, "p": {"docs": {"skeletor": {"tf": 2}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 2.23606797749979}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 8}, "m": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "n": {"docs": {"skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 4, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}, "k": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "j": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 4, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 9, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 5}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2}}, "df": 3, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 11}}}, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {"skeletor.post.radii": {"tf": 1.7320508075688772}}, "df": 1, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}, "w": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 4}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 2}}}}, "e": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 2}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 2}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 3}}}}, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 3}}, "t": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 5}}}, "p": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2}}}, "t": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}}}, "t": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 4, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 2.8284271247461903}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 3.3166247903554}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 12}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 3}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_wavefront": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 11}, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "e": {"docs": {"skeletor": {"tf": 5.656854249492381}, "skeletor.Skeleton": {"tf": 2}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1.7320508075688772}, "skeletor.Skeleton.show": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 2}, "skeletor.post": {"tf": 2.449489742783178}, "skeletor.post.radii": {"tf": 3.4641016151377544}, "skeletor.post.clean_up": {"tf": 3.605551275463989}, "skeletor.pre": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 2}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 6.324555320336759}, "skeletor.skeletonize": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 3.7416573867739413}, "skeletor.skeletonize.by_wavefront": {"tf": 3.872983346207417}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 4.358898943540674}, "skeletor.skeletonize.by_edge_collapse": {"tf": 3}, "skeletor.skeletonize.by_tangent_ball": {"tf": 3.3166247903554}}, "df": 20, "m": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}}, "i": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}, "t": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.post.clean_up": {"tf": 1.7320508075688772}}, "df": 1}}, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "b": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "o": {"docs": {"skeletor": {"tf": 5.656854249492381}, "skeletor.Skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 4}, "skeletor.post.clean_up": {"tf": 2.8284271247461903}, "skeletor.pre": {"tf": 2.23606797749979}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 2}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 3.4641016151377544}, "skeletor.skeletonize": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 2}, "skeletor.skeletonize.by_wavefront": {"tf": 3}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2}}, "df": 18, "p": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 2, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}}, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "o": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}}, "df": 1}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}}}, "e": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 3, "/": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.simplify": {"tf": 2}, "skeletor.pre.remesh": {"tf": 2}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 17}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}}}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 11}}, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}}}, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1}}, "df": 2}}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 5, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}}, "df": 3}}}, "i": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.clean_up": {"tf": 1.4142135623730951}}, "df": 1, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1.4142135623730951}}, "df": 1}}}, "o": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6, "o": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 3, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}}}}}}}, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 3, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "i": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.clean_up": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}, "w": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 3, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2}}, "df": 3}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 3}}}}}}}}}}, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 2}}}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"1": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1.4142135623730951}}, "df": 2, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 6}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 2.23606797749979}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 4}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}}}}}, "h": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}}}}, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "s": {"docs": {"skeletor.skeletonize": {"tf": 2.449489742783178}}, "df": 1}}, "o": {"docs": {}, "df": 0, "u": {"docs": {"skeletor": {"tf": 3.3166247903554}, "skeletor.post": {"tf": 2}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}}, "df": 8, "r": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 9}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 2, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 6, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2.6457513110645907}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 3.4641016151377544}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 5}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}}, "df": 1}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "/": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "x": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 4, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 2}, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 3}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "p": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.Skeleton.copy": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 4}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}}, "df": 1, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 12}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}}, "df": 2}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "u": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1, "n": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}, "i": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}, "l": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 2}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 2}}, "df": 5, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2}}, "df": 2, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}}, "df": 2}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}}, "e": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9, "t": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}}, "df": 2}}, "d": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 4, "s": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.449489742783178}}, "df": 4}}}}, "x": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.8284271247461903}, "skeletor.example_mesh": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 3, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}}}}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 2}}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 4}}}}, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}}}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 6}}, "r": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "y": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}}}}}}}, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}}, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 7}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.8284271247461903}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 11, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 3}}}, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1.4142135623730951}}, "df": 3}}}}}}, "y": {"docs": {"skeletor": {"tf": 3.3166247903554}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 11}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 3}}, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}}, "df": 2, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}}, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}}, "e": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 9}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}}}}, "m": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}}, "df": 2, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 6.4031242374328485}, "skeletor.Skeleton": {"tf": 2.6457513110645907}, "skeletor.Skeleton.skel_map": {"tf": 1.4142135623730951}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 2.23606797749979}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2.8284271247461903}, "skeletor.post.clean_up": {"tf": 2.6457513110645907}, "skeletor.pre": {"tf": 2.6457513110645907}, "skeletor.pre.fix_mesh": {"tf": 3}, "skeletor.pre.simplify": {"tf": 2}, "skeletor.pre.remesh": {"tf": 2}, "skeletor.pre.contract": {"tf": 4.242640687119285}, "skeletor.skeletonize": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_teasar": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_wavefront": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 3.7416573867739413}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_tangent_ball": {"tf": 3.4641016151377544}}, "df": 20, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 3}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 8}}, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 4}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 3}, "l": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "n": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 5, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "s": {"docs": {"skeletor.Skeleton": {"tf": 1.4142135623730951}}, "df": 1}}, "c": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 4, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}, "x": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 1}}}, "y": {"docs": {"skeletor": {"tf": 2.23606797749979}}, "df": 1}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 8}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}, "r": {"docs": {"skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}}, "df": 2}}}, "y": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}, "e": {"docs": {"skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}}, "df": 2}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "g": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 8, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}}, "l": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 1, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}}}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}, "+": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}}}}, "t": {"docs": {"skeletor": {"tf": 9.746794344808963}, "skeletor.example_mesh": {"tf": 3}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 3.872983346207417}, "skeletor.skeletonize.by_tangent_ball": {"tf": 3.4641016151377544}}, "df": 5}, "h": {"docs": {}, "df": 0, "z": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "p": {"docs": {}, "df": 0, "l": {"3": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}}}}, "a": {"docs": {"skeletor": {"tf": 5}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 3.1622776601683795}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_wavefront": {"tf": 3.3166247903554}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2.6457513110645907}}, "df": 16, "n": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9, "d": {"docs": {"skeletor": {"tf": 4.123105625617661}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 3}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_wavefront": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2.23606797749979}}, "df": 14}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "o": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "m": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "l": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 6}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 3}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}}, "df": 10, "a": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton": {"tf": 2.23606797749979}}, "df": 2, "s": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}}}, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.skeleton": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 10, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}, "x": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}}}}, "l": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}, "j": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}}, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2}}, "df": 3}}}}, "m": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5, "t": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}, "g": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}, "p": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}, "k": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "x": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {"skeletor": {"tf": 4}, "skeletor.Skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 2}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 4.242640687119285}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_wavefront": {"tf": 3.3166247903554}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 20, "f": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 3}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {"skeletor": {"tf": 2}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2}}, "df": 13, "g": {"docs": {}, "df": 0, "/": {"1": {"0": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}, "docs": {}, "df": 0}, "docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "@": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 1, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 5}}, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 5, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 13, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 6}, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "g": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 2.449489742783178}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 2.449489742783178}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 9, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}}}}}, "b": {"docs": {}, "df": 0, "j": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "w": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "k": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "l": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "f": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 3.4641016151377544}, "skeletor.Skeleton": {"tf": 2.23606797749979}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 2.23606797749979}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 3}, "skeletor.skeletonize.by_wavefront": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 3}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2}}, "df": 15}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 8}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "y": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1.4142135623730951}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}}}}, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 6}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 3}}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}}}}}}}}}}}, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5, "s": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_teasar": {"tf": 2}, "skeletor.skeletonize.by_wavefront": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2.23606797749979}}, "df": 12}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 2}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}}, "df": 3}}, "l": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre": {"tf": 1.4142135623730951}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 3.4641016151377544}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 2.23606797749979}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.8284271247461903}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 13, "m": {"docs": {}, "df": 0, "a": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 2, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 2}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"skeletor": {"tf": 2}, "skeletor.Skeleton": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 10}, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {"skeletor": {"tf": 2.8284271247461903}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 7, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 3}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 3}, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}}}, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 4}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor": {"tf": 2}, "skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize": {"tf": 1.4142135623730951}}, "df": 4}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}}, "df": 2}, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 7}}, "w": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}}, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 5}}, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7}, "l": {"docs": {}, "df": 0, "f": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}, "l": {"docs": {}, "df": 0, "p": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "a": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}, "k": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 5, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}, "b": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {"skeletor.pre.contract": {"tf": 2.23606797749979}}, "df": 1, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}, "f": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1.4142135623730951}}, "df": 2}}, "o": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}, "w": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "t": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 2}, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2, "r": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "i": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 7}}}, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 3, "s": {"docs": {"skeletor.post.radii": {"tf": 1.7320508075688772}}, "df": 1}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "e": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 2, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1.7320508075688772}}, "df": 2, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3, "s": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 9, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}, "s": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 15}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "d": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.show": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}}, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 8}}}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.Skeleton.show": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 4}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 3}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2.23606797749979}}, "df": 2}}, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 4, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "/": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 15}, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.post.clean_up": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {"skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "h": {"3": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.Skeleton.skeleton": {"tf": 1}}, "df": 1}}, "docs": {"skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 2}}, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "p": {"docs": {}, "df": 0, "i": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 2}}}}}, "i": {"docs": {}, "df": 0, "p": {"3": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 3.605551275463989}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 2}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 7, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "o": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 2}, "skeletor.post": {"tf": 1}}, "df": 2}}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}, "j": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}}}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 3}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7}}}, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 5}}}}}, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}}}}}, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1, "t": {"docs": {"skeletor": {"tf": 2.8284271247461903}, "skeletor.post": {"tf": 2}, "skeletor.skeletonize": {"tf": 1}}, "df": 3, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}}, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"2": {"5": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "7": {"5": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}}}}, "d": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}, "k": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1.7320508075688772}}, "df": 3, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 2.23606797749979}}, "df": 2}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}, "e": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "j": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "x": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1, "/": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "z": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}}, "z": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}}}}}}, "pipeline": ["trimmer"], "_isPrebuiltIndex": true}; + /** pdoc search index */const docs = {"version": "0.9.5", "fields": ["qualname", "fullname", "annotation", "default_value", "signature", "bases", "doc"], "ref": "fullname", "documentStore": {"docs": {"skeletor": {"fullname": "skeletor", "modulename": "skeletor", "type": "module", "doc": "What is skeletor?
\n\nUnlike its namesake, this skeletor
\ndoes not (yet) seek to conquer Eternia but to turn meshes into skeletons.
Before we get started some terminology:
\n\n- \n
- a mesh is something that consists of vertices and faces \n
- a skeleton is a (hierarchical) tree-like structure consisting of vertices\n(also called nodes) and edges that connect them \n
Skeletons are useful for a range of reasons. For example:
\n\n- \n
- Typically smaller (less vertices) than the mesh \n
- Have an implicit sense of topology (e.g. \"this node is distal to that node\") \n
Extracting skeletons from meshes (or other types of data such as voxels) is\nnon-trivial and there are a great many research papers exploring various\ndifferent approaches (see Google scholar).
\n\nskeletor
implements some algorithms that I found useful in my work with\nneurons. In my experience there is unfortuntely no magic bullet when it\ncomes to skeletonization and chances are you will have to fiddle around a bit\nto get decent results.
Installation
\n\nFrom PyPI:
\n\npip3 install skeletor\n
For the bleeding-edge version from Github:
\n\npip3 install git+https://github.com/navis-org/skeletor@master\n
Getting started
\n\nA skeletonization pipeline typically consists of:
\n\n- \n
- Some pre-processing of the mesh (e.g. fixing some potential errors like\ndegenerate faces, unreferenced vertices, etc.) \n
- The skeletonization itself \n
- Some post-processing of the skeleton (e.g. adding radius information) \n
\n\n
Here is a complete list of available functions:
\n\nfunction | \ndescription | \n
---|---|
example data | \n\n |
skeletor.example_mesh() | \n load an example mesh | \n
pre-processing | \n\n |
skeletor.pre.fix_mesh() | \n fix some common errors found in meshes | \n
skeletor.pre.remesh() | \n re-generate mesh (uses Blender 3D) | \n
skeletor.pre.simplify() | \n reduce mesh complexity (uses Blender 3D) | \n
skeletor.pre.contract() | \n contract mesh to facilitate skeletonization [1] | \n
skeletonization | \n\n |
skeletor.skeletonize.by_wavefront() | \n very fast, works well for tubular meshes (like neurons) | \n
skeletor.skeletonize.by_vertex_clusters() | \n very fast but needs mesh to be contracted (see above) | \n
skeletor.skeletonize.by_edge_collapse() | \n presented in [1] but never got this to work well | \n
skeletor.skeletonize.by_teasar() | \n very fast and robust, works on mesh surface | \n
skeletor.skeletonize.by_tangent_ball() | \n very fast, best on smooth meshes | \n
postprocessing | \n\n |
skeletor.post.clean_up() | \n fix some potential errors in the skeleton | \n
skeletor.post.radii() | \n add radius information using various method | \n
\n\n
See docstrings of the respective functions for details.
\n\nA pipeline might look like this:
\n\n- \n
skeletor.pre.fix_mesh()
to fix the mesh \nskeletor.pre.simplify()
to simplify the mesh \nskeletor.pre.contract()
to contract the mesh [1] \nskeletor.skeletonize.vertex_clusters()
to generate a skeleton \nskeletor.post.clean_up()
to clean up some potential issues with the skeleton \nskeletor.post.radii()
to extract radii either by k-nearest neighbours or ray-casting \n
In my experience there is no one-size-fits-all. You will have to play around to\nfind the right approach and parameters to get nice skeletons for your meshes.\nIf you need help just open an issue.
\n\nAlso check out the Gotchas below!
\n\nExamples
\n\nFirst load the example mesh (a fruit fly neuron):
\n\n>>> import skeletor as sk\n>>> mesh = sk.example_mesh()\n>>> mesh\n<trimesh.Trimesh(vertices.shape=(6582, 3), faces.shape=(13772, 3))>\n
Next see if there is stuff to fix in the mesh (degenerate faces, duplicate\nvertices, etc.):
\n\n>>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False)\n>>> fixed\n<trimesh.Trimesh(vertices.shape=(6213, 3), faces.shape=(12805, 3))>\n
Now for tubular meshes like this neuron, the \"wave front\" skeletonization method\nperforms really well: it works by casting waves across the mesh and collapsing\nthe resulting rings into a skeleton (kinda like when you throw a stone in a\npond and track the expanding ripples).
\n\n>>> skel = sk.skeletonize.by_wavefront(fixed, waves=1, step_size=1)\n>>> skel\n<Skeleton(vertices=(1258, 3), edges=(1194, 2), method=wavefront)>\n
All skeletonization methods return a Skeleton
object. These are just\nconvenient objects to bundle the various outputs of the skeletonization.
>>> # x/y/z location of skeleton vertices (nodes)\n>>> skel.vertices\narray([[16744, 36720, 26407],\n ...,\n [22076, 23217, 24472]])\n>>> # child -> parent edges\n>>> skel.edges\narray([[ 64, 31],\n ...,\n [1257, 1252]])\n>>> # Mapping for mesh to skeleton vertex indices\n>>> skel.mesh_map\narray([ 157, 158, 1062, ..., 525, 474, 547])\n>>> # SWC table\n>>> skel.swc.head()\n node_id parent_id x y z radius\n0 0 -1 16744.005859 36720.058594 26407.902344 0.000000\n1 1 -1 5602.751953 22266.756510 15799.991211 7.542587\n2 2 -1 16442.666667 14999.978516 10887.916016 5.333333\n
SWC is a commonly used format for saving skeletons. Skeleton
objects\nhave a method for quickly saving a correctly formatted SWC file:
>>> skel.save_swc('~/Documents/my_skeleton.swc')\n
If you installed pyglet
(see above) you can also use trimesh
's plotting\ncapabilities to inspect the results:
>>> skel.show(mesh=True)\n
That looks pretty good already but let's run some pro-forma postprocessing.
\n\n>>> sk.post.clean_up(skel, inplace=True)\n<Skeleton(vertices=(1071, 3), edges=(1070, 2))>\n
So that would be a full pipeline mesh to skeleton. Don't expect your own meshes\nto produce such nice results off the bat though. Chances are you will need to\nplay around to find the right recipe. If you don't know where to start, I suggest\nyou try out mesh contraction + vertex clustering first:
\n\n>>> import skeletor as sk\n>>> mesh = sk.example_mesh()\n>>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False)\n>>> # Contract mesh to 10% (0.1) of original volume\n>>> cont = sk.pre.contract(fixed, epsilon=0.1)\n>>> # Skeletonize\n>>> skel = sk.skeletonize.by_vertex_clusters(cont, sampling_dist=100)\n>>> # Replace contracted mesh with original for postprocessing and plotting\n>>> skel.mesh = fixed\n>>> # Add radii (vertex cluster method does not do that automatically)\n>>> sk.post.radii(skel, method='knn')\n>>> skel.show(mesh=True)\n
Gotchas
\n\n- \n
- while this is a general purpose library, my personal focus is on neurons and\nthis has certainly influenced things like default parameter values and certain\npost-processing steps \n
- meshes need to be triangular (we are using
trimesh
) \n - use
sk.pre.simplify
if your mesh is very complex (half a million vertices is\nwhere things start getting sluggish) \n - a good mesh contraction is often half the battle \n
- if the mesh consists of multiple disconnected pieces the skeleton will\nlikewise be fragmented (i.e. will have multiple roots) \n
Benchmarks
\n\n\n\nBenchmarks\nwere run on a 2018 MacBook Pro (2.2 GHz Core i7, 32Gb memory) with optional\nfastremap
dependency installed. Note some of these functions (e.g.\ncontraction and TEASAR/vertex cluster skeletonization) vary a lot in\nspeed based on parameterization.
What about algorithm X
?
\n\nskeletor
contains some algorithms that I found easy enough to implement\nand useful for my work with neurons. If you have some interesting paper/approach\nthat could make a nice addition to skeletor
, please get in touch on Github.\nPull requests are always welcome!
References
\n\n[1] 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.
The abstract and the paper can be found here.\nAlso see this YouTube video.
\n\nSome of the code in skeletor was modified from the\nPy_BL_MeshSkeletonization\naddon created by #0K Srinivasan Ramachandran and published under GPL3.
\n\nTop-level functions and classes
\n\nAt top-level we only expose example_mesh()
and the Skeleton
class (which\nyou probably won't ever need to touch manually). Everything else is neatly\ntucked away into submodules (see side-bar or above table).
Class representing a skeleton.
\n\nTypically returned as results from a skeletonization.
\n\nAttributes
\n\n- \n
- swc (pd.DataFrame, optional):\nSWC table. \n
- vertices ((N, 3) array):\nVertex (node) positions. \n
- edges ((M, 2) array):\nIndices of connected vertex pairs. \n
- radii ((N, ) array, optional):\nRadii for each vertex (node) in the skeleton. \n
- mesh (trimesh, optional):\nThe original mesh. \n
- mesh_map (array, optional):\nSame length as
mesh
. Maps mesh vertices to vertices (nodes)\nin the skeleton. \n - skel_map (array of arrays, optional):\nInverse of
mesh_map
: maps skeleton vertices (nodes) to mesh\nvertices. \n - method (str, optional):\nWhich method was used to generate the skeleton. \n
Return skeleton edges.
\n"}, "skeletor.Skeleton.vertices": {"fullname": "skeletor.Skeleton.vertices", "modulename": "skeletor", "qualname": "Skeleton.vertices", "type": "variable", "doc": "Return skeleton vertices (nodes).
\n"}, "skeletor.Skeleton.radius": {"fullname": "skeletor.Skeleton.radius", "modulename": "skeletor", "qualname": "Skeleton.radius", "type": "variable", "doc": "Return radii.
\n"}, "skeletor.Skeleton.skeleton": {"fullname": "skeletor.Skeleton.skeleton", "modulename": "skeletor", "qualname": "Skeleton.skeleton", "type": "variable", "doc": "Skeleton as trimesh Path3D.
\n"}, "skeletor.Skeleton.skel_map": {"fullname": "skeletor.Skeleton.skel_map", "modulename": "skeletor", "qualname": "Skeleton.skel_map", "type": "variable", "doc": "Skeleton vertex (nodes) to mesh vertices. Based on mesh_map
.
Leaf nodes (includes root).
\n"}, "skeletor.Skeleton.reindex": {"fullname": "skeletor.Skeleton.reindex", "modulename": "skeletor", "qualname": "Skeleton.reindex", "type": "function", "doc": "Clean up skeleton.
\n", "signature": "(self, inplace=False)", "funcdef": "def"}, "skeletor.Skeleton.copy": {"fullname": "skeletor.Skeleton.copy", "modulename": "skeletor", "qualname": "Skeleton.copy", "type": "function", "doc": "Return copy of the skeleton.
\n", "signature": "(self)", "funcdef": "def"}, "skeletor.Skeleton.get_graph": {"fullname": "skeletor.Skeleton.get_graph", "modulename": "skeletor", "qualname": "Skeleton.get_graph", "type": "function", "doc": "Generate networkX representation of the skeletons.
\n\nDistance between nodes will be used as edge weights.
\n\nReturns
\n\n- \n
- networkx.DiGraph \n
Save skeleton in SWC format.
\n\nParameters
\n\n- \n
- filepath (path-like):\nFilepath to save SWC to. \n
Return a Scene object containing the skeleton.
\n\nReturns
\n\n- \n
- scene (trimesh.scene.scene.Scene):\nContains the skeleton and optionally the mesh. \n
Render the skeleton in an opengl window. Requires pyglet.
\n\nParameters
\n\n- \n
- mesh (bool):\nIf True, will render transparent mesh on top of the\nskeleton. \n
Returns
\n\n- \n
- scene (trimesh.scene.Scene):\nScene with skeleton in it. \n
Load and return example mesh.
\n\nThe example mesh is a fruit fly neuron (an olfactory projection neuron of\nthe DA1 glomerulus) segmented from an EM image data set. It is part of the\nJanelia hemibrain data set (see here) [1].
\n\nReferences
\n\n[1] Louis K. Scheffer et al., eLife. 2020. doi: 10.7554/eLife.57443\nA connectome and analysis of the adult Drosophila central brain
\n\nReturns
\n\n- \n
- trimesh.Trimesh \n
Examples
\n\n>>> import skeletor as sk\n>>> # Load this example mesh\n>>> mesh = sk.example_mesh()\n
The skeletor.post
module contains functions to post-process skeletons after\nskeletonization.
Fixing issues with skeletons
\n\nDepending on your mesh, pre-processing and the parameters you chose for\nskeletonization, chances are that your skeleton will not come out perfectly.
\n\nskeletor.post.clean_up
can help you solve some potential issues:
- \n
- skeleton nodes (vertices) that outside or right on the surface instead of\ncentered inside the mesh \n
- superfluous \"hairs\" on otherwise straight bits \n
Computing radius information
\n\nOnly skeletor.skeletonize.by_wavefront()
provides radii off the bat. For all\nother methods, you might want to run skeletor.post.radii
can help you\n(re-)generate radius information for the skeletons.
Extract radii for given skeleton table.
\n\nImportant
\n\nThis function really only produces useful radii if the skeleton is centered\ninside the mesh. by_wavefront
does that by default whereas all other\nskeletonization methods don't. Your best bet to get centered skeletons is\nto contract the mesh first (sk.pre.contract
).
Parameters
\n\n- \n
- s (skeletor.Skeleton):\nSkeleton to clean up. \n
- mesh (trimesh.Trimesh, optional):\nOriginal mesh (e.g. before contraction). If not provided will\nuse the mesh associated with
s
. \n method (\"knn\" | \"ray\"):\nWhether and how to add radius information to each node::
\n\n- \n
- \"knn\" uses k-nearest-neighbors to get radii: fast but\n potential for being very wrong \n
- \"ray\" uses ray-casting to get radii: slower but sometimes\n less wrong \n
\n- aggregate (\"mean\" | \"median\" | \"max\" | \"min\" | \"percentile75\"):\nFunction used to aggregate radii over sample (i.e. across\nk nearest-neighbors or ray intersections) \n
- validate (bool):\nIf True, will try to fix potential issues with the mesh\n(e.g. infinite values, duplicate vertices, degenerate faces)\nbefore skeletonization. Note that this might make changes to\nyour mesh inplace! \n
- **kwargs: Keyword arguments are passed to the respective method: \n
For method \"knn\"::
\n\nn : int (default 5)\n Radius will be the mean over n nearest-neighbors.\n
\n\nFor method \"ray\"::
\n\nn_rays : int (default 20)\n Number of rays to cast for each node.\nprojection : \"sphere\" (default) | \"tangents\"\n Whether to cast rays in a sphere around each node or in a\n circle orthogonally to the node's tangent vector.\nfallback : \"knn\" (default) | None | number\n If a point is outside or right on the surface of the mesh\n the raycasting will return nonesense results. We can either\n ignore those cases (``None``), assign a arbitrary number or\n we can fall back to radii from k-nearest-neighbors (``knn``).\n
\n\nReturns
\n\n- \n
- None: But attaches
radius
to the skeleton's SWC table. Existing\nvalues are replaced! \n
Clean up the skeleton.
\n\nThis function bundles a bunch of procedures to clean up the skeleton:
\n\n- \n
- Remove twigs that are running parallel to their parent branch \n
- Move nodes outside the mesh back inside (or at least snap to surface) \n
Note that this is not a magic bullet and some of this will not work (well)\nif the original mesh was degenerate (e.g. internal faces or not watertight)\nto begin with.
\n\nParameters
\n\n- \n
- s (skeletor.Skeleton):\nSkeleton to clean up. \n
- mesh (trimesh.Trimesh, optional):\nOriginal mesh (e.g. before contraction). If not provided will\nuse the mesh associated with
s
. \n - validate (bool):\nIf True, will try to fix potential issues with the mesh\n(e.g. infinite values, duplicate vertices, degenerate faces)\nbefore cleaning up. Note that this might change your mesh\ninplace! \n
- inplace (bool):\nIf False will make and return a copy of the skeleton. If True,\nwill modify the
s
inplace. \n - **kwargs: Keyword arguments are passed to the bundled function. \n
For skeletor.postprocessing.drop_parallel_twigs
::
theta : float (default 0.01)\n For each twig we generate the dotproduct between the tangent\n vectors of it and its parents. If these line up perfectly the\n dotproduct will equal 1. theta
determines how much that\n value can differ from 1 for us to still prune the twig: higher\n theta = more pruning.
Returns
\n\n- \n
- s_clean (skeletor.Skeleton):\nHopefully improved skeleton. \n
The skeletor.pre
module contains functions to pre-process meshes before\nskeletonization.
Fixing faulty meshes
\n\nSome skeletonization methods are susceptible to faulty meshes (degenerate faces,\nwrong normals, etc.). If your skeleton looks off, it might be worth a shot\ntrying to fix the mesh using skeletor.pre.fix_mesh()
.
Mesh contraction
\n\nAs a rule of thumb: the more your mesh looks like a skeleton, the easier it is\nto extract one (duh). Mesh contraction using skeletor.pre.contract()
[1] can\nhelp you to get your mesh \"in shape\".
References
\n\n[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh\n contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.
\n"}, "skeletor.pre.fix_mesh": {"fullname": "skeletor.pre.fix_mesh", "modulename": "skeletor.pre", "qualname": "fix_mesh", "type": "function", "doc": "Try to fix some common problems with mesh.
\n\n- \n
- Remove infinite values \n
- Merge duplicate vertices \n
- Remove duplicate and degenerate faces \n
- Remove unreference vertices \n
- Drop winglets (faces that have only one adjacent face) \n
- Fix normals (Optional) \n
- Remove disconnected fragments (Optional) \n
Parameters
\n\n- \n
- mesh (mesh-like object):\nMesh to fix. Must have
.vertices
and.faces
\nproperties. \n - remove_disconnected (False | int):\nIf a number is given, will iterate over the mesh's\nconnected components and remove those consisting of\nless than the given number of vertices. For example,\n
remove_disconnected=5
will drop parts of the\nmesh that consist of five or less connected\nvertices. \n - inplace (bool):\nIf True, will perform fixes on the input mesh.\nIf False, will make a copy first. This is silently\nignored if
mesh
is not already a trimesh. \n
Returns
\n\n- \n
- fixed mesh (trimesh.Trimesh): \n
Simplify mesh using Blender 3D.
\n\nUses Blender's \"decimate\" modifier in \"collapse\" mode.
\n\nParameters
\n\n- \n
- mesh (trimesh.Trimesh):\nMesh to simplify. \n
- ratio (float):\nFactor to which to reduce faces. For example, a ratio of 0.5 will\nreduce the number of faces to 50%. \n
Returns
\n\n- \n
- trimesh.Trimesh: Simplified mesh. \n
Remesh mesh using Blender 3D.
\n\nUses Blender's \"remesh\" modifier in \"voxel\" mode.
\n\nParameters
\n\n- \n
- mesh (trimesh.Trimesh):\nMesh to remesh. \n
- voxel_size (float):\nSize of individual voxels (edge length). \n
- adaptivity (float):\nReduces final face count where detail is not important. \n
Returns
\n\n- \n
- trimesh.Trimesh: Remeshed mesh. \n
Contract mesh.
\n\nIn a nutshell: this function contracts the mesh by applying rounds of\n_constraint_ Laplacian smoothing. This function can be fairly expensive\nand I highly recommend you play around with SL
to contract the\nmesh in as few steps as possible. The contraction doesn't have to be perfect\nfor good skeletonization results (<10%, i.e. epsilon<0.1
).
Also: parameterization matters a lot! Default parameters will get you there\nbut playing around with SL
and WH0
might speed things up by an order of\nmagnitude.
Parameters
\n\n- \n
- mesh (mesh obj):\nThe mesh to be contracted. Can be any object (e.g.\na trimesh.Trimesh) that has
.vertices
and.faces
\nproperties or a tuple(vertices, faces)
or a dictionary\n{'vertices': vertices, 'faces': faces}
.\nVertices and faces must be (N, 3) numpy arrays. \n - epsilon (float (0-1), optional):\nTarget contraction rate as measured by the sum of all face\nareas in the contracted versus the original mesh. Algorithm\nwill stop once mesh is contracted below this threshold.\nDepending on your mesh (number of faces, shape) reaching a\nstrong contraction can be extremely costly with comparatively\nlittle benefit for the subsequent skeletonization. Note that\nthe algorithm might stop short of this target if
iter_lim
\nortime_lim
is reached first or if the sum of face areas\nis increasing from one iteration to the next instead of\ndecreasing. \n - iter_lim (int (>1), optional):\nMaximum rounds of contractions. \n
- time_lim (int, optional):\nMaximum run time in seconds. Note that this limit is not\nchecked during but after each round of contraction. Hence,\nthe actual total time will likely overshoot
time_lim
. \n - precision (float, optional):\nSets the precision for finding the least-square solution.\nThis is the main determinant for speed vs quality: lower\nvalues will take (much) longer but will get you closer to an\noptimally contracted mesh. Higher values will be faster but\nthe iterative contractions might stop early. \n
- SL (float, optional):\nFactor by which the contraction matrix is multiplied for\neach iteration. Higher values = quicker contraction, lower\nvalues = more likely to get you an optimal contraction. \n
- WH0 (float, optional):\nInitial weight factor for the attraction constraints.\nThe ratio of the initial weights
WL0
andWH0
\ncontrols the smoothness and the degree of contraction of the\nfirst iteration result, thus it determines the amount of\ndetails retained in subsequent and final contracted meshes:\nhigherWH0
= more details retained. \n - WL0 (\"auto\" | float):\nInitial weight factor for the contraction constraints. By\ndefault (\"auto\"), this will be set to
1e-3 * sqrt(A)
\nwithA
being the average face area. This ensures that\ncontraction forces scale with the coarseness of the mesh. \n operator (\"cotangent\" | \"umbrella\"):\nWhich Laplacian operator to use:
\n\n- \n
- The \"cotangent\" operator (default) takes both topology\nand geometry of the mesh into account and is hence a\nbetter descriptor of the curvature flow. This is the\noperator used in the original paper. \n
- The \"umbrella\" operator (aka \"uniform weighting\") uses\nonly topological features of the mesh. This also makes\nit more robust against flaws in the mesh! Use it when\nthe cotangent operator produces oddly contracted meshes. \n
\n- progress (bool):\nWhether or not to show a progress bar. \n
- validate (bool):\nIf True, will try to fix potential issues with the mesh\n(e.g. infinite values, duplicate vertices, degenerate faces)\nbefore collapsing. Degenerate meshes can lead to effectively\ninfinite runtime for this function! \n
Returns
\n\n- \n
- trimesh.Trimesh: Contracted copy of original mesh. The final contraction rate\nis attached to the mesh as
.epsilon
property. \n
References
\n\n[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh\n contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.
\n", "signature": "(\n mesh,\n epsilon=1e-06,\n iter_lim=100,\n time_lim=None,\n precision=1e-07,\n SL=2,\n WH0=1,\n WL0='auto',\n operator='cotangent',\n progress=True,\n validate=True\n)", "funcdef": "def"}, "skeletor.skeletonize": {"fullname": "skeletor.skeletonize", "modulename": "skeletor.skeletonize", "type": "module", "doc": "The skeletor.skeletonize
module contains functions to for skeletonization\nof meshes.
There are several approaches to skeletonizing a mesh. Which one to pick depends\n(among other things) on the shape of your mesh and the skeleton quality you want\nto get out of it. In general, unless you mesh already looks like a tube I\nrecommend looking into mesh contraction 4.
\n\nPlease see the documentation of the individual functions for details but here\nis a quick summary:
\n\nfunction | \nspeed | \nrobust | \nradii 1 | \nmesh map 2 | \ndescription | \n
---|---|---|---|---|---|
skeletor.skeletonize.by_wavefront() | \n +++ | \n++ | \nyes | \nyes | \nworks well for tubular meshes | \n
skeletor.skeletonize.by_vertex_clusters() | \n ++ | \n+ | \nno | \nyes | \nbest with contracted meshes 3 | \n
skeletor.skeletonize.by_teasar() | \n + | \n++ | \nno | \nyes | \nworks on mesh surface | \n
skeletor.skeletonize.by_tangent_ball() | \n ++ | \n0 | \nyes | \nyes | \nworks with mesh normals | \n
skeletor.skeletonize.by_edge_collapse() | \n - | \n0 | \nno | \nno | \npublished with [1] - never got this to work well | \n
References
\n\n[1] 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.
\n\n
Skeletonize a mesh mesh using the TEASAR algorithm [1].
\n\nThis algorithm finds the longest path from a root vertex, invalidates all\nvertices that are within inv_dist
. Then picks the second longest (and\nstill valid) path and does the same. Rinse & repeat until all vertices have\nbeen invalidated. It's fast + works very well with tubular meshes, and with\ninv_dist
you have control over the level of detail. Note that by its\nnature the skeleton will be exactly on the surface of the mesh.
Based on the implementation by Sven Dorkenwald, Casey Schneider-Mizell and\nForrest Collman in meshparty
(https://github.com/sdorkenw/MeshParty).
Parameters
\n\n- \n
- mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n
.vertices
and.faces
properties (e.g. a\ntrimesh.Trimesh) or a tuple(vertices, faces)
or a\ndictionary{'vertices': vertices, 'faces': faces}
. \n - inv_dist (int | float):\nDistance along the mesh used for invalidation of vertices.\nThis controls how detailed (or noisy) the skeleton will be. \n
- min_length (float, optional):\nIf provided, will skip any branch that is shorter than\n
min_length
. Use this to get rid of noise but note that\nit will lead to vertices not being mapped to skeleton nodes.\nSuch vertices will show up with index -1 in\nSkeleton.mesh_map
. \n - root (int, optional):\nVertex ID of a root. If not provided will use
0
. \n - progress (bool, optional):\nIf True, will show progress bar. \n
Returns
\n\n- \n
- skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization. \n
References
\n\n[1] Sato, M., Bitter, I., Bender, M. A., Kaufman, A. E., & Nakajima, M.\n (n.d.). TEASAR: tree-structure extraction algorithm for accurate and\n robust skeletons. In Proceedings the Eighth Pacific Conference on\n Computer Graphics and Applications. IEEE Comput. Soc.\n https://doi.org/10.1109/pccga.2000.883951
\n", "signature": "(mesh, inv_dist, min_length=None, root=None, progress=True)", "funcdef": "def"}, "skeletor.skeletonize.by_wavefront": {"fullname": "skeletor.skeletonize.by_wavefront", "modulename": "skeletor.skeletonize", "qualname": "by_wavefront", "type": "function", "doc": "Skeletonize a mesh using wave fronts.
\n\nThe algorithm tries to find rings of vertices and collapse them to\ntheir center. This is done by propagating a wave across the mesh starting at\na single seed vertex. As the wave travels across the mesh we keep track of\nwhich vertices are are encountered at each step. Groups of connected\nvertices that are \"hit\" by the wave at the same time are considered rings\nand subsequently collapsed. By its nature this works best with tubular meshes.
\n\nParameters
\n\n- \n
- mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n
.vertices
and.faces
properties (e.g. a\ntrimesh.Trimesh) or a tuple(vertices, faces)
or a\ndictionary{'vertices': vertices, 'faces': faces}
. \n - waves (int):\nNumber of waves to run across the mesh. Each wave is\ninitialized at a different vertex which produces slightly\ndifferent rings. The final skeleton is produced from a mean\nacross all waves. More waves produce higher resolution\nskeletons but also introduce more noise. \n
- origins (int | list of ints, optional):\nVertex ID(s) where the wave(s) are initialized. If we run\nout of origins (either because less
origins
thanwaves
\nor because no origin for one of the connected components)\nwill fall back to semi-random origin. \n - step_size (int):\nValues greater 1 effectively lead to binning of rings. For\nexample a stepsize of 2 means that two adjacent vertex rings\nwill be collapsed to the same center. This can help reduce\nnoise in the skeleton (and as such counteracts a large\nnumber of waves). \n
- radius_agg (\"mean\" | \"median\" | \"max\" | \"min\" | \"percentile75\" | \"percentile25\"):\nFunction used to aggregate radii over sample (i.e. the\nvertices forming a ring that we collapse to its center). \n
- progress (bool):\nIf True, will show progress bar. \n
Returns
\n\n- \n
- skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization. \n
Skeletonize a (contracted) mesh by clustering vertices.
\n\nThe algorithm traverses the mesh graph and groups vertices together that\nare within a given distance to each other. This uses the geodesic\n(along-the-mesh) distance, not simply the Eucledian distance. Subsequently\nthese groups of vertices are collapsed and re-connected respecting the\ntopology of the input mesh.
\n\nThe graph traversal is fast and scales well, so this method is well suited\nfor meshes with lots of vertices. On the downside: this implementation is\nnot very clever and you might have to play around with the parameters\n(mostly sampling_dist
) to get decent results.
Parameters
\n\n- \n
- mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n
.vertices
and.faces
properties (e.g. a\ntrimesh.Trimesh) or a tuple(vertices, faces)
or a\ndictionary{'vertices': vertices, 'faces': faces}
. \n - sampling_dist (float | int):\nMaximal distance at which vertices are clustered. This\nparameter should be tuned based on the resolution of your\nmesh (see Examples). \n
cluster_pos (\"median\" | \"center\"):\nHow to determine the x/y/z coordinates of the collapsed\nvertex clusters (i.e. the skeleton's nodes)::
\n\n- \n
- \"median\": Use the vertex closest to cluster's center of\nmass. \n
- \"center\": Use the center of mass. This makes for smoother\nskeletons but can lead to nodes outside the mesh. \n
\n- progress (bool):\nIf True, will show progress bar. \n
Examples
\n\n>>> import skeletor as sk\n>>> mesh = sk.example_mesh()\n>>> cont = sk.pre.contract(mesh, epsilon=0.1)\n>>> skel = sk.skeletonize.vertex_cluster(cont)\n>>> skel.mesh = mesh\n
Returns
\n\n- \n
- skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization. \n
Skeletonize a (contracted) mesh by iteratively collapsing edges.
\n\nThis algorithm (described in [1]) iteratively collapses edges that are part\nof a face until no more faces are left. Edges are chosen based on a cost\nfunction that penalizes collapses that would change the shape of the object\nor would introduce long edges.
\n\nThis is somewhat sensitive to the dimensions of the input mesh: too large\nand you might experience slow-downs or numpy OverflowErrors; too low and\nyou might get skeletons that don't quite match the mesh (e.g. too few nodes).\nIf you experience either, try down- or up-scaling your mesh, respectively.
\n\nParameters
\n\n- \n
- mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n
.vertices
and.faces
properties (e.g. a\ntrimesh.Trimesh) or a tuple(vertices, faces)
or a\ndictionary{'vertices': vertices, 'faces': faces}
. \n - shape_weight (float, optional):\nWeight for shape costs which penalize collapsing edges that\nwould drastically change the shape of the object. \n
- sample_weight (float, optional):\nWeight for sampling costs which penalize collapses that\nwould generate prohibitively long edges. \n
- progress (bool):\nIf True, will show progress bar. \n
Returns
\n\n- \n
- skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization. \n
References
\n\n[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh\n contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.
\n", "signature": "(mesh, shape_weight=1, sample_weight=0.1, progress=True)", "funcdef": "def"}, "skeletor.skeletonize.by_tangent_ball": {"fullname": "skeletor.skeletonize.by_tangent_ball", "modulename": "skeletor.skeletonize", "qualname": "by_tangent_ball", "type": "function", "doc": "Skeletonize a mesh by finding the maximal tangent ball.
\n\nThis algorithm casts a ray from every mesh vertex along its inverse normals\n(requires ncollpyde
). It then creates a sphere that is tangent to the\nvertex and to where the ray hit the inside of a face on the opposite side.\nNext it drops spheres that overlap with another, larger sphere. Modified\nfrom [1].
The method works best on smooth meshes and is rather sensitive to errors in\nthe mesh such as incorrect normals (see skeletor.pre.fix_mesh
), internal\nfaces, noisy surface (try smoothing or downsampling) or holes in the mesh.
Parameters
\n\n- \n
- mesh (mesh obj):\nThe mesh to be skeletonize. Can an object that has\n
.vertices
and.faces
properties (e.g. a\ntrimesh.Trimesh) or a tuple(vertices, faces)
or a\ndictionary{'vertices': vertices, 'faces': faces}
. \n
Returns
\n\n- \n
- skeletor.Skeleton: Holds results of the skeletonization and enables quick\nvisualization. \n
Examples
\n\n>>> import skeletor as sk\n>>> mesh = sk.example_mesh()\n>>> fixed = sk.pre.fix_mesh(mesh, fix_normals=True, remove_disconnected=10)\n>>> skel = sk.skeletonize.by_tangent_ball(fixed)\n
References
\n\n[1] Ma, J., Bae, S.W. & Choi, S. 3D medial axis point approximation using\n nearest neighbors and the normal field. Vis Comput 28, 7\u201319 (2012).\n https://doi.org/10.1007/s00371-011-0594-7
\n", "signature": "(mesh)", "funcdef": "def"}}, "docInfo": {"skeletor": {"qualname": 0, "fullname": 1, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 2771}, "skeletor.Skeleton": {"qualname": 1, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 161}, "skeletor.Skeleton.__init__": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 3}, "skeletor.Skeleton.edges": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 6}, "skeletor.Skeleton.vertices": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 7}, "skeletor.Skeleton.radius": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 5}, "skeletor.Skeleton.skeleton": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 7}, "skeletor.Skeleton.skel_map": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 15}, "skeletor.Skeleton.leafs": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 7}, "skeletor.Skeleton.reindex": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 5, "bases": 0, "doc": 6}, "skeletor.Skeleton.copy": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 3, "bases": 0, "doc": 8}, "skeletor.Skeleton.get_graph": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 3, "bases": 0, "doc": 34}, "skeletor.Skeleton.save_swc": {"qualname": 3, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 4, "bases": 0, "doc": 29}, "skeletor.Skeleton.scene": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 6, "bases": 0, "doc": 35}, "skeletor.Skeleton.show": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 6, "bases": 0, "doc": 60}, "skeletor.example_mesh": {"qualname": 2, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 2, "bases": 0, "doc": 156}, "skeletor.post": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 139}, "skeletor.post.radii": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 12, "bases": 0, "doc": 406}, "skeletor.post.clean_up": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 10, "bases": 0, "doc": 303}, "skeletor.pre": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 143}, "skeletor.pre.fix_mesh": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 29, "bases": 0, "doc": 204}, "skeletor.pre.simplify": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 4, "bases": 0, "doc": 83}, "skeletor.pre.remesh": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 8, "bases": 0, "doc": 86}, "skeletor.pre.contract": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 27, "bases": 0, "doc": 762}, "skeletor.skeletonize": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 437}, "skeletor.skeletonize.by_teasar": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 12, "bases": 0, "doc": 382}, "skeletor.skeletonize.by_wavefront": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 15, "bases": 0, "doc": 388}, "skeletor.skeletonize.by_vertex_clusters": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 10, "bases": 0, "doc": 475}, "skeletor.skeletonize.by_edge_collapse": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 12, "bases": 0, "doc": 297}, "skeletor.skeletonize.by_tangent_ball": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 3, "bases": 0, "doc": 388}}, "length": 30, "save": true}, "index": {"qualname": {"root": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.Skeleton.skel_map": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.leafs": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 14}}}}}}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}}, "w": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}}, "df": 1}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.Skeleton.edges": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.vertices": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.radius": {"tf": 1}}, "df": 1}}, "i": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.Skeleton.reindex": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.Skeleton.skel_map": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.example_mesh": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.leafs": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.Skeleton.copy": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "b": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}}}}, "fullname": {"root": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.Skeleton.skel_map": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.leafs": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 30}, "n": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.leafs": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 14, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6}}}}}}}}}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}}, "w": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}}, "df": 1}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.Skeleton.edges": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.vertices": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.radius": {"tf": 1}}, "df": 1}}, "i": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.Skeleton.reindex": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.Skeleton.skel_map": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.example_mesh": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.leafs": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.Skeleton.copy": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 3}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "b": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}}}}, "annotation": {"root": {"docs": {}, "df": 0}}, "default_value": {"root": {"docs": {}, "df": 0}}, "signature": {"root": {"0": {"6": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "7": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}, "1": {"0": {"0": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 3, "e": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}, "2": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "5": {"0": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}, "docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}, "docs": {"skeletor.Skeleton.__init__": {"tf": 1.4142135623730951}, "skeletor.Skeleton.reindex": {"tf": 1.4142135623730951}, "skeletor.Skeleton.copy": {"tf": 1.4142135623730951}, "skeletor.Skeleton.get_graph": {"tf": 1.4142135623730951}, "skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}, "skeletor.Skeleton.scene": {"tf": 1.4142135623730951}, "skeletor.Skeleton.show": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 19, "s": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "f": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 7}}}, "w": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1.4142135623730951}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 14}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.__init__": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 6}}, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 3}}}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}}, "df": 6}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 1}}}}}}, "x": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "k": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 4}}}}}, "n": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 3}}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 2.23606797749979}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}}, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}, "h": {"0": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "l": {"0": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}}, "bases": {"root": {"docs": {}, "df": 0}}, "doc": {"root": {"0": {"0": {"0": {"0": {"0": {"0": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "5": {"8": {"5": {"9": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "1": {"1": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}, "5": {"8": {"5": {"9": {"4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "9": {"4": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 7, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "1": {"0": {"0": {"7": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "s": {"0": {"0": {"3": {"7": {"1": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}, "docs": {"skeletor": {"tf": 1}}, "df": 1}, "6": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "7": {"0": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "1": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "8": {"8": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}, "1": {"0": {"9": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "docs": {}, "df": 0}, "9": {"4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "2": {"5": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "8": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "8": {"0": {"5": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "3": {"7": {"7": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "4": {"9": {"9": {"9": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "5": {"7": {"9": {"9": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 1}}, "df": 1}, "8": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "6": {"0": {"docs": {"skeletor.skeletonize": {"tf": 2}}, "df": 1}, "4": {"4": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"4": {"4": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 3.7416573867739413}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 2.23606797749979}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 11, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "2": {"0": {"0": {"0": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}, "8": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "docs": {}, "df": 0}, "1": {"2": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "8": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "2": {"0": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}, "2": {"0": {"7": {"6": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "2": {"6": {"6": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "3": {"2": {"1": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "4": {"4": {"7": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "6": {"4": {"0": {"7": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "8": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}, "3": {"1": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "2": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "b": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "3": {"3": {"3": {"3": {"3": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "6": {"7": {"2": {"0": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "9": {"docs": {"skeletor": {"tf": 2}}, "df": 1}, "docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.Skeleton": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}, "4": {"4": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "7": {"4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}, "5": {"0": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}, "2": {"5": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "4": {"2": {"5": {"8": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "6": {"0": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"4": {"4": {"3": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}}, "df": 4}, "6": {"2": {"1": {"3": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "5": {"8": {"2": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "6": {"6": {"6": {"6": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"5": {"1": {"9": {"5": {"3": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "5": {"4": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "docs": {}, "df": 0}, "6": {"5": {"1": {"0": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2, "\u2013": {"1": {"9": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}, "8": {"6": {"1": {"7": {"docs": {"skeletor.skeletonize": {"tf": 2}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "8": {"3": {"9": {"5": {"1": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "9": {"0": {"2": {"3": {"4": {"4": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "1": {"6": {"0": {"1": {"6": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "7": {"8": {"5": {"1": {"6": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "9": {"1": {"2": {"1": {"1": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"skeletor": {"tf": 38.09199390948182}, "skeletor.Skeleton": {"tf": 8}, "skeletor.Skeleton.__init__": {"tf": 1.7320508075688772}, "skeletor.Skeleton.edges": {"tf": 1.7320508075688772}, "skeletor.Skeleton.vertices": {"tf": 1.7320508075688772}, "skeletor.Skeleton.radius": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skel_map": {"tf": 2.23606797749979}, "skeletor.Skeleton.leafs": {"tf": 1.7320508075688772}, "skeletor.Skeleton.reindex": {"tf": 1.7320508075688772}, "skeletor.Skeleton.copy": {"tf": 1.7320508075688772}, "skeletor.Skeleton.get_graph": {"tf": 4}, "skeletor.Skeleton.save_swc": {"tf": 3.872983346207417}, "skeletor.Skeleton.scene": {"tf": 3.872983346207417}, "skeletor.Skeleton.show": {"tf": 5.196152422706632}, "skeletor.example_mesh": {"tf": 8.246211251235321}, "skeletor.post": {"tf": 5.656854249492381}, "skeletor.post.radii": {"tf": 10.198039027185569}, "skeletor.post.clean_up": {"tf": 8.774964387392123}, "skeletor.pre": {"tf": 5.0990195135927845}, "skeletor.pre.fix_mesh": {"tf": 8.366600265340756}, "skeletor.pre.simplify": {"tf": 5.916079783099616}, "skeletor.pre.remesh": {"tf": 6.4031242374328485}, "skeletor.pre.contract": {"tf": 12.36931687685298}, "skeletor.skeletonize": {"tf": 14.966629547095765}, "skeletor.skeletonize.by_teasar": {"tf": 9.539392014169456}, "skeletor.skeletonize.by_wavefront": {"tf": 9.16515138991168}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 14.177446878757825}, "skeletor.skeletonize.by_edge_collapse": {"tf": 8.366600265340756}, "skeletor.skeletonize.by_tangent_ball": {"tf": 12.922847983320086}}, "df": 30, "w": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "h": {"0": {"docs": {"skeletor.pre.contract": {"tf": 2}}, "df": 1}, "docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4, "a": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 8}}}}, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}}, "df": 4, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 5}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}}, "df": 2, "s": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}}, "df": 2}}}, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 12, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 2.449489742783178}, "skeletor.pre.fix_mesh": {"tf": 2}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_teasar": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 13}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2.449489742783178}}, "df": 2, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 4}}}}}, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 2.449489742783178}}, "df": 2}}}, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 3}, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}}, "df": 2}}}}, "l": {"0": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}}, "i": {"7": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor": {"tf": 4}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 3}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 14, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}}}, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 9, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "f": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}}, "n": {"docs": {"skeletor": {"tf": 3.3166247903554}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.6457513110645907}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 14, "t": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 6, "o": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2}}}}}}, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}}, "df": 3}}}}}}}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 4}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 4}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 3}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}}, "df": 2}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "v": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}}}, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.leafs": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}}}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}}, "df": 2}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 2.449489742783178}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 2}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 11}, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}, "g": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1, "d": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 10, "k": {"docs": {"skeletor": {"tf": 3.4641016151377544}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2}}, "df": 5, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 3.605551275463989}, "skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 5.196152422706632}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post": {"tf": 2}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 3}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 12}, "n": {"docs": {"skeletor": {"tf": 4.123105625617661}, "skeletor.Skeleton": {"tf": 2.23606797749979}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1.4142135623730951}, "skeletor.Skeleton.show": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2.23606797749979}, "skeletor.post.clean_up": {"tf": 2.6457513110645907}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 22, "s": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 8}, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 3}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 12}}}}}, "e": {"docs": {"skeletor": {"tf": 3}, "skeletor.post": {"tf": 1}, "skeletor.skeletonize": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 8}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}}}, "g": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {"skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "i": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "f": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "p": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1}}, "e": {"docs": {}, "df": 0, "p": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}}, "o": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 3.605551275463989}, "skeletor.post": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 5, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "w": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "c": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}, "r": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7}}}}}, "g": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "b": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}}}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}}}}}}}, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}}}}}}}, "m": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.scene": {"tf": 2.23606797749979}, "skeletor.Skeleton.show": {"tf": 2}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}}, "df": 2}, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}}}, "y": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}}, "df": 5}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}, "t": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}, "w": {"docs": {}, "df": 0, "c": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}}, "df": 4}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}}, "df": 2}}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 3}}}, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 3}}}, "e": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 3}}, "t": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "l": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1, "u": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2}}}}, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 7, "f": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 6}, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 7}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7}}}}, "p": {"docs": {"skeletor": {"tf": 2}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 2.23606797749979}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 8}, "m": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "n": {"docs": {"skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 4, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}, "k": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "j": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 4, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 9, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 5}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2}}, "df": 3, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.leafs": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 12}}}, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {"skeletor.post.radii": {"tf": 1.7320508075688772}}, "df": 1, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}, "w": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 4}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 2}}}}, "e": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 2}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 2}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 3}}}}, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 3}}, "t": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 5}}}, "p": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2}}}, "t": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}}}, "t": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 4, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 2.8284271247461903}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 3.3166247903554}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 12}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 3}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_wavefront": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 11}, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "e": {"docs": {"skeletor": {"tf": 5.656854249492381}, "skeletor.Skeleton": {"tf": 2}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1.7320508075688772}, "skeletor.Skeleton.show": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 2}, "skeletor.post": {"tf": 2.449489742783178}, "skeletor.post.radii": {"tf": 3.4641016151377544}, "skeletor.post.clean_up": {"tf": 3.605551275463989}, "skeletor.pre": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 2}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 6.324555320336759}, "skeletor.skeletonize": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 3.7416573867739413}, "skeletor.skeletonize.by_wavefront": {"tf": 3.872983346207417}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 4.358898943540674}, "skeletor.skeletonize.by_edge_collapse": {"tf": 3}, "skeletor.skeletonize.by_tangent_ball": {"tf": 3.3166247903554}}, "df": 20, "m": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}}, "i": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}, "t": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.post.clean_up": {"tf": 1.7320508075688772}}, "df": 1}}, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "b": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "o": {"docs": {"skeletor": {"tf": 5.656854249492381}, "skeletor.Skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 4}, "skeletor.post.clean_up": {"tf": 2.8284271247461903}, "skeletor.pre": {"tf": 2.23606797749979}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 2}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 3.4641016151377544}, "skeletor.skeletonize": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 2}, "skeletor.skeletonize.by_wavefront": {"tf": 3}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2}}, "df": 18, "p": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 2, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}}, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "o": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}}, "df": 1}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}}}, "e": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 3, "/": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.skeleton": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.simplify": {"tf": 2}, "skeletor.pre.remesh": {"tf": 2}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 17}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}}}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 11}}, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}}}, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1}}, "df": 2}}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 5, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}}, "df": 3}}}, "i": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.clean_up": {"tf": 1.4142135623730951}}, "df": 1, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1.4142135623730951}}, "df": 1}}}, "o": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6, "o": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 3, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}}}}}}}, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 3, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "i": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.clean_up": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}, "w": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 3, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2}}, "df": 3}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 3}}}}}}}}}}, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 2}}}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"1": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1.4142135623730951}}, "df": 2, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.simplify": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 6}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 2.23606797749979}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 4}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}}}}}, "h": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}}}}, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "s": {"docs": {"skeletor.skeletonize": {"tf": 2.449489742783178}}, "df": 1}}, "o": {"docs": {}, "df": 0, "u": {"docs": {"skeletor": {"tf": 3.3166247903554}, "skeletor.post": {"tf": 2}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}}, "df": 8, "r": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 9}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 2, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 6, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2.6457513110645907}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 3.4641016151377544}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 5}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}}, "df": 1}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "/": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "x": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 2, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 4, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 2}, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 3}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "p": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.Skeleton.copy": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 4}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}}, "df": 1, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 12}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}}, "df": 2}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "u": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1, "n": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}, "i": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}, "l": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 2}, "skeletor.Skeleton.reindex": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 2}}, "df": 5, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2}}, "df": 2, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}}, "df": 2}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}}, "e": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9, "t": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}}, "df": 2}}, "d": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 4, "s": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.449489742783178}}, "df": 4}}}}, "x": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.8284271247461903}, "skeletor.example_mesh": {"tf": 2}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 3, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}}}}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 2}}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 4}}}}, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}}}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 6}}, "r": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "y": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}}}}}}}, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}}}, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 7}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.8284271247461903}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 11, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 3}}}, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1.4142135623730951}}, "df": 3}}}}}}, "y": {"docs": {"skeletor": {"tf": 3.3166247903554}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 11}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 3}}, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}}, "df": 2, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}}, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}}, "e": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.Skeleton.show": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 9}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}}}}, "m": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}}, "df": 2, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 6.4031242374328485}, "skeletor.Skeleton": {"tf": 2.6457513110645907}, "skeletor.Skeleton.skel_map": {"tf": 1.4142135623730951}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 2.23606797749979}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2.8284271247461903}, "skeletor.post.clean_up": {"tf": 2.6457513110645907}, "skeletor.pre": {"tf": 2.6457513110645907}, "skeletor.pre.fix_mesh": {"tf": 3}, "skeletor.pre.simplify": {"tf": 2}, "skeletor.pre.remesh": {"tf": 2}, "skeletor.pre.contract": {"tf": 4.242640687119285}, "skeletor.skeletonize": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_teasar": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_wavefront": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 3.7416573867739413}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_tangent_ball": {"tf": 3.4641016151377544}}, "df": 20, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 3}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 8}}, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 4}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 3}, "l": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "n": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 5, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "s": {"docs": {"skeletor.Skeleton": {"tf": 1.4142135623730951}}, "df": 1}}, "c": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}}, "df": 4, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}, "x": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "x": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 1}}}, "y": {"docs": {"skeletor": {"tf": 2.23606797749979}}, "df": 1}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 8}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}, "r": {"docs": {"skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}}, "df": 2}}}, "y": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}, "e": {"docs": {"skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}}, "df": 2}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}, "g": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 8, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}}, "l": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 1, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 6}}}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}, "+": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3}}}}, "t": {"docs": {"skeletor": {"tf": 9.746794344808963}, "skeletor.example_mesh": {"tf": 3}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 3.872983346207417}, "skeletor.skeletonize.by_tangent_ball": {"tf": 3.4641016151377544}}, "df": 5}, "h": {"docs": {}, "df": 0, "z": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "p": {"docs": {}, "df": 0, "l": {"3": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}}}}, "a": {"docs": {"skeletor": {"tf": 5}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 3.1622776601683795}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_wavefront": {"tf": 3.3166247903554}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2.6457513110645907}}, "df": 16, "n": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9, "d": {"docs": {"skeletor": {"tf": 4.123105625617661}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 3}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_wavefront": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2.23606797749979}}, "df": 14}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "o": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "m": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "l": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 6}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 3}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}}, "df": 10, "a": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton": {"tf": 2.23606797749979}}, "df": 2, "s": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}}}, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.skeleton": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 2}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 10, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}, "x": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}}}}, "l": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}, "j": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}}}, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}}, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2}}, "df": 3}}}}, "m": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5, "t": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}}, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}, "g": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}}}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}, "p": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}, "k": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "x": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {"skeletor": {"tf": 4}, "skeletor.Skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 2}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 2}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 4.242640687119285}, "skeletor.skeletonize": {"tf": 2}, "skeletor.skeletonize.by_teasar": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_wavefront": {"tf": 3.3166247903554}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 20, "f": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 3}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {"skeletor": {"tf": 2}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 2}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2}}, "df": 13, "g": {"docs": {}, "df": 0, "/": {"1": {"0": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}, "docs": {}, "df": 0}, "docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "@": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 1, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 5}}, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1.7320508075688772}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 5, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 13, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 6}, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "g": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.Skeleton.show": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 2.449489742783178}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton": {"tf": 2.449489742783178}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 9, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.Skeleton.scene": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}}}}}, "b": {"docs": {}, "df": 0, "j": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9, "s": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "w": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "k": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "l": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "f": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 3.4641016151377544}, "skeletor.Skeleton": {"tf": 2.23606797749979}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 2.23606797749979}, "skeletor.pre.contract": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 3}, "skeletor.skeletonize.by_wavefront": {"tf": 2.8284271247461903}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 3}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2}}, "df": 15}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.Skeleton": {"tf": 1.7320508075688772}, "skeletor.Skeleton.skel_map": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 8}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "y": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1.4142135623730951}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}}}}, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 6}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 3}}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}}}}}}}}}}}, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5, "s": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_teasar": {"tf": 2}, "skeletor.skeletonize.by_wavefront": {"tf": 2}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 2}, "skeletor.skeletonize.by_edge_collapse": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_tangent_ball": {"tf": 2.23606797749979}}, "df": 12}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}}, "df": 2}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 2}, "skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}}, "df": 3}}, "l": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre": {"tf": 1.4142135623730951}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 3.4641016151377544}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post": {"tf": 1.7320508075688772}, "skeletor.post.radii": {"tf": 2.23606797749979}, "skeletor.post.clean_up": {"tf": 1.7320508075688772}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.contract": {"tf": 2.8284271247461903}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 13, "m": {"docs": {}, "df": 0, "a": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}}, "df": 2, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 2}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"skeletor": {"tf": 2}, "skeletor.Skeleton": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 10}, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {"skeletor": {"tf": 2.8284271247461903}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.pre.fix_mesh": {"tf": 1.7320508075688772}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.7320508075688772}}, "df": 7, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 3}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 3}, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}}}, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 4}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton.save_swc": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 7, "s": {"docs": {"skeletor": {"tf": 2}, "skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize": {"tf": 1.4142135623730951}}, "df": 4}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}}, "df": 2}, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 7}}, "w": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}}}, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}}, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.449489742783178}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 5}}, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7}, "l": {"docs": {}, "df": 0, "f": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}, "l": {"docs": {}, "df": 0, "p": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.pre": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "a": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}, "k": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 5}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 2.6457513110645907}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 5, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}}, "b": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {"skeletor.pre.contract": {"tf": 2.23606797749979}}, "df": 1, "i": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "t": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 5}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 2}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"skeletor.Skeleton": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "f": {"docs": {"skeletor.Skeleton.leafs": {"tf": 1}}, "df": 1}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 4}}, "f": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.example_mesh": {"tf": 1.4142135623730951}}, "df": 2}}, "o": {"docs": {}, "df": 0, "k": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre": {"tf": 1.4142135623730951}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}, "w": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "t": {"docs": {"skeletor": {"tf": 2}, "skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 2}, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2, "r": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 4}}, "i": {"docs": {"skeletor": {"tf": 2.23606797749979}, "skeletor.Skeleton": {"tf": 1.4142135623730951}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.post": {"tf": 1.4142135623730951}, "skeletor.post.radii": {"tf": 2.449489742783178}, "skeletor.skeletonize": {"tf": 1.7320508075688772}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 7}}}, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 2.23606797749979}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 3, "s": {"docs": {"skeletor.post.radii": {"tf": 1.7320508075688772}}, "df": 1}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {"skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}, "e": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.Skeleton": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 9}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 2, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1.7320508075688772}}, "df": 2, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 2.6457513110645907}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 4}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3, "s": {"docs": {"skeletor.pre.remesh": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.edges": {"tf": 1}, "skeletor.Skeleton.vertices": {"tf": 1}, "skeletor.Skeleton.radius": {"tf": 1}, "skeletor.Skeleton.copy": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 9, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}, "s": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}, "skeletor.Skeleton.scene": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 15}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "d": {"docs": {"skeletor.post.radii": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.Skeleton.get_graph": {"tf": 1}}, "df": 1}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton.show": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}}}, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.pre": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 8}}}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.Skeleton.show": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 4}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.Skeleton.leafs": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.7320508075688772}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 3}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 2.23606797749979}}, "df": 2}}, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "d": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}}, "df": 4, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "/": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.simplify": {"tf": 1}, "skeletor.pre.remesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 15}, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 2}}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"skeletor.post.clean_up": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {"skeletor.example_mesh": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "h": {"3": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.Skeleton.skeleton": {"tf": 1}}, "df": 1}}, "docs": {"skeletor.Skeleton.save_swc": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 2}}, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1, "p": {"docs": {}, "df": 0, "i": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1}, "skeletor.Skeleton.show": {"tf": 1}}, "df": 2}}}}}, "i": {"docs": {}, "df": 0, "p": {"3": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1.7320508075688772}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor.skeletonize": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 3.605551275463989}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1}, "skeletor.pre": {"tf": 2}, "skeletor.skeletonize": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1.4142135623730951}}, "df": 7, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "o": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.pre": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 2}, "skeletor.post": {"tf": 1}}, "df": 2}}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2, "s": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 3}, "d": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1}}}}}, "j": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1}}, "df": 2}}}}}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post": {"tf": 1}}, "df": 1}, "d": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}}, "df": 3}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 7}}}, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.pre.contract": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_teasar": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_wavefront": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1.4142135623730951}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 5}}}}}, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.post.clean_up": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post": {"tf": 1}, "skeletor.post.radii": {"tf": 1.4142135623730951}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.pre.contract": {"tf": 1}}, "df": 5}}}}}}}, "s": {"docs": {"skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 1, "t": {"docs": {"skeletor": {"tf": 2.8284271247461903}, "skeletor.post": {"tf": 2}, "skeletor.skeletonize": {"tf": 1}}, "df": 3, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.7320508075688772}, "skeletor.post.clean_up": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 3}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1.4142135623730951}, "skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 3, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {"skeletor.pre.fix_mesh": {"tf": 1}}, "df": 1, "s": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.post": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}}, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"2": {"5": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "7": {"5": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 2}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1.4142135623730951}}, "df": 1, "s": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}}}}, "d": {"docs": {"skeletor.Skeleton": {"tf": 1}}, "df": 1}}, "k": {"docs": {"skeletor": {"tf": 1}, "skeletor.example_mesh": {"tf": 1}, "skeletor.post.radii": {"tf": 1.7320508075688772}}, "df": 3, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "n": {"docs": {"skeletor": {"tf": 1}, "skeletor.post.radii": {"tf": 2.23606797749979}}, "df": 2}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}, "e": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"skeletor.post.radii": {"tf": 1}, "skeletor.post.clean_up": {"tf": 1}}, "df": 2}}}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {"skeletor.skeletonize.by_wavefront": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"skeletor.skeletonize.by_teasar": {"tf": 1}}, "df": 1}}}}}}}, "j": {"docs": {"skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 1, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {"skeletor.example_mesh": {"tf": 1}}, "df": 1}}}}}}}, "x": {"docs": {"skeletor": {"tf": 1.4142135623730951}}, "df": 1, "/": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "z": {"docs": {"skeletor": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}}, "df": 2}}}}}, "z": {"docs": {"skeletor": {"tf": 1}}, "df": 1}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"skeletor.skeletonize": {"tf": 1}, "skeletor.skeletonize.by_teasar": {"tf": 1}, "skeletor.skeletonize.by_wavefront": {"tf": 1}, "skeletor.skeletonize.by_vertex_clusters": {"tf": 1}, "skeletor.skeletonize.by_edge_collapse": {"tf": 1}, "skeletor.skeletonize.by_tangent_ball": {"tf": 1}}, "df": 6, "l": {"docs": {}, "df": 0, "y": {"docs": {"skeletor": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"skeletor.pre.contract": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {"skeletor.skeletonize.by_edge_collapse": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"skeletor.pre.contract": {"tf": 1}, "skeletor.skeletonize": {"tf": 1}}, "df": 2}}}}}}}}}}, "pipeline": ["trimmer"], "_isPrebuiltIndex": true}; // mirrored in build-search-index.js (part 1) // Also split on html tags. this is a cheap heuristic, but good enough. diff --git a/docs/skeletor.html b/docs/skeletor.html index a78b298..27a8d80 100644 --- a/docs/skeletor.html +++ b/docs/skeletor.html @@ -3,14 +3,14 @@ - +skeletor
@@ -398,518 +401,526 @@Top-level functions and classes
tucked away into submodules (see side-bar or above table).View Source
-# This script is part of skeletor (http://www.github.com/navis-org/skeletor). -# Copyright (C) 2018 Philipp Schlegel -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. - -r""" -# What is skeletor? - -Unlike its [namesake](https://en.wikipedia.org/wiki/Skeletor), this `skeletor` -does not (yet) seek to conquer Eternia but to turn meshes into skeletons. - -Before we get started some terminology: - -- a *mesh* is something that consists of *vertices* and *faces* -- a *skeleton* is a (hierarchical) tree-like structure consisting of *vertices* - (also called *nodes*) and *edges* that connect them - -Skeletons are useful for a range of reasons. For example: - -1. Typically smaller (less vertices) than the mesh -2. Have an implicit sense of topology (e.g. "this node is distal to that node") - -Extracting skeletons from meshes (or other types of data such as voxels) is -non-trivial and there are a great many research papers exploring various -different approaches (see [Google scholar](https://scholar.google.com/scholar -?hl=en&as_sdt=0%2C5&q=skeleton+extraction&btnG=)). - -`skeletor` implements some algorithms that I found useful in my work with -neurons. In my experience there is unfortuntely no magic bullet when it -comes to skeletonization and chances are you will have to fiddle around a bit -to get decent results. - -# Installation - -From PyPI: -```bash -pip3 install skeletor -``` - -For the bleeding-edge version from Github: -```bash -pip3 install git+https://github.com/navis-org/skeletor@master -``` - -# Getting started - -A skeletonization pipeline typically consists of: - -1. Some pre-processing of the mesh (e.g. fixing some potential errors like - degenerate faces, unreferenced vertices, etc.) -2. The skeletonization itself -3. Some post-processing of the skeleton (e.g. adding radius information) - ------- - -Here is a complete list of available functions: - -| function | description | -| ------------------------------------------- | ----------------------------------------------------------- | -| **example data** | | -| `skeletor.example_mesh()` | load an example mesh | -| **pre-processing** | | -| `skeletor.pre.fix_mesh()` | fix some common errors found in meshes | -| `skeletor.pre.remesh()` | re-generate mesh (uses Blender 3D) | -| `skeletor.pre.simplify()` | reduce mesh complexity (uses Blender 3D) | -| `skeletor.pre.contract()` | contract mesh to facilitate skeletonization [1] | -| **skeletonization** | | -| `skeletor.skeletonize.by_wavefront()` | very fast, works well for tubular meshes (like neurons) | -| `skeletor.skeletonize.by_vertex_clusters()` | very fast but needs mesh to be contracted (see above) | -| `skeletor.skeletonize.by_edge_collapse()` | presented in [1] but never got this to work well | -| `skeletor.skeletonize.by_teasar()` | very fast and robust, works on mesh surface | -| `skeletor.skeletonize.by_tangent_ball()` | very fast, best on smooth meshes | -| **postprocessing** | | -| `skeletor.post.clean_up()` | fix some potential errors in the skeleton | -| `skeletor.post.radii()` | add radius information using various method | - ------- - -See docstrings of the respective functions for details. - -A pipeline might look like this: - - 1. `skeletor.pre.fix_mesh()` to fix the mesh - 2. `skeletor.pre.simplify()` to simplify the mesh - 3. `skeletor.pre.contract()` to contract the mesh [1] - 4. `skeletor.skeletonize.vertex_clusters()` to generate a skeleton - 5. `skeletor.post.clean_up()` to clean up some potential issues with the skeleton - 6. `skeletor.post.radii()` to extract radii either by k-nearest neighbours or ray-casting - -In my experience there is no one-size-fits-all. You will have to play around to -find the right approach and parameters to get nice skeletons for your meshes. -If you need help just open an [issue](https://github.com/navis-org/skeletor/issues). - -Also check out the Gotchas below! - -# Examples - -First load the example mesh (a fruit fly neuron): - -```Python ->>> import skeletor as sk ->>> mesh = sk.example_mesh() ->>> mesh -<trimesh.Trimesh(vertices.shape=(6582, 3), faces.shape=(13772, 3))> -``` - -Next see if there is stuff to fix in the mesh (degenerate faces, duplicate -vertices, etc.): - -```Python ->>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False) ->>> fixed -<trimesh.Trimesh(vertices.shape=(6213, 3), faces.shape=(12805, 3))> -``` - -Now for tubular meshes like this neuron, the "wave front" skeletonization method -performs really well: it works by casting waves across the mesh and collapsing -the resulting rings into a skeleton (kinda like when you throw a stone in a -pond and track the expanding ripples). - -```Python ->>> 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 bundle the various outputs of the skeletonization. - -```Python ->>> # x/y/z location of skeleton 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 -``` - -SWC is a commonly used format for saving skeletons. `Skeleton` objects -have a method for quickly saving a correctly formatted SWC file: - -```Python ->>> skel.save_swc('~/Documents/my_skeleton.swc') -``` - -If you installed `pyglet` (see above) you can also use `trimesh`'s plotting -capabilities to inspect the results: - -```Python ->>> skel.show(mesh=True) -``` - -<img src="https://github.com/navis-org/skeletor/raw/master/_static/example1.png" alt="skeletor_example" width="100%"/> - -That looks pretty good already but let's run some pro-forma postprocessing. - -```Python ->>> sk.post.clean_up(skel, inplace=True) -<Skeleton(vertices=(1071, 3), edges=(1070, 2))> -``` - -So that would be a full pipeline mesh to skeleton. Don't expect your own meshes -to produce such nice results off the bat though. Chances are you will need to -play around to find the right recipe. If you don't know where to start, I suggest -you try out mesh contraction + vertex clustering first: - -```Python ->>> import skeletor as sk ->>> mesh = sk.example_mesh() ->>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False) ->>> # Contract mesh to 10% (0.1) of original volume ->>> cont = sk.pre.contract(fixed, epsilon=0.1) ->>> # Skeletonize ->>> skel = sk.skeletonize.by_vertex_clusters(cont, sampling_dist=100) ->>> # Replace contracted mesh with original for postprocessing and plotting ->>> skel.mesh = fixed ->>> # Add radii (vertex cluster method does not do that automatically) ->>> sk.post.radii(skel, method='knn') ->>> skel.show(mesh=True) -``` - -# Gotchas - -- while this is a general purpose library, my personal focus is on neurons and - this has certainly influenced things like default parameter values and certain - post-processing steps -- meshes need to be triangular (we are using `trimesh`) -- use `sk.pre.simplify` if your mesh is very complex (half a million vertices is - where things start getting sluggish) -- a good mesh contraction is often half the battle -- if the mesh consists of multiple disconnected pieces the skeleton will - likewise be fragmented (i.e. will have multiple roots) - -# Benchmarks - -<img src="https://github.com/navis-org/skeletor/raw/master/benchmarks/benchmark_2.png" alt="skeletor_benchmark" width="100%"/> - -[Benchmarks](https://github.com/navis-org/skeletor/blob/master/benchmarks/skeletor_benchmark.ipynb) -were run on a 2018 MacBook Pro (2.2 GHz Core i7, 32Gb memory) with optional -`fastremap` dependency installed. Note some of these functions (e.g. -contraction and TEASAR/vertex cluster skeletonization) vary a lot in -speed based on parameterization. - -# What about algorithm `X`? - -`skeletor` contains some algorithms that I found easy enough to implement -and useful for my work with neurons. If you have some interesting paper/approach -that could make a nice addition to `skeletor`, please get in touch on Github. -Pull requests are always welcome! - -# References - -`[1] 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.` - -The abstract and the paper can be found [here](http://visgraph.cse.ust.hk/projects/skeleton/). -Also see [this](https://www.youtube.com/watch?v=-H7n59YQCRM&feature=youtu.be) YouTube video. - -Some of the code in skeletor was modified from the -[Py_BL_MeshSkeletonization](https://github.com/aalavandhaann/Py_BL_MeshSkeletonization) -addon created by #0K Srinivasan Ramachandran and published under GPL3. - -# Top-level functions and classes -At top-level we only expose `example_mesh()` and the `Skeleton` class (which -you probably won't ever need to touch manually). Everything else is neatly -tucked away into submodules (see side-bar or above table). - -""" - -__version__ = "1.2.0" -__version_vector__ = (1, 2, 0) - -from . import skeletonize -from . import pre -from . import post - -from .skeletonize.base import Skeleton -from .data import example_mesh + + + + +-__docformat__ = "numpy" - -__all__ = ['Skeleton', 'example_mesh', 'pre', 'post', 'skeletonize'] -1# This script is part of skeletor (http://www.github.com/navis-org/skeletor). + 2# Copyright (C) 2018 Philipp Schlegel + 3# + 4# This program is free software: you can redistribute it and/or modify + 5# it under the terms of the GNU General Public License as published by + 6# the Free Software Foundation, either version 3 of the License, or + 7# (at your option) any later version. + 8# + 9# This program is distributed in the hope that it will be useful, + 10# but WITHOUT ANY WARRANTY; without even the implied warranty of + 11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 12# GNU General Public License for more details. + 13# + 14# You should have received a copy of the GNU General Public License + 15# along with this program. + 16 + 17r""" + 18# What is skeletor? + 19 + 20Unlike its [namesake](https://en.wikipedia.org/wiki/Skeletor), this `skeletor` + 21does not (yet) seek to conquer Eternia but to turn meshes into skeletons. + 22 + 23Before we get started some terminology: + 24 + 25- a *mesh* is something that consists of *vertices* and *faces* + 26- a *skeleton* is a (hierarchical) tree-like structure consisting of *vertices* + 27 (also called *nodes*) and *edges* that connect them + 28 + 29Skeletons are useful for a range of reasons. For example: + 30 + 311. Typically smaller (less vertices) than the mesh + 322. Have an implicit sense of topology (e.g. "this node is distal to that node") + 33 + 34Extracting skeletons from meshes (or other types of data such as voxels) is + 35non-trivial and there are a great many research papers exploring various + 36different approaches (see [Google scholar](https://scholar.google.com/scholar + 37?hl=en&as_sdt=0%2C5&q=skeleton+extraction&btnG=)). + 38 + 39`skeletor` implements some algorithms that I found useful in my work with + 40neurons. In my experience there is unfortuntely no magic bullet when it + 41comes to skeletonization and chances are you will have to fiddle around a bit + 42to get decent results. + 43 + 44# Installation + 45 + 46From PyPI: + 47```bash + 48pip3 install skeletor + 49``` + 50 + 51For the bleeding-edge version from Github: + 52```bash + 53pip3 install git+https://github.com/navis-org/skeletor@master + 54``` + 55 + 56# Getting started + 57 + 58A skeletonization pipeline typically consists of: + 59 + 601. Some pre-processing of the mesh (e.g. fixing some potential errors like + 61 degenerate faces, unreferenced vertices, etc.) + 622. The skeletonization itself + 633. Some post-processing of the skeleton (e.g. adding radius information) + 64 + 65------ + 66 + 67Here is a complete list of available functions: + 68 + 69| function | description | + 70| ------------------------------------------- | ----------------------------------------------------------- | + 71| **example data** | | + 72| `skeletor.example_mesh()` | load an example mesh | + 73| **pre-processing** | | + 74| `skeletor.pre.fix_mesh()` | fix some common errors found in meshes | + 75| `skeletor.pre.remesh()` | re-generate mesh (uses Blender 3D) | + 76| `skeletor.pre.simplify()` | reduce mesh complexity (uses Blender 3D) | + 77| `skeletor.pre.contract()` | contract mesh to facilitate skeletonization [1] | + 78| **skeletonization** | | + 79| `skeletor.skeletonize.by_wavefront()` | very fast, works well for tubular meshes (like neurons) | + 80| `skeletor.skeletonize.by_vertex_clusters()` | very fast but needs mesh to be contracted (see above) | + 81| `skeletor.skeletonize.by_edge_collapse()` | presented in [1] but never got this to work well | + 82| `skeletor.skeletonize.by_teasar()` | very fast and robust, works on mesh surface | + 83| `skeletor.skeletonize.by_tangent_ball()` | very fast, best on smooth meshes | + 84| **postprocessing** | | + 85| `skeletor.post.clean_up()` | fix some potential errors in the skeleton | + 86| `skeletor.post.radii()` | add radius information using various method | + 87 + 88------ + 89 + 90See docstrings of the respective functions for details. + 91 + 92A pipeline might look like this: + 93 + 94 1. `skeletor.pre.fix_mesh()` to fix the mesh + 95 2. `skeletor.pre.simplify()` to simplify the mesh + 96 3. `skeletor.pre.contract()` to contract the mesh [1] + 97 4. `skeletor.skeletonize.vertex_clusters()` to generate a skeleton + 98 5. `skeletor.post.clean_up()` to clean up some potential issues with the skeleton + 99 6. `skeletor.post.radii()` to extract radii either by k-nearest neighbours or ray-casting +100 +101In my experience there is no one-size-fits-all. You will have to play around to +102find the right approach and parameters to get nice skeletons for your meshes. +103If you need help just open an [issue](https://github.com/navis-org/skeletor/issues). +104 +105Also check out the Gotchas below! +106 +107# Examples +108 +109First load the example mesh (a fruit fly neuron): +110 +111```Python +112>>> import skeletor as sk +113>>> mesh = sk.example_mesh() +114>>> mesh +115<trimesh.Trimesh(vertices.shape=(6582, 3), faces.shape=(13772, 3))> +116``` +117 +118Next see if there is stuff to fix in the mesh (degenerate faces, duplicate +119vertices, etc.): +120 +121```Python +122>>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False) +123>>> fixed +124<trimesh.Trimesh(vertices.shape=(6213, 3), faces.shape=(12805, 3))> +125``` +126 +127Now for tubular meshes like this neuron, the "wave front" skeletonization method +128performs really well: it works by casting waves across the mesh and collapsing +129the resulting rings into a skeleton (kinda like when you throw a stone in a +130pond and track the expanding ripples). +131 +132```Python +133>>> skel = sk.skeletonize.by_wavefront(fixed, waves=1, step_size=1) +134>>> skel +135<Skeleton(vertices=(1258, 3), edges=(1194, 2), method=wavefront)> +136``` +137 +138All skeletonization methods return a `Skeleton` object. These are just +139convenient objects to bundle the various outputs of the skeletonization. +140 +141```Python +142>>> # x/y/z location of skeleton vertices (nodes) +143>>> skel.vertices +144array([[16744, 36720, 26407], +145 ..., +146 [22076, 23217, 24472]]) +147>>> # child -> parent edges +148>>> skel.edges +149array([[ 64, 31], +150 ..., +151 [1257, 1252]]) +152>>> # Mapping for mesh to skeleton vertex indices +153>>> skel.mesh_map +154array([ 157, 158, 1062, ..., 525, 474, 547]) +155>>> # SWC table +156>>> skel.swc.head() +157 node_id parent_id x y z radius +1580 0 -1 16744.005859 36720.058594 26407.902344 0.000000 +1591 1 -1 5602.751953 22266.756510 15799.991211 7.542587 +1602 2 -1 16442.666667 14999.978516 10887.916016 5.333333 +161``` +162 +163SWC is a commonly used format for saving skeletons. `Skeleton` objects +164have a method for quickly saving a correctly formatted SWC file: +165 +166```Python +167>>> skel.save_swc('~/Documents/my_skeleton.swc') +168``` +169 +170If you installed `pyglet` (see above) you can also use `trimesh`'s plotting +171capabilities to inspect the results: +172 +173```Python +174>>> skel.show(mesh=True) +175``` +176 +177<img src="https://github.com/navis-org/skeletor/raw/master/_static/example1.png" alt="skeletor_example" width="100%"/> +178 +179That looks pretty good already but let's run some pro-forma postprocessing. +180 +181```Python +182>>> sk.post.clean_up(skel, inplace=True) +183<Skeleton(vertices=(1071, 3), edges=(1070, 2))> +184``` +185 +186So that would be a full pipeline mesh to skeleton. Don't expect your own meshes +187to produce such nice results off the bat though. Chances are you will need to +188play around to find the right recipe. If you don't know where to start, I suggest +189you try out mesh contraction + vertex clustering first: +190 +191```Python +192>>> import skeletor as sk +193>>> mesh = sk.example_mesh() +194>>> fixed = sk.pre.fix_mesh(mesh, remove_disconnected=5, inplace=False) +195>>> # Contract mesh to 10% (0.1) of original volume +196>>> cont = sk.pre.contract(fixed, epsilon=0.1) +197>>> # Skeletonize +198>>> skel = sk.skeletonize.by_vertex_clusters(cont, sampling_dist=100) +199>>> # Replace contracted mesh with original for postprocessing and plotting +200>>> skel.mesh = fixed +201>>> # Add radii (vertex cluster method does not do that automatically) +202>>> sk.post.radii(skel, method='knn') +203>>> skel.show(mesh=True) +204``` +205 +206# Gotchas +207 +208- while this is a general purpose library, my personal focus is on neurons and +209 this has certainly influenced things like default parameter values and certain +210 post-processing steps +211- meshes need to be triangular (we are using `trimesh`) +212- use `sk.pre.simplify` if your mesh is very complex (half a million vertices is +213 where things start getting sluggish) +214- a good mesh contraction is often half the battle +215- if the mesh consists of multiple disconnected pieces the skeleton will +216 likewise be fragmented (i.e. will have multiple roots) +217 +218# Benchmarks +219 +220<img src="https://github.com/navis-org/skeletor/raw/master/benchmarks/benchmark_2.png" alt="skeletor_benchmark" width="100%"/> +221 +222[Benchmarks](https://github.com/navis-org/skeletor/blob/master/benchmarks/skeletor_benchmark.ipynb) +223were run on a 2018 MacBook Pro (2.2 GHz Core i7, 32Gb memory) with optional +224`fastremap` dependency installed. Note some of these functions (e.g. +225contraction and TEASAR/vertex cluster skeletonization) vary a lot in +226speed based on parameterization. +227 +228# What about algorithm `X`? +229 +230`skeletor` contains some algorithms that I found easy enough to implement +231and useful for my work with neurons. If you have some interesting paper/approach +232that could make a nice addition to `skeletor`, please get in touch on Github. +233Pull requests are always welcome! +234 +235# References +236 +237`[1] 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.` +238 +239The abstract and the paper can be found [here](http://visgraph.cse.ust.hk/projects/skeleton/). +240Also see [this](https://www.youtube.com/watch?v=-H7n59YQCRM&feature=youtu.be) YouTube video. +241 +242Some of the code in skeletor was modified from the +243[Py_BL_MeshSkeletonization](https://github.com/aalavandhaann/Py_BL_MeshSkeletonization) +244addon created by #0K Srinivasan Ramachandran and published under GPL3. +245 +246# Top-level functions and classes +247At top-level we only expose `example_mesh()` and the `Skeleton` class (which +248you probably won't ever need to touch manually). Everything else is neatly +249tucked away into submodules (see side-bar or above table). +250 +251""" +252 +253__version__ = "1.2.1" +254__version_vector__ = (1, 2, 1) +255 +256from . import skeletonize +257from . import pre +258from . import post +259 +260from .skeletonize.base import Skeleton +261from .data import example_mesh +262 +263__docformat__ = "numpy" +264 +265__all__ = ['Skeleton', 'example_mesh', 'pre', 'post', 'skeletonize'] +
View Source
-class Skeleton: - """Class representing a skeleton. - - Typically returned as results from a skeletonization. - - Attributes - ---------- - swc : pd.DataFrame, optional - SWC table. - vertices : (N, 3) array - Vertex (node) positions. - edges : (M, 2) array - Indices of connected vertex pairs. - radii : (N, ) array, optional - Radii for each vertex (node) in the skeleton. - mesh : trimesh, optional - The original mesh. - mesh_map : array, optional - Same length as ``mesh``. Maps mesh vertices to vertices (nodes) - in the skeleton. - skel_map : array of arrays, optional - Inverse of `mesh_map`: maps skeleton vertices (nodes) to mesh - vertices. - method : str, optional - Which method was used to generate the skeleton. - - """ - - def __init__(self, swc, mesh=None, mesh_map=None, method=None): - self.swc = swc - self.mesh = mesh - self.mesh_map = mesh_map - self.method = method - - def __str__(self): - """Summary.""" - return self.__repr__() - - def __repr__(self): - """Return quick summary of the skeleton's geometry.""" - elements = [] - if hasattr(self, 'vertices'): - elements.append(f'vertices={self.vertices.shape}') - if hasattr(self, 'edges'): - elements.append(f'edges={self.edges.shape}') - if hasattr(self, 'method'): - elements.append(f'method={self.method}') - return f'<Skeleton({", ".join(elements)})>' - - @property - def edges(self): - """Return skeleton edges.""" - return self.swc.loc[self.swc.parent_id >= 0, - ['node_id', 'parent_id']].values - - @property - def vertices(self): - """Return skeleton vertices (nodes).""" - return self.swc[['x', 'y', 'z']].values - - @property - def radius(self): - """Return radii.""" - if 'radius' not in self.swc.columns: - raise ValueError('No radius info found. Run `skeletor.post.radii()`' - ' to get them.') - return self.swc['radius'].values, - - @property - def skeleton(self): - """Skeleton as trimesh Path3D.""" - if not hasattr(self, '_skeleton'): - lines = [tm.path.entities.Line(e) for e in self.edges] - - self._skeleton = tm.path.Path3D(entities=lines, - vertices=self.vertices, - process=False) - return self._skeleton - - @property - def skel_map(self): - """Skeleton vertex (nodes) to mesh vertices. Based on `mesh_map`.""" - if isinstance(self.mesh_map, type(None)): - return None - return pd.DataFrame(self.mesh_map - ).reset_index(drop=False - ).groupby(0)['index'].apply(np.array - ).values - - def reindex(self, inplace=False): - """Clean up skeleton.""" - x = self - if not inplace: - x = x.copy() - - # Re-index to make node IDs continous again - x.swc, new_ids = reindex_swc(x.swc) - - # Update mesh map - if not isinstance(x.mesh_map, type(None)): - x.mesh_map = np.array([new_ids.get(i, i) for i in x.mesh_map]) - - if not inplace: - return x - - def copy(self): - """Return copy of the skeleton.""" - return Skeleton(swc=self.swc.copy() if not isinstance(self.swc, type(None)) else None, - mesh=self.mesh.copy() if not isinstance(self.mesh, type(None)) else None, - mesh_map=self.mesh_map.copy() if not isinstance(self.mesh_map, type(None)) else None) - - def get_graph(self): - """Generate networkX representation of the skeletons. - - Distance between nodes will be used as edge weights. - - Returns - ------- - networkx.DiGraph - - """ - not_root = self.swc.parent_id >= 0 - nodes = self.swc.loc[not_root] - parents = self.swc.set_index('node_id').loc[self.swc.loc[not_root, 'parent_id'].values] - - dists = nodes[['x', 'y', 'z']].values - parents[['x', 'y', 'z']].values - dists = np.sqrt((dists ** 2).sum(axis=1)) - - G = nx.DiGraph() - G.add_weighted_edges_from([(s, t, w) for s, t, w in zip(nodes, parents, dists)]) - - return G - - def save_swc(self, filepath): - """Save skeleton in SWC format. - - Parameters - ---------- - filepath : path-like - Filepath to save SWC to. - - """ - header = dedent(f"""\ - # SWC format file - # based on specifications at http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html - # Created on {datetime.date.today()} using skeletor (https://github.com/navis-org/skeletor) - # PointNo Label X Y Z Radius Parent - # Labels: - # 0 = undefined, 1 = soma, 5 = fork point, 6 = end point - """) - - # Make copy of SWC table - swc = self.swc.copy() - - # Set all labels to undefined - swc['label'] = 0 - swc.loc[~swc.node_id.isin(swc.parent_id.values), 'label'] = 6 - n_childs = swc.groupby('parent_id').size() - bp = n_childs[n_childs > 1].index.values - swc.loc[swc.node_id.isin(bp), 'label'] = 5 - - # Add radius if missing - if 'radius' not in swc.columns: - swc['radius'] = 0 - - # Get things in order - swc = swc[['node_id', 'label', 'x', 'y', 'z', 'radius', 'parent_id']] - - # Adjust column titles - swc.columns = ['PointNo', 'Label', 'X', 'Y', 'Z', 'Radius', 'Parent'] - - with open(filepath, 'w') as file: - # Write header - file.write(header) - - # Write data - writer = csv.writer(file, delimiter=' ') - writer.writerows(swc.astype(str).values) - - def scene(self, mesh=False, **kwargs): - """Return a Scene object containing the skeleton. - - Returns - ------- - scene : trimesh.scene.scene.Scene - Contains the skeleton and optionally the mesh. + - """ - if mesh: - if isinstance(self.mesh, type(None)): - raise ValueError('Skeleton has no mesh.') - - self.mesh.visual.face_colors = [100, 100, 100, 100] - - # Note the copy(): without it the transform in show() changes - # the original meshes - sc = tm.Scene([self.mesh.copy(), self.skeleton.copy()], **kwargs) - else: - sc = tm.Scene(self.skeleton.copy(), **kwargs) - - return sc - - def show(self, mesh=False, **kwargs): - """Render the skeleton in an opengl window. Requires pyglet. - - Parameters - ---------- - mesh : bool - If True, will render transparent mesh on top of the - skeleton. - - Returns - -------- - scene : trimesh.scene.Scene - Scene with skeleton in it. - - """ - scene = self.scene(mesh=mesh) - - # I encountered some issues if object space is big and the easiest - # way to work around this is to apply a transform such that the - # coordinates have -5 to +5 bounds - fac = 5 / np.fabs(self.skeleton.bounds).max() - scene.apply_transform(np.diag([fac, fac, fac, 1])) - - return scene.show(**kwargs) -
33class Skeleton: + 34 """Class representing a skeleton. + 35 + 36 Typically returned as results from a skeletonization. + 37 + 38 Attributes + 39 ---------- + 40 swc : pd.DataFrame, optional + 41 SWC table. + 42 vertices : (N, 3) array + 43 Vertex (node) positions. + 44 edges : (M, 2) array + 45 Indices of connected vertex pairs. + 46 radii : (N, ) array, optional + 47 Radii for each vertex (node) in the skeleton. + 48 mesh : trimesh, optional + 49 The original mesh. + 50 mesh_map : array, optional + 51 Same length as ``mesh``. Maps mesh vertices to vertices (nodes) + 52 in the skeleton. + 53 skel_map : array of arrays, optional + 54 Inverse of `mesh_map`: maps skeleton vertices (nodes) to mesh + 55 vertices. + 56 method : str, optional + 57 Which method was used to generate the skeleton. + 58 + 59 """ + 60 + 61 def __init__(self, swc, mesh=None, mesh_map=None, method=None): + 62 self.swc = swc + 63 self.mesh = mesh + 64 self.mesh_map = mesh_map + 65 self.method = method + 66 + 67 def __str__(self): + 68 """Summary.""" + 69 return self.__repr__() + 70 + 71 def __repr__(self): + 72 """Return quick summary of the skeleton's geometry.""" + 73 elements = [] + 74 if hasattr(self, 'vertices'): + 75 elements.append(f'vertices={self.vertices.shape}') + 76 if hasattr(self, 'edges'): + 77 elements.append(f'edges={self.edges.shape}') + 78 if hasattr(self, 'method'): + 79 elements.append(f'method={self.method}') + 80 return f'<Skeleton({", ".join(elements)})>' + 81 + 82 @property + 83 def edges(self): + 84 """Return skeleton edges.""" + 85 return self.swc.loc[self.swc.parent_id >= 0, + 86 ['node_id', 'parent_id']].values + 87 + 88 @property + 89 def vertices(self): + 90 """Return skeleton vertices (nodes).""" + 91 return self.swc[['x', 'y', 'z']].values + 92 + 93 @property + 94 def radius(self): + 95 """Return radii.""" + 96 if 'radius' not in self.swc.columns: + 97 raise ValueError('No radius info found. Run `skeletor.post.radii()`' + 98 ' to get them.') + 99 return self.swc['radius'].values, +100 +101 @property +102 def skeleton(self): +103 """Skeleton as trimesh Path3D.""" +104 if not hasattr(self, '_skeleton'): +105 lines = [tm.path.entities.Line(e) for e in self.edges] +106 +107 self._skeleton = tm.path.Path3D(entities=lines, +108 vertices=self.vertices, +109 process=False) +110 return self._skeleton +111 +112 @property +113 def skel_map(self): +114 """Skeleton vertex (nodes) to mesh vertices. Based on `mesh_map`.""" +115 if isinstance(self.mesh_map, type(None)): +116 return None +117 return pd.DataFrame(self.mesh_map +118 ).reset_index(drop=False +119 ).groupby(0)['index'].apply(np.array +120 ).values +121 +122 @property +123 def leafs(self): +124 """Leaf nodes (includes root).""" +125 swc = self.swc +126 leafs = swc[~swc.node_id.isin(swc.parent_id.values) | (swc.parent_id < 0)] +127 return leafs.copy() +128 +129 def reindex(self, inplace=False): +130 """Clean up skeleton.""" +131 x = self +132 if not inplace: +133 x = x.copy() +134 +135 # Re-index to make node IDs continous again +136 x.swc, new_ids = reindex_swc(x.swc) +137 +138 # Update mesh map +139 if not isinstance(x.mesh_map, type(None)): +140 x.mesh_map = np.array([new_ids.get(i, i) for i in x.mesh_map]) +141 +142 if not inplace: +143 return x +144 +145 def copy(self): +146 """Return copy of the skeleton.""" +147 return Skeleton(swc=self.swc.copy() if not isinstance(self.swc, type(None)) else None, +148 mesh=self.mesh.copy() if not isinstance(self.mesh, type(None)) else None, +149 mesh_map=self.mesh_map.copy() if not isinstance(self.mesh_map, type(None)) else None) +150 +151 def get_graph(self): +152 """Generate networkX representation of the skeletons. +153 +154 Distance between nodes will be used as edge weights. +155 +156 Returns +157 ------- +158 networkx.DiGraph +159 +160 """ +161 not_root = self.swc.parent_id >= 0 +162 nodes = self.swc.loc[not_root] +163 parents = self.swc.set_index('node_id').loc[self.swc.loc[not_root, 'parent_id'].values] +164 +165 dists = nodes[['x', 'y', 'z']].values - parents[['x', 'y', 'z']].values +166 dists = np.sqrt((dists ** 2).sum(axis=1)) +167 +168 G = nx.DiGraph() +169 G.add_weighted_edges_from([(s, t, w) for s, t, w in zip(nodes.node_id.values, +170 nodes.parent_id.values, dists)]) +171 +172 return G +173 +174 def save_swc(self, filepath): +175 """Save skeleton in SWC format. +176 +177 Parameters +178 ---------- +179 filepath : path-like +180 Filepath to save SWC to. +181 +182 """ +183 header = dedent(f"""\ +184 # SWC format file +185 # based on specifications at http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html +186 # Created on {datetime.date.today()} using skeletor (https://github.com/navis-org/skeletor) +187 # PointNo Label X Y Z Radius Parent +188 # Labels: +189 # 0 = undefined, 1 = soma, 5 = fork point, 6 = end point +190 """) +191 +192 # Make copy of SWC table +193 swc = self.swc.copy() +194 +195 # Set all labels to undefined +196 swc['label'] = 0 +197 swc.loc[~swc.node_id.isin(swc.parent_id.values), 'label'] = 6 +198 n_childs = swc.groupby('parent_id').size() +199 bp = n_childs[n_childs > 1].index.values +200 swc.loc[swc.node_id.isin(bp), 'label'] = 5 +201 +202 # Add radius if missing +203 if 'radius' not in swc.columns: +204 swc['radius'] = 0 +205 +206 # Get things in order +207 swc = swc[['node_id', 'label', 'x', 'y', 'z', 'radius', 'parent_id']] +208 +209 # Adjust column titles +210 swc.columns = ['PointNo', 'Label', 'X', 'Y', 'Z', 'Radius', 'Parent'] +211 +212 with open(filepath, 'w') as file: +213 # Write header +214 file.write(header) +215 +216 # Write data +217 writer = csv.writer(file, delimiter=' ') +218 writer.writerows(swc.astype(str).values) +219 +220 def scene(self, mesh=False, **kwargs): +221 """Return a Scene object containing the skeleton. +222 +223 Returns +224 ------- +225 scene : trimesh.scene.scene.Scene +226 Contains the skeleton and optionally the mesh. +227 +228 """ +229 if mesh: +230 if isinstance(self.mesh, type(None)): +231 raise ValueError('Skeleton has no mesh.') +232 +233 self.mesh.visual.face_colors = [100, 100, 100, 100] +234 +235 # Note the copy(): without it the transform in show() changes +236 # the original meshes +237 sc = tm.Scene([self.mesh.copy(), self.skeleton.copy()], **kwargs) +238 else: +239 sc = tm.Scene(self.skeleton.copy(), **kwargs) +240 +241 return sc +242 +243 def show(self, mesh=False, **kwargs): +244 """Render the skeleton in an opengl window. Requires pyglet. +245 +246 Parameters +247 ---------- +248 mesh : bool +249 If True, will render transparent mesh on top of the +250 skeleton. +251 +252 Returns +253 -------- +254 scene : trimesh.scene.Scene +255 Scene with skeleton in it. +256 +257 """ +258 scene = self.scene(mesh=mesh) +259 +260 # I encountered some issues if object space is big and the easiest +261 # way to work around this is to apply a transform such that the +262 # coordinates have -5 to +5 bounds +263 fac = 5 / np.fabs(self.skeleton.bounds).max() +264 scene.apply_transform(np.diag([fac, fac, fac, 1])) +265 +266 return scene.show(**kwargs) +
Class representing a skeleton.
@@ -941,32 +952,33 @@Attributes
View Source
-def __init__(self, swc, mesh=None, mesh_map=None, method=None): - self.swc = swc - self.mesh = mesh - self.mesh_map = mesh_map - self.method = method -
Return skeleton vertices (nodes).
Attributes
Skeleton as trimesh Path3D.
Attributes
Leaf nodes (includes root).
+View Source
-def reindex(self, inplace=False): - """Clean up skeleton.""" - x = self - if not inplace: - x = x.copy() - # Re-index to make node IDs continous again - x.swc, new_ids = reindex_swc(x.swc) +
129 def reindex(self, inplace=False): +130 """Clean up skeleton.""" +131 x = self +132 if not inplace: +133 x = x.copy() +134 +135 # Re-index to make node IDs continous again +136 x.swc, new_ids = reindex_swc(x.swc) +137 +138 # Update mesh map +139 if not isinstance(x.mesh_map, type(None)): +140 x.mesh_map = np.array([new_ids.get(i, i) for i in x.mesh_map]) +141 +142 if not inplace: +143 return x +
Clean up skeleton.
Attributes
View Source
-def copy(self): - """Return copy of the skeleton.""" - return Skeleton(swc=self.swc.copy() if not isinstance(self.swc, type(None)) else None, - mesh=self.mesh.copy() if not isinstance(self.mesh, type(None)) else None, - mesh_map=self.mesh_map.copy() if not isinstance(self.mesh_map, type(None)) else None) -
145 def copy(self): +146 """Return copy of the skeleton.""" +147 return Skeleton(swc=self.swc.copy() if not isinstance(self.swc, type(None)) else None, +148 mesh=self.mesh.copy() if not isinstance(self.mesh, type(None)) else None, +149 mesh_map=self.mesh_map.copy() if not isinstance(self.mesh_map, type(None)) else None) +
Return copy of the skeleton.
Attributes
View Source
-def get_graph(self): - """Generate networkX representation of the skeletons. - - Distance between nodes will be used as edge weights. - - Returns - ------- - networkx.DiGraph - - """ - not_root = self.swc.parent_id >= 0 - nodes = self.swc.loc[not_root] - parents = self.swc.set_index('node_id').loc[self.swc.loc[not_root, 'parent_id'].values] + ++ + def + get_graph(self) - dists = nodes[['x', 'y', 'z']].values - parents[['x', 'y', 'z']].values - dists = np.sqrt((dists ** 2).sum(axis=1)) + - G = nx.DiGraph() - G.add_weighted_edges_from([(s, t, w) for s, t, w in zip(nodes, parents, dists)]) - - return G -+
151 def get_graph(self): +152 """Generate networkX representation of the skeletons. +153 +154 Distance between nodes will be used as edge weights. +155 +156 Returns +157 ------- +158 networkx.DiGraph +159 +160 """ +161 not_root = self.swc.parent_id >= 0 +162 nodes = self.swc.loc[not_root] +163 parents = self.swc.set_index('node_id').loc[self.swc.loc[not_root, 'parent_id'].values] +164 +165 dists = nodes[['x', 'y', 'z']].values - parents[['x', 'y', 'z']].values +166 dists = np.sqrt((dists ** 2).sum(axis=1)) +167 +168 G = nx.DiGraph() +169 G.add_weighted_edges_from([(s, t, w) for s, t, w in zip(nodes.node_id.values, +170 nodes.parent_id.values, dists)]) +171 +172 return G +
Generate networkX representation of the skeletons.
@@ -1128,63 +1158,63 @@Returns
174 def save_swc(self, filepath): +175 """Save skeleton in SWC format. +176 +177 Parameters +178 ---------- +179 filepath : path-like +180 Filepath to save SWC to. +181 +182 """ +183 header = dedent(f"""\ +184 # SWC format file +185 # based on specifications at http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html +186 # Created on {datetime.date.today()} using skeletor (https://github.com/navis-org/skeletor) +187 # PointNo Label X Y Z Radius Parent +188 # Labels: +189 # 0 = undefined, 1 = soma, 5 = fork point, 6 = end point +190 """) +191 +192 # Make copy of SWC table +193 swc = self.swc.copy() +194 +195 # Set all labels to undefined +196 swc['label'] = 0 +197 swc.loc[~swc.node_id.isin(swc.parent_id.values), 'label'] = 6 +198 n_childs = swc.groupby('parent_id').size() +199 bp = n_childs[n_childs > 1].index.values +200 swc.loc[swc.node_id.isin(bp), 'label'] = 5 +201 +202 # Add radius if missing +203 if 'radius' not in swc.columns: +204 swc['radius'] = 0 +205 +206 # Get things in order +207 swc = swc[['node_id', 'label', 'x', 'y', 'z', 'radius', 'parent_id']] +208 +209 # Adjust column titles +210 swc.columns = ['PointNo', 'Label', 'X', 'Y', 'Z', 'Radius', 'Parent'] +211 +212 with open(filepath, 'w') as file: +213 # Write header +214 file.write(header) +215 +216 # Write data +217 writer = csv.writer(file, delimiter=' ') +218 writer.writerows(swc.astype(str).values) +
View Source
-def save_swc(self, filepath): - """Save skeleton in SWC format. - - Parameters - ---------- - filepath : path-like - Filepath to save SWC to. - - """ - header = dedent(f"""\ - # SWC format file - # based on specifications at http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html - # Created on {datetime.date.today()} using skeletor (https://github.com/navis-org/skeletor) - # PointNo Label X Y Z Radius Parent - # Labels: - # 0 = undefined, 1 = soma, 5 = fork point, 6 = end point - """) - - # Make copy of SWC table - swc = self.swc.copy() - - # Set all labels to undefined - swc['label'] = 0 - swc.loc[~swc.node_id.isin(swc.parent_id.values), 'label'] = 6 - n_childs = swc.groupby('parent_id').size() - bp = n_childs[n_childs > 1].index.values - swc.loc[swc.node_id.isin(bp), 'label'] = 5 - - # Add radius if missing - if 'radius' not in swc.columns: - swc['radius'] = 0 - - # Get things in order - swc = swc[['node_id', 'label', 'x', 'y', 'z', 'radius', 'parent_id']] - - # Adjust column titles - swc.columns = ['PointNo', 'Label', 'X', 'Y', 'Z', 'Radius', 'Parent'] - - with open(filepath, 'w') as file: - # Write header - file.write(header) - - # Write data - writer = csv.writer(file, delimiter=' ') - writer.writerows(swc.astype(str).values) -
Save skeleton in SWC format.
@@ -1199,40 +1229,40 @@Parameters
View Source
-def scene(self, mesh=False, **kwargs): - """Return a Scene object containing the skeleton. - - Returns - ------- - scene : trimesh.scene.scene.Scene - Contains the skeleton and optionally the mesh. + ++ + def + scene(self, mesh=False, **kwargs) - """ - if mesh: - if isinstance(self.mesh, type(None)): - raise ValueError('Skeleton has no mesh.') + - self.mesh.visual.face_colors = [100, 100, 100, 100] - - # Note the copy(): without it the transform in show() changes - # the original meshes - sc = tm.Scene([self.mesh.copy(), self.skeleton.copy()], **kwargs) - else: - sc = tm.Scene(self.skeleton.copy(), **kwargs) - - return sc -+
220 def scene(self, mesh=False, **kwargs): +221 """Return a Scene object containing the skeleton. +222 +223 Returns +224 ------- +225 scene : trimesh.scene.scene.Scene +226 Contains the skeleton and optionally the mesh. +227 +228 """ +229 if mesh: +230 if isinstance(self.mesh, type(None)): +231 raise ValueError('Skeleton has no mesh.') +232 +233 self.mesh.visual.face_colors = [100, 100, 100, 100] +234 +235 # Note the copy(): without it the transform in show() changes +236 # the original meshes +237 sc = tm.Scene([self.mesh.copy(), self.skeleton.copy()], **kwargs) +238 else: +239 sc = tm.Scene(self.skeleton.copy(), **kwargs) +240 +241 return sc +
Return a Scene object containing the skeleton.
@@ -1247,42 +1277,42 @@Returns
View Source
-def show(self, mesh=False, **kwargs): - """Render the skeleton in an opengl window. Requires pyglet. - - Parameters - ---------- - mesh : bool - If True, will render transparent mesh on top of the - skeleton. - - Returns - -------- - scene : trimesh.scene.Scene - Scene with skeleton in it. - - """ - scene = self.scene(mesh=mesh) + ++ + def + show(self, mesh=False, **kwargs) - # I encountered some issues if object space is big and the easiest - # way to work around this is to apply a transform such that the - # coordinates have -5 to +5 bounds - fac = 5 / np.fabs(self.skeleton.bounds).max() - scene.apply_transform(np.diag([fac, fac, fac, 1])) + - return scene.show(**kwargs) -+
243 def show(self, mesh=False, **kwargs): +244 """Render the skeleton in an opengl window. Requires pyglet. +245 +246 Parameters +247 ---------- +248 mesh : bool +249 If True, will render transparent mesh on top of the +250 skeleton. +251 +252 Returns +253 -------- +254 scene : trimesh.scene.Scene +255 Scene with skeleton in it. +256 +257 """ +258 scene = self.scene(mesh=mesh) +259 +260 # I encountered some issues if object space is big and the easiest +261 # way to work around this is to apply a transform such that the +262 # coordinates have -5 to +5 bounds +263 fac = 5 / np.fabs(self.skeleton.bounds).max() +264 scene.apply_transform(np.diag([fac, fac, fac, 1])) +265 +266 return scene.show(**kwargs) +
Render the skeleton in an opengl window. Requires pyglet.
@@ -1306,42 +1336,42 @@Returns
View Source
-def example_mesh(): - """Load and return example mesh. + ++ + def + example_mesh() - The example mesh is a fruit fly neuron (an olfactory projection neuron of - the DA1 glomerulus) segmented from an EM image data set. It is part of the - Janelia hemibrain data set (see [here](https://neuprint.janelia.org)) [1]. + - References - ---------- - [1] Louis K. Scheffer et al., eLife. 2020. doi: 10.7554/eLife.57443 - A connectome and analysis of the adult Drosophila central brain - - Returns - ------- - trimesh.Trimesh - - Examples - -------- - >>> import skeletor as sk - >>> # Load this example mesh - >>> mesh = sk.example_mesh() - - """ - return tm.load_mesh(obj_path) -+
43def example_mesh(): +44 """Load and return example mesh. +45 +46 The example mesh is a fruit fly neuron (an olfactory projection neuron of +47 the DA1 glomerulus) segmented from an EM image data set. It is part of the +48 Janelia hemibrain data set (see [here](https://neuprint.janelia.org)) [1]. +49 +50 References +51 ---------- +52 [1] Louis K. Scheffer et al., eLife. 2020. doi: 10.7554/eLife.57443 +53 A connectome and analysis of the adult Drosophila central brain +54 +55 Returns +56 ------- +57 trimesh.Trimesh +58 +59 Examples +60 -------- +61 >>> import skeletor as sk +62 >>> # Load this example mesh +63 >>> mesh = sk.example_mesh() +64 +65 """ +66 return tm.load_mesh(obj_path) +
Load and return example mesh.
diff --git a/docs/skeletor/post.html b/docs/skeletor/post.html index 2a9d80f..4c606c6 100644 --- a/docs/skeletor/post.html +++ b/docs/skeletor/post.html @@ -3,14 +3,14 @@ - +
skeletor.post
@@ -75,158 +75,152 @@ Computing radius information
(re-)generate radius information for the skeletons.View Source
-# This script is part of skeletor (http://www.github.com/navis-org/skeletor). -# Copyright (C) 2018 Philipp Schlegel -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. + + + + +-r""" -The `skeletor.post` module contains functions to post-process skeletons after -skeletonization. - -### Fixing issues with skeletons - -Depending on your mesh, pre-processing and the parameters you chose for -skeletonization, chances are that your skeleton will not come out perfectly. - -`skeletor.post.clean_up` can help you solve some potential issues: - -- skeleton nodes (vertices) that outside or right on the surface instead of - centered inside the mesh -- superfluous "hairs" on otherwise straight bits - -### Computing radius information - -Only `skeletor.skeletonize.by_wavefront()` provides radii off the bat. For all -other methods, you might want to run `skeletor.post.radii` can help you -(re-)generate radius information for the skeletons. - -""" - -from .radiusextraction import radii -from .postprocessing import clean_up - -__docformat__ = "numpy" -__all__ = ['radii', 'clean_up'] -1# This script is part of skeletor (http://www.github.com/navis-org/skeletor). + 2# Copyright (C) 2018 Philipp Schlegel + 3# + 4# This program is free software: you can redistribute it and/or modify + 5# it under the terms of the GNU General Public License as published by + 6# the Free Software Foundation, either version 3 of the License, or + 7# (at your option) any later version. + 8# + 9# This program is distributed in the hope that it will be useful, +10# but WITHOUT ANY WARRANTY; without even the implied warranty of +11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +12# GNU General Public License for more details. +13# +14# You should have received a copy of the GNU General Public License +15# along with this program. +16 +17r""" +18The `skeletor.post` module contains functions to post-process skeletons after +19skeletonization. +20 +21### Fixing issues with skeletons +22 +23Depending on your mesh, pre-processing and the parameters you chose for +24skeletonization, chances are that your skeleton will not come out perfectly. +25 +26`skeletor.post.clean_up` can help you solve some potential issues: +27 +28- skeleton nodes (vertices) that outside or right on the surface instead of +29 centered inside the mesh +30- superfluous "hairs" on otherwise straight bits +31 +32### Computing radius information +33 +34Only `skeletor.skeletonize.by_wavefront()` provides radii off the bat. For all +35other methods, you might want to run `skeletor.post.radii` can help you +36(re-)generate radius information for the skeletons. +37 +38""" +39 +40from .radiusextraction import radii +41from .postprocessing import clean_up +42 +43__docformat__ = "numpy" +44__all__ = ['radii', 'clean_up'] +
29def radii(s, mesh=None, method='knn', aggregate='mean', validate=False, **kwargs): + 30 """Extract radii for given skeleton table. + 31 + 32 Important + 33 --------- + 34 This function really only produces useful radii if the skeleton is centered + 35 inside the mesh. `by_wavefront` does that by default whereas all other + 36 skeletonization methods don't. Your best bet to get centered skeletons is + 37 to contract the mesh first (`sk.pre.contract`). + 38 + 39 Parameters + 40 ---------- + 41 s : skeletor.Skeleton + 42 Skeleton to clean up. + 43 mesh : trimesh.Trimesh, optional + 44 Original mesh (e.g. before contraction). If not provided will + 45 use the mesh associated with ``s``. + 46 method : "knn" | "ray" + 47 Whether and how to add radius information to each node:: + 48 + 49 - "knn" uses k-nearest-neighbors to get radii: fast but + 50 potential for being very wrong + 51 - "ray" uses ray-casting to get radii: slower but sometimes + 52 less wrong + 53 + 54 aggregate : "mean" | "median" | "max" | "min" | "percentile75" + 55 Function used to aggregate radii over sample (i.e. across + 56 k nearest-neighbors or ray intersections) + 57 validate : bool + 58 If True, will try to fix potential issues with the mesh + 59 (e.g. infinite values, duplicate vertices, degenerate faces) + 60 before skeletonization. Note that this might make changes to + 61 your mesh inplace! + 62 **kwargs + 63 Keyword arguments are passed to the respective method: + 64 + 65 For method "knn":: + 66 + 67 n : int (default 5) + 68 Radius will be the mean over n nearest-neighbors. + 69 + 70 For method "ray":: + 71 + 72 n_rays : int (default 20) + 73 Number of rays to cast for each node. + 74 projection : "sphere" (default) | "tangents" + 75 Whether to cast rays in a sphere around each node or in a + 76 circle orthogonally to the node's tangent vector. + 77 fallback : "knn" (default) | None | number + 78 If a point is outside or right on the surface of the mesh + 79 the raycasting will return nonesense results. We can either + 80 ignore those cases (``None``), assign a arbitrary number or + 81 we can fall back to radii from k-nearest-neighbors (``knn``). + 82 + 83 Returns + 84 ------- + 85 None + 86 But attaches `radius` to the skeleton's SWC table. Existing + 87 values are replaced! + 88 + 89 """ + 90 if isinstance(mesh, type(None)): + 91 mesh = s.mesh + 92 + 93 mesh = make_trimesh(mesh, validate=True) + 94 + 95 if method == 'knn': + 96 radius = get_radius_knn(s.swc[['x', 'y', 'z']].values, + 97 aggregate=aggregate, + 98 mesh=mesh, **kwargs) + 99 elif method == 'ray': +100 radius = get_radius_ray(s.swc, +101 mesh=mesh, +102 aggregate=aggregate, +103 **kwargs) +104 else: +105 raise ValueError(f'Unknown method "{method}"') +106 +107 s.swc['radius'] = radius +108 +109 return +
View Source
-def radii(s, mesh=None, method='knn', aggregate='mean', validate=False, **kwargs): - """Extract radii for given skeleton table. - - Important - --------- - This function really only produces useful radii if the skeleton is centered - inside the mesh. `by_wavefront` does that by default whereas all other - skeletonization methods don't. Your best bet to get centered skeletons is - to contract the mesh first (`sk.pre.contract`). - - Parameters - ---------- - s : skeletor.Skeleton - Skeleton to clean up. - mesh : trimesh.Trimesh, optional - Original mesh (e.g. before contraction). If not provided will - use the mesh associated with ``s``. - method : "knn" | "ray" - Whether and how to add radius information to each node:: - - - "knn" uses k-nearest-neighbors to get radii: fast but - potential for being very wrong - - "ray" uses ray-casting to get radii: slower but sometimes - less wrong - - aggregate : "mean" | "median" | "max" | "min" | "percentile75" - Function used to aggregate radii over sample (i.e. across - k nearest-neighbors or ray intersections) - validate : bool - If True, will try to fix potential issues with the mesh - (e.g. infinite values, duplicate vertices, degenerate faces) - before skeletonization. Note that this might make changes to - your mesh inplace! - **kwargs - Keyword arguments are passed to the respective method: - - For method "knn":: - - n : int (default 5) - Radius will be the mean over n nearest-neighbors. - - For method "ray":: - - n_rays : int (default 20) - Number of rays to cast for each node. - projection : "sphere" (default) | "tangents" - Whether to cast rays in a sphere around each node or in a - circle orthogonally to the node's tangent vector. - fallback : "knn" (default) | None | number - If a point is outside or right on the surface of the mesh - the raycasting will return nonesense results. We can either - ignore those cases (``None``), assign a arbitrary number or - we can fall back to radii from k-nearest-neighbors (``knn``). - - Returns - ------- - None - But attaches `radius` to the skeleton's SWC table. Existing - values are replaced! - - """ - if isinstance(mesh, type(None)): - mesh = s.mesh - - mesh = make_trimesh(mesh, validate=True) - - if method == 'knn': - radius = get_radius_knn(s.swc[['x', 'y', 'z']].values, - aggregate=aggregate, - mesh=mesh, **kwargs) - elif method == 'ray': - radius = get_radius_ray(s.swc, - mesh=mesh, - aggregate=aggregate, - **kwargs) - else: - raise ValueError(f'Unknown method "{method}"') - - s.swc['radius'] = radius - - return -
Extract radii for given skeleton table.
@@ -296,79 +290,79 @@Returns
View Source
-def clean_up(s, mesh=None, validate=False, inplace=False, **kwargs): - """Clean up the skeleton. + - This function bundles a bunch of procedures to clean up the skeleton: - - 1. Remove twigs that are running parallel to their parent branch - 2. Move nodes outside the mesh back inside (or at least snap to surface) - - Note that this is not a magic bullet and some of this will not work (well) - if the original mesh was degenerate (e.g. internal faces or not watertight) - to begin with. - - Parameters - ---------- - s : skeletor.Skeleton - Skeleton to clean up. - mesh : trimesh.Trimesh, optional - Original mesh (e.g. before contraction). If not provided will - use the mesh associated with ``s``. - validate : bool - If True, will try to fix potential issues with the mesh - (e.g. infinite values, duplicate vertices, degenerate faces) - before cleaning up. Note that this might change your mesh - inplace! - inplace : bool - If False will make and return a copy of the skeleton. If True, - will modify the `s` inplace. - - **kwargs - Keyword arguments are passed to the bundled function. - - For `skeletor.postprocessing.drop_parallel_twigs`:: - - theta : float (default 0.01) - For each twig we generate the dotproduct between the tangent - vectors of it and its parents. If these line up perfectly the - dotproduct will equal 1. ``theta`` determines how much that - value can differ from 1 for us to still prune the twig: higher - theta = more pruning. - - Returns - ------- - s_clean : skeletor.Skeleton - Hopefully improved skeleton. - - """ - if isinstance(mesh, type(None)): - mesh = s.mesh - - mesh = make_trimesh(mesh, validate=validate) - - if not inplace: - s = s.copy() - - # Drop parallel twigs - _ = drop_parallel_twigs(s, theta=kwargs.get('theta', 0.01), inplace=True) - - # Recenter vertices - _ = recenter_vertices(s, mesh, inplace=True) - - return s -
29def clean_up(s, mesh=None, validate=False, inplace=False, **kwargs): +30 """Clean up the skeleton. +31 +32 This function bundles a bunch of procedures to clean up the skeleton: +33 +34 1. Remove twigs that are running parallel to their parent branch +35 2. Move nodes outside the mesh back inside (or at least snap to surface) +36 +37 Note that this is not a magic bullet and some of this will not work (well) +38 if the original mesh was degenerate (e.g. internal faces or not watertight) +39 to begin with. +40 +41 Parameters +42 ---------- +43 s : skeletor.Skeleton +44 Skeleton to clean up. +45 mesh : trimesh.Trimesh, optional +46 Original mesh (e.g. before contraction). If not provided will +47 use the mesh associated with ``s``. +48 validate : bool +49 If True, will try to fix potential issues with the mesh +50 (e.g. infinite values, duplicate vertices, degenerate faces) +51 before cleaning up. Note that this might change your mesh +52 inplace! +53 inplace : bool +54 If False will make and return a copy of the skeleton. If True, +55 will modify the `s` inplace. +56 +57 **kwargs +58 Keyword arguments are passed to the bundled function. +59 +60 For `skeletor.postprocessing.drop_parallel_twigs`:: +61 +62 theta : float (default 0.01) +63 For each twig we generate the dotproduct between the tangent +64 vectors of it and its parents. If these line up perfectly the +65 dotproduct will equal 1. ``theta`` determines how much that +66 value can differ from 1 for us to still prune the twig: higher +67 theta = more pruning. +68 +69 Returns +70 ------- +71 s_clean : skeletor.Skeleton +72 Hopefully improved skeleton. +73 +74 """ +75 if isinstance(mesh, type(None)): +76 mesh = s.mesh +77 +78 mesh = make_trimesh(mesh, validate=validate) +79 +80 if not inplace: +81 s = s.copy() +82 +83 # Drop parallel twigs +84 _ = drop_parallel_twigs(s, theta=kwargs.get('theta', 0.01), inplace=True) +85 +86 # Recenter vertices +87 _ = recenter_vertices(s, mesh, inplace=True) +88 +89 return s +
Clean up the skeleton.
diff --git a/docs/skeletor/pre.html b/docs/skeletor/pre.html index 9fcfc9b..e9042f5 100644 --- a/docs/skeletor/pre.html +++ b/docs/skeletor/pre.html @@ -3,14 +3,14 @@ - +
skeletor.pre
@@ -79,152 +79,143 @@ References
contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44.View Source
-# This script is part of skeletor (http://www.github.com/navis-org/skeletor). -# Copyright (C) 2018 Philipp Schlegel -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. + + + + +-""" -The `skeletor.pre` module contains functions to pre-process meshes before -skeletonization. - -#### Fixing faulty meshes - -Some skeletonization methods are susceptible to faulty meshes (degenerate faces, -wrong normals, etc.). If your skeleton looks off, it might be worth a shot -trying to fix the mesh using `skeletor.pre.fix_mesh()`. - -#### Mesh contraction - -As a rule of thumb: the more your mesh looks like a skeleton, the easier it is -to extract one (duh). Mesh contraction using `skeletor.pre.contract()` [1] can -help you to get your mesh "in shape". - -References ----------- -[1] 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. - -""" - -from .meshcontraction import contract -from .preprocessing import fix_mesh, simplify, remesh - -__docformat__ = "numpy" -__all__ = ['fix_mesh', 'simplify', 'remesh', 'contract'] -1# This script is part of skeletor (http://www.github.com/navis-org/skeletor). + 2# Copyright (C) 2018 Philipp Schlegel + 3# + 4# This program is free software: you can redistribute it and/or modify + 5# it under the terms of the GNU General Public License as published by + 6# the Free Software Foundation, either version 3 of the License, or + 7# (at your option) any later version. + 8# + 9# This program is distributed in the hope that it will be useful, +10# but WITHOUT ANY WARRANTY; without even the implied warranty of +11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +12# GNU General Public License for more details. +13# +14# You should have received a copy of the GNU General Public License +15# along with this program. +16 +17""" +18The `skeletor.pre` module contains functions to pre-process meshes before +19skeletonization. +20 +21#### Fixing faulty meshes +22 +23Some skeletonization methods are susceptible to faulty meshes (degenerate faces, +24wrong normals, etc.). If your skeleton looks off, it might be worth a shot +25trying to fix the mesh using `skeletor.pre.fix_mesh()`. +26 +27#### Mesh contraction +28 +29As a rule of thumb: the more your mesh looks like a skeleton, the easier it is +30to extract one (duh). Mesh contraction using `skeletor.pre.contract()` [1] can +31help you to get your mesh "in shape". +32 +33References +34---------- +35[1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh +36 contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44. +37 +38""" +39 +40from .meshcontraction import contract +41from .preprocessing import fix_mesh, simplify, remesh +42 +43__docformat__ = "numpy" +44__all__ = ['fix_mesh', 'simplify', 'remesh', 'contract'] +
37def fix_mesh(mesh, remote_infinite=True, merge_duplicate_verts=True, + 38 remove_degenerate_faces=True, remove_unreferenced_verts=True, + 39 drop_winglets=True, fix_normals=False, remove_disconnected=False, + 40 inplace=False): + 41 """Try to fix some common problems with mesh. + 42 + 43 1. Remove infinite values + 44 2. Merge duplicate vertices + 45 3. Remove duplicate and degenerate faces + 46 4. Remove unreference vertices + 47 5. Drop winglets (faces that have only one adjacent face) + 48 5. Fix normals (Optional) + 49 6. Remove disconnected fragments (Optional) + 50 + 51 Parameters + 52 ---------- + 53 mesh : mesh-like object + 54 Mesh to fix. Must have `.vertices` and `.faces` + 55 properties. + 56 remove_disconnected : False | int + 57 If a number is given, will iterate over the mesh's + 58 connected components and remove those consisting of + 59 less than the given number of vertices. For example, + 60 ``remove_disconnected=5`` will drop parts of the + 61 mesh that consist of five or less connected + 62 vertices. + 63 inplace : bool + 64 If True, will perform fixes on the input mesh. + 65 If False, will make a copy first. This is silently + 66 ignored if `mesh` is not already a trimesh. + 67 + 68 Returns + 69 ------- + 70 fixed mesh : trimesh.Trimesh + 71 + 72 """ + 73 if not isinstance(mesh, tm.Trimesh): + 74 mesh = make_trimesh(mesh, validate=False) + 75 elif not inplace: + 76 mesh = mesh.copy() + 77 + 78 if remove_disconnected: + 79 to_drop = [] + 80 for c in nx.connected_components(mesh.vertex_adjacency_graph): + 81 if len(c) <= remove_disconnected: + 82 to_drop += list(c) + 83 + 84 # Remove dropped vertices + 85 remove = np.isin(np.arange(mesh.vertices.shape[0]), to_drop) + 86 mesh.update_vertices(~remove) + 87 + 88 if remote_infinite: + 89 mesh.remove_infinite_values() + 90 + 91 if merge_duplicate_verts: + 92 mesh.merge_vertices() + 93 + 94 if remove_degenerate_faces: + 95 mesh.remove_duplicate_faces() + 96 mesh.remove_degenerate_faces() + 97 + 98 if remove_unreferenced_verts: + 99 mesh.remove_unreferenced_vertices() +100 +101 if drop_winglets: +102 mesh = remove_winglets(mesh) +103 +104 # This should be done after all clean-up operations +105 if fix_normals: +106 mesh.fix_normals() +107 +108 return mesh +
View Source
-def fix_mesh(mesh, remote_infinite=True, merge_duplicate_verts=True, - remove_degenerate_faces=True, remove_unreferenced_verts=True, - drop_winglets=True, fix_normals=False, remove_disconnected=False, - inplace=False): - """Try to fix some common problems with mesh. - - 1. Remove infinite values - 2. Merge duplicate vertices - 3. Remove duplicate and degenerate faces - 4. Remove unreference vertices - 5. Drop winglets (faces that have only one adjacent face) - 5. Fix normals (Optional) - 6. Remove disconnected fragments (Optional) - - Parameters - ---------- - mesh : mesh-like object - Mesh to fix. Must have `.vertices` and `.faces` - properties. - remove_disconnected : False | int - If a number is given, will iterate over the mesh's - connected components and remove those consisting of - less than the given number of vertices. For example, - ``remove_disconnected=5`` will drop parts of the - mesh that consist of five or less connected - vertices. - inplace : bool - If True, will perform fixes on the input mesh. - If False, will make a copy first. This is silently - ignored if `mesh` is not already a trimesh. - - Returns - ------- - fixed mesh : trimesh.Trimesh - - """ - if not isinstance(mesh, tm.Trimesh): - mesh = make_trimesh(mesh, validate=False) - elif not inplace: - mesh = mesh.copy() - - if remove_disconnected: - to_drop = [] - for c in nx.connected_components(mesh.vertex_adjacency_graph): - if len(c) <= remove_disconnected: - to_drop += list(c) - - # Remove dropped vertices - remove = np.isin(np.arange(mesh.vertices.shape[0]), to_drop) - mesh.update_vertices(~remove) - - if remote_infinite: - mesh.remove_infinite_values() - - if merge_duplicate_verts: - mesh.merge_vertices() - - if remove_degenerate_faces: - mesh.remove_duplicate_faces() - mesh.remove_degenerate_faces() - - if remove_unreferenced_verts: - mesh.remove_unreferenced_vertices() - - if drop_winglets: - mesh = remove_winglets(mesh) - - # This should be done after all clean-up operations - if fix_normals: - mesh.fix_normals() - - return mesh -
Try to fix some common problems with mesh.
@@ -267,71 +258,71 @@Returns
192def simplify(mesh, ratio): +193 """Simplify mesh using Blender 3D. +194 +195 Uses Blender's "decimate" modifier in "collapse" mode. +196 +197 Parameters +198 ---------- +199 mesh : trimesh.Trimesh +200 Mesh to simplify. +201 ratio : float +202 Factor to which to reduce faces. For example, a ratio of 0.5 will +203 reduce the number of faces to 50%. +204 +205 Returns +206 ------- +207 trimesh.Trimesh +208 Simplified mesh. +209 +210 """ +211 if not tm.interfaces.blender.exists: +212 raise ImportError('No Blender available (executable not found).') +213 _blender_executable = tm.interfaces.blender._blender_executable +214 +215 assert ratio < 1 and ratio > 0, 'ratio must be between 0 and 1' +216 +217 # We need to import here to avoid circular imports +218 from ..utilities import make_trimesh +219 mesh = make_trimesh(mesh, validate=False) +220 assert isinstance(mesh, tm.Trimesh) +221 +222 # Load the template +223 temp_name = 'blender_decimate.py.template' +224 if temp_name in _cache: +225 template = _cache[temp_name] +226 else: +227 with open(os.path.join(_pwd, 'templates', temp_name), 'r') as f: +228 template = f.read() +229 _cache[temp_name] = template +230 +231 # Replace placeholder with actual ratio +232 script = template.replace('$RATIO', str(ratio)) +233 +234 # Let trimesh's MeshScript take care of exectution and clean-up +235 with tm.interfaces.generic.MeshScript(meshes=[mesh], +236 script=script, +237 debug=False) as blend: +238 result = blend.run(_blender_executable +239 + ' --background --python $SCRIPT') +240 +241 # Blender apparently returns actively incorrect face normals +242 result.face_normals = None +243 +244 return result +
View Source
-def simplify(mesh, ratio): - """Simplify mesh using Blender 3D. - - Uses Blender's "decimate" modifier in "collapse" mode. - - Parameters - ---------- - mesh : trimesh.Trimesh - Mesh to simplify. - ratio : float - Factor to which to reduce faces. For example, a ratio of 0.5 will - reduce the number of faces to 50%. - - Returns - ------- - trimesh.Trimesh - Simplified mesh. - - """ - if not tm.interfaces.blender.exists: - raise ImportError('No Blender available (executable not found).') - _blender_executable = tm.interfaces.blender._blender_executable - - assert ratio < 1 and ratio > 0, 'ratio must be between 0 and 1' - - # We need to import here to avoid circular imports - from ..utilities import make_trimesh - mesh = make_trimesh(mesh, validate=False) - assert isinstance(mesh, tm.Trimesh) - - # Load the template - temp_name = 'blender_decimate.py.template' - if temp_name in _cache: - template = _cache[temp_name] - else: - with open(os.path.join(_pwd, 'templates', temp_name), 'r') as f: - template = f.read() - _cache[temp_name] = template - - # Replace placeholder with actual ratio - script = template.replace('$RATIO', str(ratio)) - - # Let trimesh's MeshScript take care of exectution and clean-up - with tm.interfaces.generic.MeshScript(meshes=[mesh], - script=script, - debug=False) as blend: - result = blend.run(_blender_executable - + ' --background --python $SCRIPT') - - # Blender apparently returns actively incorrect face normals - result.face_normals = None - - return result -
Simplify mesh using Blender 3D.
@@ -357,74 +348,74 @@Returns
247def remesh(mesh, voxel_size=50, adaptivity=5): +248 """Remesh mesh using Blender 3D. +249 +250 Uses Blender's "remesh" modifier in "voxel" mode. +251 +252 Parameters +253 ---------- +254 mesh : trimesh.Trimesh +255 Mesh to remesh. +256 voxel_size : float +257 Size of individual voxels (edge length). +258 adaptivity: float +259 Reduces final face count where detail is not important. +260 +261 Returns +262 ------- +263 trimesh.Trimesh +264 Remeshed mesh. +265 +266 """ +267 if not tm.interfaces.blender.exists: +268 raise ImportError('No Blender available (executable not found).') +269 _blender_executable = tm.interfaces.blender._blender_executable +270 +271 assert voxel_size > 0, '`voxel_size` must be a positive number' +272 assert adaptivity > 0, '`adaptivity` must be a positive number' +273 +274 # We need to import here to avoid circular imports +275 from ..utilities import make_trimesh +276 mesh = make_trimesh(mesh, validate=False) +277 assert isinstance(mesh, tm.Trimesh) +278 +279 # Load the template +280 temp_name = 'blender_remesh.py.template' +281 if temp_name in _cache: +282 template = _cache[temp_name] +283 else: +284 with open(os.path.join(_pwd, 'templates', temp_name), 'r') as f: +285 template = f.read() +286 _cache[temp_name] = template +287 +288 # Replace placeholder with actual ratio +289 script = template.replace('$VOXEL_SIZE', str(voxel_size) +290 ).replace('$ADAPTIVITY', str(adaptivity)) +291 +292 # Let trimesh's MeshScript take care of exectution and clean-up +293 with tm.interfaces.generic.MeshScript(meshes=[mesh], +294 script=script, +295 debug=False) as blend: +296 result = blend.run(_blender_executable +297 + ' --background --python $SCRIPT') +298 +299 # Blender apparently returns actively incorrect face normals +300 result.face_normals = None +301 +302 return result +
View Source
-def remesh(mesh, voxel_size=50, adaptivity=5): - """Remesh mesh using Blender 3D. - - Uses Blender's "remesh" modifier in "voxel" mode. - - Parameters - ---------- - mesh : trimesh.Trimesh - Mesh to remesh. - voxel_size : float - Size of individual voxels (edge length). - adaptivity: float - Reduces final face count where detail is not important. - - Returns - ------- - trimesh.Trimesh - Remeshed mesh. - - """ - if not tm.interfaces.blender.exists: - raise ImportError('No Blender available (executable not found).') - _blender_executable = tm.interfaces.blender._blender_executable - - assert voxel_size > 0, '`voxel_size` must be a positive number' - assert adaptivity > 0, '`adaptivity` must be a positive number' - - # We need to import here to avoid circular imports - from ..utilities import make_trimesh - mesh = make_trimesh(mesh, validate=False) - assert isinstance(mesh, tm.Trimesh) - - # Load the template - temp_name = 'blender_remesh.py.template' - if temp_name in _cache: - template = _cache[temp_name] - else: - with open(os.path.join(_pwd, 'templates', temp_name), 'r') as f: - template = f.read() - _cache[temp_name] = template - - # Replace placeholder with actual ratio - script = template.replace('$VOXEL_SIZE', str(voxel_size) - ).replace('$ADAPTIVITY', str(adaptivity)) - - # Let trimesh's MeshScript take care of exectution and clean-up - with tm.interfaces.generic.MeshScript(meshes=[mesh], - script=script, - debug=False) as blend: - result = blend.run(_blender_executable - + ' --background --python $SCRIPT') - - # Blender apparently returns actively incorrect face normals - result.face_normals = None - - return result -
Remesh mesh using Blender 3D.
@@ -451,247 +442,235 @@Returns
37def contract(mesh, epsilon=1e-06, iter_lim=100, time_lim=None, precision=1e-07, + 38 SL=2, WH0=1, WL0='auto', operator='cotangent', progress=True, + 39 validate=True): + 40 """Contract mesh. + 41 + 42 In a nutshell: this function contracts the mesh by applying rounds of + 43 _constraint_ Laplacian smoothing. This function can be fairly expensive + 44 and I highly recommend you play around with ``SL`` to contract the + 45 mesh in as few steps as possible. The contraction doesn't have to be perfect + 46 for good skeletonization results (<10%, i.e. `epsilon<0.1`). + 47 + 48 Also: parameterization matters a lot! Default parameters will get you there + 49 but playing around with `SL` and `WH0` might speed things up by an order of + 50 magnitude. + 51 + 52 Parameters + 53 ---------- + 54 mesh : mesh obj + 55 The mesh to be contracted. Can be any object (e.g. + 56 a trimesh.Trimesh) that has ``.vertices`` and ``.faces`` + 57 properties or a tuple ``(vertices, faces)`` or a dictionary + 58 ``{'vertices': vertices, 'faces': faces}``. + 59 Vertices and faces must be (N, 3) numpy arrays. + 60 epsilon : float (0-1), optional + 61 Target contraction rate as measured by the sum of all face + 62 areas in the contracted versus the original mesh. Algorithm + 63 will stop once mesh is contracted below this threshold. + 64 Depending on your mesh (number of faces, shape) reaching a + 65 strong contraction can be extremely costly with comparatively + 66 little benefit for the subsequent skeletonization. Note that + 67 the algorithm might stop short of this target if ``iter_lim`` + 68 or ``time_lim`` is reached first or if the sum of face areas + 69 is increasing from one iteration to the next instead of + 70 decreasing. + 71 iter_lim : int (>1), optional + 72 Maximum rounds of contractions. + 73 time_lim : int, optional + 74 Maximum run time in seconds. Note that this limit is not + 75 checked during but after each round of contraction. Hence, + 76 the actual total time will likely overshoot ``time_lim``. + 77 precision : float, optional + 78 Sets the precision for finding the least-square solution. + 79 This is the main determinant for speed vs quality: lower + 80 values will take (much) longer but will get you closer to an + 81 optimally contracted mesh. Higher values will be faster but + 82 the iterative contractions might stop early. + 83 SL : float, optional + 84 Factor by which the contraction matrix is multiplied for + 85 each iteration. Higher values = quicker contraction, lower + 86 values = more likely to get you an optimal contraction. + 87 WH0 : float, optional + 88 Initial weight factor for the attraction constraints. + 89 The ratio of the initial weights ``WL0`` and ``WH0`` + 90 controls the smoothness and the degree of contraction of the + 91 first iteration result, thus it determines the amount of + 92 details retained in subsequent and final contracted meshes: + 93 higher ``WH0`` = more details retained. + 94 WL0 : "auto" | float + 95 Initial weight factor for the contraction constraints. By + 96 default ("auto"), this will be set to ``1e-3 * sqrt(A)`` + 97 with ``A`` being the average face area. This ensures that + 98 contraction forces scale with the coarseness of the mesh. + 99 operator : "cotangent" | "umbrella" +100 Which Laplacian operator to use: +101 +102 - The "cotangent" operator (default) takes both topology +103 and geometry of the mesh into account and is hence a +104 better descriptor of the curvature flow. This is the +105 operator used in the original paper. +106 - The "umbrella" operator (aka "uniform weighting") uses +107 only topological features of the mesh. This also makes +108 it more robust against flaws in the mesh! Use it when +109 the cotangent operator produces oddly contracted meshes. +110 +111 progress : bool +112 Whether or not to show a progress bar. +113 validate : bool +114 If True, will try to fix potential issues with the mesh +115 (e.g. infinite values, duplicate vertices, degenerate faces) +116 before collapsing. Degenerate meshes can lead to effectively +117 infinite runtime for this function! +118 +119 Returns +120 ------- +121 trimesh.Trimesh +122 Contracted copy of original mesh. The final contraction rate +123 is attached to the mesh as ``.epsilon`` property. +124 +125 References +126 ---------- +127 [1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh +128 contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44. +129 +130 """ +131 assert operator in ('cotangent', 'umbrella') +132 start = time.time() +133 +134 # Force into trimesh +135 m = make_trimesh(mesh, validate=validate) +136 n = len(m.vertices) +137 +138 # Initialize attraction weights +139 zeros = np.zeros((n, 3)) +140 WH0_diag = np.zeros(n) +141 WH0_diag.fill(WH0) +142 WH0 = sp.sparse.spdiags(WH0_diag, 0, WH0_diag.size, WH0_diag.size) +143 # Make a copy but keep original values +144 WH = sp.sparse.dia_matrix(WH0) +145 +146 # Initialize contraction weights +147 if WL0 == 'auto': +148 WL0 = 1e-03 * np.sqrt(averageFaceArea(m)) +149 #WL0 = 1.0 / 10.0 * np.sqrt(averageFaceArea(m)) +150 WL_diag = np.zeros(n) +151 WL_diag.fill(WL0) +152 WL = sp.sparse.spdiags(WL_diag, 0, WL_diag.size, WL_diag.size) +153 +154 # Copy mesh +155 dm = m.copy() +156 +157 area_ratios = [1.0] +158 originalRingAreas = getOneRingAreas(dm) +159 goodvertices = dm.vertices +160 bar_format = ("{l_bar}{bar}| [{elapsed}<{remaining}, " +161 "{postfix[0]}/{postfix[1]}it, " +162 "{rate_fmt}, epsilon {postfix[2]:.2g}") +163 with tqdm(total=100, +164 bar_format=bar_format, +165 disable=progress is False, +166 postfix=[1, iter_lim, 1]) as pbar: +167 for i in range(iter_lim): +168 # Get Laplace weights +169 if operator == 'cotangent': +170 L = laplacian_cotangent(dm, normalized=True) +171 else: +172 L = laplacian_umbrella(dm) +173 +174 V = getMeshVPos(dm) +175 A = sp.sparse.vstack([WL.dot(L), WH]) +176 b = np.vstack((zeros, WH.dot(V))) +177 +178 cpts = np.zeros((n, 3)) +179 for j in range(3): +180 """ +181 # Solve A*x = b +182 # Note that we force scipy's lsqr() to use current vertex +183 # positions as start points - this speeds things up and +184 # without it we get suboptimal solutions that lead to early +185 # termination +186 cpts[:, j] = lsqr(A, b[:, j], +187 atol=precision, btol=precision, +188 damp=1, +189 x0=dm.vertices[:, j])[0] +190 """ +191 # The solution below is recommended in scipy's lsqr docstring +192 # for when we have an initial estimate +193 # Gives use the same results as above but is slightly faster +194 +195 # Initial estimate (i.e. our current positions) +196 x0 = dm.vertices[:, j] +197 # Compute residual vector +198 r0 = b[:, j] - A * x0 +199 # Use LSQR to solve the system +200 dx = lsqr(A, r0, +201 atol=precision, btol=precision, +202 damp=1)[0] +203 # Add the correction dx to obtain a final solution +204 cpts[:, j] = x0 + dx +205 +206 # Update mesh with new vertex position +207 dm.vertices = cpts +208 +209 # Update iteration in progress bar +210 if progress: +211 pbar.postfix[0] = i + 1 +212 +213 # Break if face area has increased compared to the last iteration +214 new_eps = dm.area / m.area +215 if (new_eps > area_ratios[-1]): +216 dm.vertices = goodvertices +217 if progress: +218 tqdm.write("Total face area increased from last iteration." +219 f" Contraction stopped prematurely after {i} " +220 f"iterations at epsilon {area_ratios[-1]:.2g}.") +221 break +222 area_ratios.append(new_eps) +223 +224 # Update progress bar +225 if progress: +226 pbar.postfix[2] = area_ratios[-1] +227 prog = round((area_ratios[-2] - area_ratios[-1]) / (1 - epsilon) * 100) +228 pbar.update(min(prog, 100-pbar.n)) +229 +230 goodvertices = cpts +231 +232 # Update contraction weights -> at each iteration the contraction +233 # forces increase to counteract the increased attraction forces +234 WL = sp.sparse.dia_matrix(WL.multiply(SL)) +235 +236 # Update attraction weights -> the smaller the one ring areas +237 # the higher the attraction forces +238 changeinarea = np.sqrt(originalRingAreas / getOneRingAreas(dm)) +239 WH = sp.sparse.dia_matrix(WH0.multiply(changeinarea)) +240 +241 # Stop if we reached our target contraction rate +242 if (area_ratios[-1] <= epsilon): +243 break +244 +245 # Stop if time limit is reached +246 if not isinstance(time_lim, (bool, type(None))): +247 if (time.time() - start) >= time_lim: +248 break +249 +250 # Keep track of final epsilon +251 dm.epsilon = area_ratios[-1] +252 +253 return dm +
View Source
-def contract(mesh, epsilon=1e-06, iter_lim=100, time_lim=None, precision=1e-07, - SL=2, WH0=1, WL0='auto', operator='cotangent', progress=True, - validate=True): - """Contract mesh. - - In a nutshell: this function contracts the mesh by applying rounds of - _constraint_ Laplacian smoothing. This function can be fairly expensive - and I highly recommend you play around with ``SL`` to contract the - mesh in as few steps as possible. The contraction doesn't have to be perfect - for good skeletonization results (<10%, i.e. `epsilon<0.1`). - - Also: parameterization matters a lot! Default parameters will get you there - but playing around with `SL` and `WH0` might speed things up by an order of - magnitude. - - Parameters - ---------- - mesh : mesh obj - The mesh to be contracted. Can be any object (e.g. - a trimesh.Trimesh) that has ``.vertices`` and ``.faces`` - properties or a tuple ``(vertices, faces)`` or a dictionary - ``{'vertices': vertices, 'faces': faces}``. - Vertices and faces must be (N, 3) numpy arrays. - epsilon : float (0-1), optional - Target contraction rate as measured by the sum of all face - areas in the contracted versus the original mesh. Algorithm - will stop once mesh is contracted below this threshold. - Depending on your mesh (number of faces, shape) reaching a - strong contraction can be extremely costly with comparatively - little benefit for the subsequent skeletonization. Note that - the algorithm might stop short of this target if ``iter_lim`` - or ``time_lim`` is reached first or if the sum of face areas - is increasing from one iteration to the next instead of - decreasing. - iter_lim : int (>1), optional - Maximum rounds of contractions. - time_lim : int, optional - Maximum run time in seconds. Note that this limit is not - checked during but after each round of contraction. Hence, - the actual total time will likely overshoot ``time_lim``. - precision : float, optional - Sets the precision for finding the least-square solution. - This is the main determinant for speed vs quality: lower - values will take (much) longer but will get you closer to an - optimally contracted mesh. Higher values will be faster but - the iterative contractions might stop early. - SL : float, optional - Factor by which the contraction matrix is multiplied for - each iteration. Higher values = quicker contraction, lower - values = more likely to get you an optimal contraction. - WH0 : float, optional - Initial weight factor for the attraction constraints. - The ratio of the initial weights ``WL0`` and ``WH0`` - controls the smoothness and the degree of contraction of the - first iteration result, thus it determines the amount of - details retained in subsequent and final contracted meshes: - higher ``WH0`` = more details retained. - WL0 : "auto" | float - Initial weight factor for the contraction constraints. By - default ("auto"), this will be set to ``1e-3 * sqrt(A)`` - with ``A`` being the average face area. This ensures that - contraction forces scale with the coarseness of the mesh. - operator : "cotangent" | "umbrella" - Which Laplacian operator to use: - - - The "cotangent" operator (default) takes both topology - and geometry of the mesh into account and is hence a - better descriptor of the curvature flow. This is the - operator used in the original paper. - - The "umbrella" operator (aka "uniform weighting") uses - only topological features of the mesh. This also makes - it more robust against flaws in the mesh! Use it when - the cotangent operator produces oddly contracted meshes. - - progress : bool - Whether or not to show a progress bar. - validate : bool - If True, will try to fix potential issues with the mesh - (e.g. infinite values, duplicate vertices, degenerate faces) - before collapsing. Degenerate meshes can lead to effectively - infinite runtime for this function! - - Returns - ------- - trimesh.Trimesh - Contracted copy of original mesh. The final contraction rate - is attached to the mesh as ``.epsilon`` property. - - References - ---------- - [1] 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. - - """ - assert operator in ('cotangent', 'umbrella') - start = time.time() - - # Force into trimesh - m = make_trimesh(mesh, validate=validate) - n = len(m.vertices) - - # Initialize attraction weights - zeros = np.zeros((n, 3)) - WH0_diag = np.zeros(n) - WH0_diag.fill(WH0) - WH0 = sp.sparse.spdiags(WH0_diag, 0, WH0_diag.size, WH0_diag.size) - # Make a copy but keep original values - WH = sp.sparse.dia_matrix(WH0) - - # Initialize contraction weights - if WL0 == 'auto': - WL0 = 1e-03 * np.sqrt(averageFaceArea(m)) - #WL0 = 1.0 / 10.0 * np.sqrt(averageFaceArea(m)) - WL_diag = np.zeros(n) - WL_diag.fill(WL0) - WL = sp.sparse.spdiags(WL_diag, 0, WL_diag.size, WL_diag.size) - - # Copy mesh - dm = m.copy() - - area_ratios = [1.0] - originalRingAreas = getOneRingAreas(dm) - goodvertices = dm.vertices - bar_format = ("{l_bar}{bar}| [{elapsed}<{remaining}, " - "{postfix[0]}/{postfix[1]}it, " - "{rate_fmt}, epsilon {postfix[2]:.2g}") - with tqdm(total=100, - bar_format=bar_format, - disable=progress is False, - postfix=[1, iter_lim, 1]) as pbar: - for i in range(iter_lim): - # Get Laplace weights - if operator == 'cotangent': - L = laplacian_cotangent(dm, normalized=True) - else: - L = laplacian_umbrella(dm) - - V = getMeshVPos(dm) - A = sp.sparse.vstack([WL.dot(L), WH]) - b = np.vstack((zeros, WH.dot(V))) - - cpts = np.zeros((n, 3)) - for j in range(3): - """ - # Solve A*x = b - # Note that we force scipy's lsqr() to use current vertex - # positions as start points - this speeds things up and - # without it we get suboptimal solutions that lead to early - # termination - cpts[:, j] = lsqr(A, b[:, j], - atol=precision, btol=precision, - damp=1, - x0=dm.vertices[:, j])[0] - """ - # The solution below is recommended in scipy's lsqr docstring - # for when we have an initial estimate - # Gives use the same results as above but is slightly faster - - # Initial estimate (i.e. our current positions) - x0 = dm.vertices[:, j] - # Compute residual vector - r0 = b[:, j] - A * x0 - # Use LSQR to solve the system - dx = lsqr(A, r0, - atol=precision, btol=precision, - damp=1)[0] - # Add the correction dx to obtain a final solution - cpts[:, j] = x0 + dx - - # Update mesh with new vertex position - dm.vertices = cpts - - # Update iteration in progress bar - if progress: - pbar.postfix[0] = i + 1 - - # Break if face area has increased compared to the last iteration - new_eps = dm.area / m.area - if (new_eps > area_ratios[-1]): - dm.vertices = goodvertices - if progress: - tqdm.write("Total face area increased from last iteration." - f" Contraction stopped prematurely after {i} " - f"iterations at epsilon {area_ratios[-1]:.2g}.") - break - area_ratios.append(new_eps) - - # Update progress bar - if progress: - pbar.postfix[2] = area_ratios[-1] - prog = round((area_ratios[-2] - area_ratios[-1]) / (1 - epsilon) * 100) - pbar.update(min(prog, 100-pbar.n)) - - goodvertices = cpts - - # Update contraction weights -> at each iteration the contraction - # forces increase to counteract the increased attraction forces - WL = sp.sparse.dia_matrix(WL.multiply(SL)) - - # Update attraction weights -> the smaller the one ring areas - # the higher the attraction forces - changeinarea = np.sqrt(originalRingAreas / getOneRingAreas(dm)) - WH = sp.sparse.dia_matrix(WH0.multiply(changeinarea)) - - # Stop if we reached our target contraction rate - if (area_ratios[-1] <= epsilon): - break - - # Stop if time limit is reached - if not isinstance(time_lim, (bool, type(None))): - if (time.time() - start) >= time_lim: - break - - # Keep track of final epsilon - dm.epsilon = area_ratios[-1] - - return dm -
Contract mesh.
diff --git a/docs/skeletor/skeletonize.html b/docs/skeletor/skeletonize.html index 3009b90..5e403ee 100644 --- a/docs/skeletor/skeletonize.html +++ b/docs/skeletor/skeletonize.html @@ -3,14 +3,14 @@ - +
skeletor.skeletonize
@@ -158,234 +158,235 @@ References
View Source
-# This script is part of skeletor (http://www.github.com/navis-org/skeletor). -# Copyright (C) 2018 Philipp Schlegel -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. - -r""" -The `skeletor.skeletonize` module contains functions to for skeletonization -of meshes. - -There are several approaches to skeletonizing a mesh. Which one to pick depends -(among other things) on the shape of your mesh and the skeleton quality you want -to get out of it. In general, unless you mesh already looks like a tube I -recommend looking into mesh contraction [^1]. - -Please see the documentation of the individual functions for details but here -is a quick summary: - -| function | speed | robust | radii [^2] | mesh map [^3] | description | -| ------------------------------------------- | :---: | :----: | :--------: | :-----------: | ---------------------------------------------------| -| `skeletor.skeletonize.by_wavefront()` | +++ | ++ | yes | yes | works well for tubular meshes | -| `skeletor.skeletonize.by_vertex_clusters()` | ++ | + | no | yes | best with contracted meshes [^1] | -| `skeletor.skeletonize.by_teasar()` | + | ++ | no | yes | works on mesh surface | -| `skeletor.skeletonize.by_tangent_ball()` | ++ | 0 | yes | yes | works with mesh normals | -| `skeletor.skeletonize.by_edge_collapse()` | - | 0 | no | no | published with [1] - never got this to work well | - -[^1]: use `skeletor.pre.contract()` -[^2]: radii can also be added in postprocessing with `skeletor.post.radii()` -[^3]: a mapping from the meshes vertices to skeleton nodes - -## References - -`[1] 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.` - -""" - -from .edge_collapse import * -from .vertex_cluster import * -from .wave import * -from .teasar import * -from .tangent_ball import * - -__docformat__ = "numpy" -__all__ = ['by_teasar', 'by_wavefront', 'by_vertex_clusters', - 'by_edge_collapse', 'by_tangent_ball'] -
1# This script is part of skeletor (http://www.github.com/navis-org/skeletor). + 2# Copyright (C) 2018 Philipp Schlegel + 3# + 4# This program is free software: you can redistribute it and/or modify + 5# it under the terms of the GNU General Public License as published by + 6# the Free Software Foundation, either version 3 of the License, or + 7# (at your option) any later version. + 8# + 9# This program is distributed in the hope that it will be useful, +10# but WITHOUT ANY WARRANTY; without even the implied warranty of +11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +12# GNU General Public License for more details. +13# +14# You should have received a copy of the GNU General Public License +15# along with this program. +16 +17r""" +18The `skeletor.skeletonize` module contains functions to for skeletonization +19of meshes. +20 +21There are several approaches to skeletonizing a mesh. Which one to pick depends +22(among other things) on the shape of your mesh and the skeleton quality you want +23to get out of it. In general, unless you mesh already looks like a tube I +24recommend looking into mesh contraction [^1]. +25 +26Please see the documentation of the individual functions for details but here +27is a quick summary: +28 +29| function | speed | robust | radii [^2] | mesh map [^3] | description | +30| ------------------------------------------- | :---: | :----: | :--------: | :-----------: | ---------------------------------------------------| +31| `skeletor.skeletonize.by_wavefront()` | +++ | ++ | yes | yes | works well for tubular meshes | +32| `skeletor.skeletonize.by_vertex_clusters()` | ++ | + | no | yes | best with contracted meshes [^1] | +33| `skeletor.skeletonize.by_teasar()` | + | ++ | no | yes | works on mesh surface | +34| `skeletor.skeletonize.by_tangent_ball()` | ++ | 0 | yes | yes | works with mesh normals | +35| `skeletor.skeletonize.by_edge_collapse()` | - | 0 | no | no | published with [1] - never got this to work well | +36 +37[^1]: use `skeletor.pre.contract()` +38[^2]: radii can also be added in postprocessing with `skeletor.post.radii()` +39[^3]: a mapping from the meshes vertices to skeleton nodes +40 +41## References +42 +43`[1] 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.` +44 +45""" +46 +47from .edge_collapse import * +48from .vertex_cluster import * +49from .wave import * +50from .teasar import * +51from .tangent_ball import * +52 +53__docformat__ = "numpy" +54__all__ = ['by_teasar', 'by_wavefront', 'by_vertex_clusters', +55 'by_edge_collapse', 'by_tangent_ball'] +
View Source
-def by_teasar(mesh, inv_dist, min_length=None, root=None, progress=True): - """Skeletonize a mesh mesh using the TEASAR algorithm [1]. - - This algorithm finds the longest path from a root vertex, invalidates all - vertices that are within `inv_dist`. Then picks the second longest (and - still valid) path and does the same. Rinse & repeat until all vertices have - been invalidated. It's fast + works very well with tubular meshes, and with - `inv_dist` you have control over the level of detail. Note that by its - nature the skeleton will be exactly on the surface of the mesh. - - Based on the implementation by Sven Dorkenwald, Casey Schneider-Mizell and - Forrest Collman in `meshparty` (https://github.com/sdorkenw/MeshParty). - - Parameters - ---------- - mesh : mesh obj - The mesh to be skeletonize. Can an object that has - ``.vertices`` and ``.faces`` properties (e.g. a - trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a - dictionary ``{'vertices': vertices, 'faces': faces}``. - inv_dist : int | float - Distance along the mesh used for invalidation of vertices. - This controls how detailed (or noisy) the skeleton will be. - min_length : float, optional - If provided, will skip any branch that is shorter than - `min_length`. Use this to get rid of noise but note that - it will lead to vertices not being mapped to skeleton nodes. - Such vertices will show up with index -1 in - `Skeleton.mesh_map`. - root : int, optional - Vertex ID of a root. If not provided will use ``0``. - progress : bool, optional - If True, will show progress bar. - - Returns - ------- - skeletor.Skeleton - Holds results of the skeletonization and enables quick - visualization. - - References - ---------- - [1] Sato, M., Bitter, I., Bender, M. A., Kaufman, A. E., & Nakajima, M. - (n.d.). TEASAR: tree-structure extraction algorithm for accurate and - robust skeletons. In Proceedings the Eighth Pacific Conference on - Computer Graphics and Applications. IEEE Comput. Soc. - https://doi.org/10.1109/pccga.2000.883951 - - """ - mesh = make_trimesh(mesh, validate=False) - - # Generate Graph (must be undirected) - G = ig.Graph(edges=mesh.edges_unique, directed=False) - G.es['weight'] = mesh.edges_unique_length - - if not root: - root = 0 - - edges = np.array([], dtype=np.int64) - mesh_map = np.full(mesh.vertices.shape[0], fill_value=-1) - - with tqdm(desc='Invalidating', total=len(G.vs), - disable=not progress, leave=False) as pbar: - for cc in sorted(G.clusters(), key=len, reverse=True): - # Make a subgraph for this connected component - SG = G.subgraph(cc) - cc = np.array(cc) - - # Find root within subgraph - if root in cc: - this_root = np.where(cc == root)[0][0] - else: - this_root = 0 - - # Get the sparse adjacency matrix of the subgraph - sp = SG.get_adjacency_sparse('weight') - - # Get lengths of paths to all nodes from root - paths = SG.shortest_paths(this_root, target=None, weights='weight', - mode='ALL')[0] - paths = np.array(paths) - - # Prep array for invalidation - valid = ~np.zeros(paths.shape).astype(bool) - invalidated = 0 - - while np.any(valid): - # Find the farthest point - farthest = np.argmax(paths) - - # Get path from root to farthest point - path = SG.get_shortest_paths(this_root, farthest, - weights='weight', mode='ALL')[0] - - # Get IDs of edges along the path - eids = SG.get_eids(path=path, directed=False) - - # Stop if farthest point is closer than min_length - add = True - if min_length: - # This should only be distance to the first branchpoint - # from the tip since we set other weights to zero - le = sum(SG.es[eids].get_attribute_values('weight')) - if le < min_length: - add = False - - if add: - # Add these new edges - new_edges = np.vstack((cc[path[:-1]], cc[path[1:]])).T - edges = np.append(edges, new_edges).reshape(-1, 2) - - # Invalidate points in the path - valid[path] = False - paths[path] = 0 - - # Must set weights along path to 0 so that this path is - # taken again in future iterations - SG.es[eids]['weight'] = 0 - - # Get all nodes within `inv_dist` to this path - # Note: can we somehow only include still valid nodes to speed - # things up? - dist, _, sources = dijkstra(sp, directed=False, indices=path, - limit=inv_dist, min_only=True, - return_predecessors=True) - - # Invalidate - in_dist = dist <= inv_dist - to_invalidate = np.where(in_dist)[0] - valid[to_invalidate] = False - paths[to_invalidate] = 0 - - # Update mesh vertex to skeleton node map - mesh_map[cc[in_dist]] = cc[sources[in_dist]] - - pbar.update((~valid).sum() - invalidated) - invalidated = (~valid).sum() - - # Make unique edges (paths will have overlapped!) - edges = unique(edges, axis=0) - - # Create a directed acyclic and hierarchical graph - G_nx = edges_to_graph(edges=edges[:, [1, 0]], - fix_tree=True, fix_edges=False, - weight=False) - - # Generate the SWC table - swc, new_ids = make_swc(G_nx, coords=mesh.vertices, reindex=True) - - # Update vertex to node ID map - mesh_map = np.array([new_ids.get(n, -1) for n in mesh_map]) - - return Skeleton(swc=swc, mesh=mesh, mesh_map=mesh_map, method='teasar') -
39def by_teasar(mesh, inv_dist, min_length=None, root=None, progress=True): + 40 """Skeletonize a mesh mesh using the TEASAR algorithm [1]. + 41 + 42 This algorithm finds the longest path from a root vertex, invalidates all + 43 vertices that are within `inv_dist`. Then picks the second longest (and + 44 still valid) path and does the same. Rinse & repeat until all vertices have + 45 been invalidated. It's fast + works very well with tubular meshes, and with + 46 `inv_dist` you have control over the level of detail. Note that by its + 47 nature the skeleton will be exactly on the surface of the mesh. + 48 + 49 Based on the implementation by Sven Dorkenwald, Casey Schneider-Mizell and + 50 Forrest Collman in `meshparty` (https://github.com/sdorkenw/MeshParty). + 51 + 52 Parameters + 53 ---------- + 54 mesh : mesh obj + 55 The mesh to be skeletonize. Can an object that has + 56 ``.vertices`` and ``.faces`` properties (e.g. a + 57 trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a + 58 dictionary ``{'vertices': vertices, 'faces': faces}``. + 59 inv_dist : int | float + 60 Distance along the mesh used for invalidation of vertices. + 61 This controls how detailed (or noisy) the skeleton will be. + 62 min_length : float, optional + 63 If provided, will skip any branch that is shorter than + 64 `min_length`. Use this to get rid of noise but note that + 65 it will lead to vertices not being mapped to skeleton nodes. + 66 Such vertices will show up with index -1 in + 67 `Skeleton.mesh_map`. + 68 root : int, optional + 69 Vertex ID of a root. If not provided will use ``0``. + 70 progress : bool, optional + 71 If True, will show progress bar. + 72 + 73 Returns + 74 ------- + 75 skeletor.Skeleton + 76 Holds results of the skeletonization and enables quick + 77 visualization. + 78 + 79 References + 80 ---------- + 81 [1] Sato, M., Bitter, I., Bender, M. A., Kaufman, A. E., & Nakajima, M. + 82 (n.d.). TEASAR: tree-structure extraction algorithm for accurate and + 83 robust skeletons. In Proceedings the Eighth Pacific Conference on + 84 Computer Graphics and Applications. IEEE Comput. Soc. + 85 https://doi.org/10.1109/pccga.2000.883951 + 86 + 87 """ + 88 mesh = make_trimesh(mesh, validate=False) + 89 + 90 # Generate Graph (must be undirected) + 91 G = ig.Graph(edges=mesh.edges_unique, directed=False) + 92 G.es['weight'] = mesh.edges_unique_length + 93 + 94 if not root: + 95 root = 0 + 96 + 97 edges = np.array([], dtype=np.int64) + 98 mesh_map = np.full(mesh.vertices.shape[0], fill_value=-1) + 99 +100 with tqdm(desc='Invalidating', total=len(G.vs), +101 disable=not progress, leave=False) as pbar: +102 for cc in sorted(G.clusters(), key=len, reverse=True): +103 # Make a subgraph for this connected component +104 SG = G.subgraph(cc) +105 cc = np.array(cc) +106 +107 # Find root within subgraph +108 if root in cc: +109 this_root = np.where(cc == root)[0][0] +110 else: +111 this_root = 0 +112 +113 # Get the sparse adjacency matrix of the subgraph +114 sp = SG.get_adjacency_sparse('weight') +115 +116 # Get lengths of paths to all nodes from root +117 paths = SG.shortest_paths(this_root, target=None, weights='weight', +118 mode='ALL')[0] +119 paths = np.array(paths) +120 +121 # Prep array for invalidation +122 valid = ~np.zeros(paths.shape).astype(bool) +123 invalidated = 0 +124 +125 while np.any(valid): +126 # Find the farthest point +127 farthest = np.argmax(paths) +128 +129 # Get path from root to farthest point +130 path = SG.get_shortest_paths(this_root, farthest, +131 weights='weight', mode='ALL')[0] +132 +133 # Get IDs of edges along the path +134 eids = SG.get_eids(path=path, directed=False) +135 +136 # Stop if farthest point is closer than min_length +137 add = True +138 if min_length: +139 # This should only be distance to the first branchpoint +140 # from the tip since we set other weights to zero +141 le = sum(SG.es[eids].get_attribute_values('weight')) +142 if le < min_length: +143 add = False +144 +145 if add: +146 # Add these new edges +147 new_edges = np.vstack((cc[path[:-1]], cc[path[1:]])).T +148 edges = np.append(edges, new_edges).reshape(-1, 2) +149 +150 # Invalidate points in the path +151 valid[path] = False +152 paths[path] = 0 +153 +154 # Must set weights along path to 0 so that this path is +155 # taken again in future iterations +156 SG.es[eids]['weight'] = 0 +157 +158 # Get all nodes within `inv_dist` to this path +159 # Note: can we somehow only include still valid nodes to speed +160 # things up? +161 dist, _, sources = dijkstra(sp, directed=False, indices=path, +162 limit=inv_dist, min_only=True, +163 return_predecessors=True) +164 +165 # Invalidate +166 in_dist = dist <= inv_dist +167 to_invalidate = np.where(in_dist)[0] +168 valid[to_invalidate] = False +169 paths[to_invalidate] = 0 +170 +171 # Update mesh vertex to skeleton node map +172 mesh_map[cc[in_dist]] = cc[sources[in_dist]] +173 +174 pbar.update((~valid).sum() - invalidated) +175 invalidated = (~valid).sum() +176 +177 # Make unique edges (paths will have overlapped!) +178 edges = unique(edges, axis=0) +179 +180 # Create a directed acyclic and hierarchical graph +181 G_nx = edges_to_graph(edges=edges[:, [1, 0]], +182 fix_tree=True, fix_edges=False, +183 weight=False) +184 +185 # Generate the SWC table +186 swc, new_ids = make_swc(G_nx, coords=mesh.vertices, reindex=True) +187 +188 # Update vertex to node ID map +189 mesh_map = np.array([new_ids.get(n, -1) for n in mesh_map]) +190 +191 return Skeleton(swc=swc, mesh=mesh, mesh_map=mesh_map, method='teasar') +
Skeletonize a mesh mesh using the TEASAR algorithm [1].
@@ -435,156 +436,149 @@References
(n.d.). TEASAR: tree-structure extraction algorithm for accurate and robust skeletons. In Proceedings the Eighth Pacific Conference on Computer Graphics and Applications. IEEE Comput. Soc. - https://doi.org/10.1109/pccga.2000.883951 + https://doi.org/10.1109/pccga.2000.88395139def by_wavefront(mesh, + 40 waves=1, + 41 origins=None, + 42 step_size=1, + 43 radius_agg='mean', + 44 progress=True): + 45 """Skeletonize a mesh using wave fronts. + 46 + 47 The algorithm tries to find rings of vertices and collapse them to + 48 their center. This is done by propagating a wave across the mesh starting at + 49 a single seed vertex. As the wave travels across the mesh we keep track of + 50 which vertices are are encountered at each step. Groups of connected + 51 vertices that are "hit" by the wave at the same time are considered rings + 52 and subsequently collapsed. By its nature this works best with tubular meshes. + 53 + 54 Parameters + 55 ---------- + 56 mesh : mesh obj + 57 The mesh to be skeletonize. Can an object that has + 58 ``.vertices`` and ``.faces`` properties (e.g. a + 59 trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a + 60 dictionary ``{'vertices': vertices, 'faces': faces}``. + 61 waves : int + 62 Number of waves to run across the mesh. Each wave is + 63 initialized at a different vertex which produces slightly + 64 different rings. The final skeleton is produced from a mean + 65 across all waves. More waves produce higher resolution + 66 skeletons but also introduce more noise. + 67 origins : int | list of ints, optional + 68 Vertex ID(s) where the wave(s) are initialized. If we run + 69 out of origins (either because less `origins` than `waves` + 70 or because no origin for one of the connected components) + 71 will fall back to semi-random origin. + 72 step_size : int + 73 Values greater 1 effectively lead to binning of rings. For + 74 example a stepsize of 2 means that two adjacent vertex rings + 75 will be collapsed to the same center. This can help reduce + 76 noise in the skeleton (and as such counteracts a large + 77 number of waves). + 78 radius_agg : "mean" | "median" | "max" | "min" | "percentile75" | "percentile25" + 79 Function used to aggregate radii over sample (i.e. the + 80 vertices forming a ring that we collapse to its center). + 81 progress : bool + 82 If True, will show progress bar. + 83 + 84 Returns + 85 ------- + 86 skeletor.Skeleton + 87 Holds results of the skeletonization and enables quick + 88 visualization. + 89 + 90 """ + 91 agg_map = {'mean': np.mean, 'max': np.max, 'min': np.min, + 92 'median': np.median, + 93 'percentile75': lambda x: np.percentile(x, 75), + 94 'percentile25': lambda x: np.percentile(x, 25)} + 95 assert radius_agg in agg_map, f'Unknown `radius_agg`: "{radius_agg}"' + 96 rad_agg_func = agg_map[radius_agg] + 97 + 98 mesh = make_trimesh(mesh, validate=False) + 99 +100 centers_final, radii_final, G = _cast_waves(mesh, waves=waves, +101 origins=origins, +102 step_size=step_size, +103 rad_agg_func=rad_agg_func, +104 progress=progress) +105 +106 # Collapse vertices into nodes +107 (node_centers, +108 vertex_to_node_map) = np.unique(centers_final, +109 return_inverse=True, axis=0) +110 +111 # Map radii for individual vertices to the collapsed nodes +112 # Using pandas is the fastest way here +113 node_radii = pd.DataFrame() +114 node_radii['node_id'] = vertex_to_node_map +115 node_radii['radius'] = radii_final +116 node_radii = node_radii.groupby('node_id').radius.apply(rad_agg_func).values +117 +118 # Contract vertices +119 G.contract_vertices(vertex_to_node_map) +120 +121 # Remove self loops and duplicate edges +122 G = G.simplify() +123 +124 # Generate hierarchical tree +125 el = np.array(G.get_edgelist()) +126 +127 if PRESERVE_BACKBONE: +128 # Use the minimum radius between vertices in an edge +129 weights_rad = np.vstack((node_radii[el[:, 0]], +130 node_radii[el[:, 1]])).mean(axis=0) +131 +132 # For each node generate a vector based on its immediate neighbors +133 vect, alpha = dotprops(node_centers) +134 weights_alpha = np.vstack((alpha[el[:, 0]], +135 alpha[el[:, 1]])).mean(axis=0) +136 +137 # Combine both which means we are most likely to cut at small branches +138 # outside of the backbone +139 weights = weights_rad * weights_alpha +140 +141 # MST doesn't like 0 for weights +142 weights[weights <= 0] = weights[weights > 0].min() / 2 +143 +144 else: +145 weights = np.linalg.norm(node_centers[el[:, 0]] - node_centers[el[:, 1]], axis=1) +146 tree = G.spanning_tree(weights=1 / weights) +147 +148 # Create a directed acyclic and hierarchical graph +149 G_nx = edges_to_graph(edges=np.array(tree.get_edgelist()), +150 nodes=np.arange(0, len(G.vs)), +151 fix_tree=True, # this makes sure graph is oriented +152 drop_disconnected=False) +153 +154 # Generate the SWC table +155 swc = make_swc(G_nx, coords=node_centers, reindex=False, validate=True) +156 swc['radius'] = node_radii[swc.node_id.values] +157 _, new_ids = reindex_swc(swc, inplace=True) +158 +159 # Update vertex to node ID map +160 vertex_to_node_map = np.array([new_ids[n] for n in vertex_to_node_map]) +161 +162 return Skeleton(swc=swc, mesh=mesh, mesh_map=vertex_to_node_map, +163 method='wavefront') +
View Source
-def by_wavefront(mesh, - waves=1, - origins=None, - step_size=1, - radius_agg='mean', - progress=True): - """Skeletonize a mesh using wave fronts. - - The algorithm tries to find rings of vertices and collapse them to - their center. This is done by propagating a wave across the mesh starting at - a single seed vertex. As the wave travels across the mesh we keep track of - which vertices are are encountered at each step. Groups of connected - vertices that are "hit" by the wave at the same time are considered rings - and subsequently collapsed. By its nature this works best with tubular meshes. - - Parameters - ---------- - mesh : mesh obj - The mesh to be skeletonize. Can an object that has - ``.vertices`` and ``.faces`` properties (e.g. a - trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a - dictionary ``{'vertices': vertices, 'faces': faces}``. - waves : int - Number of waves to run across the mesh. Each wave is - initialized at a different vertex which produces slightly - different rings. The final skeleton is produced from a mean - across all waves. More waves produce higher resolution - skeletons but also introduce more noise. - origins : int | list of ints, optional - Vertex ID(s) where the wave(s) are initialized. If we run - out of origins (either because less `origins` than `waves` - or because no origin for one of the connected components) - will fall back to semi-random origin. - step_size : int - Values greater 1 effectively lead to binning of rings. For - example a stepsize of 2 means that two adjacent vertex rings - will be collapsed to the same center. This can help reduce - noise in the skeleton (and as such counteracts a large - number of waves). - radius_agg : "mean" | "median" | "max" | "min" | "percentile75" | "percentile25" - Function used to aggregate radii over sample (i.e. the - vertices forming a ring that we collapse to its center). - progress : bool - If True, will show progress bar. - - Returns - ------- - skeletor.Skeleton - Holds results of the skeletonization and enables quick - visualization. - - """ - agg_map = {'mean': np.mean, 'max': np.max, 'min': np.min, - 'median': np.median, - 'percentile75': lambda x: np.percentile(x, 75), - 'percentile25': lambda x: np.percentile(x, 25)} - assert radius_agg in agg_map, f'Unknown `radius_agg`: "{radius_agg}"' - rad_agg_func = agg_map[radius_agg] - - mesh = make_trimesh(mesh, validate=False) - - centers_final, radii_final, G = _cast_waves(mesh, waves=waves, - origins=origins, - step_size=step_size, - rad_agg_func=rad_agg_func, - progress=progress) - - # Collapse vertices into nodes - (node_centers, - vertex_to_node_map) = np.unique(centers_final, - return_inverse=True, axis=0) - - # Map radii for individual vertices to the collapsed nodes - # Using pandas is the fastest way here - node_radii = pd.DataFrame() - node_radii['node_id'] = vertex_to_node_map - node_radii['radius'] = radii_final - node_radii = node_radii.groupby('node_id').radius.apply(rad_agg_func).values - - # Contract vertices - G.contract_vertices(vertex_to_node_map) - - # Remove self loops and duplicate edges - G = G.simplify() - - # Generate hierarchical tree - el = np.array(G.get_edgelist()) - - if PRESERVE_BACKBONE: - # Use the minimum radius between vertices in an edge - weights_rad = np.vstack((node_radii[el[:, 0]], - node_radii[el[:, 1]])).mean(axis=0) - - # For each node generate a vector based on its immediate neighbors - vect, alpha = dotprops(node_centers) - weights_alpha = np.vstack((alpha[el[:, 0]], - alpha[el[:, 1]])).mean(axis=0) - - # Combine both which means we are most likely to cut at small branches - # outside of the backbone - weights = weights_rad * weights_alpha - - # MST doesn't like 0 for weights - weights[weights <= 0] = weights[weights > 0].min() / 2 - - else: - weights = np.linalg.norm(node_centers[el[:, 0]] - node_centers[el[:, 1]], axis=1) - tree = G.spanning_tree(weights=1 / weights) - - # Create a directed acyclic and hierarchical graph - G_nx = edges_to_graph(edges=np.array(tree.get_edgelist()), - nodes=np.arange(0, len(G.vs)), - fix_tree=True, # this makes sure graph is oriented - drop_disconnected=False) - - # Generate the SWC table - swc = make_swc(G_nx, coords=node_centers, reindex=False, validate=True) - swc['radius'] = node_radii[swc.node_id.values] - _, new_ids = reindex_swc(swc, inplace=True) - - # Update vertex to node ID map - vertex_to_node_map = np.array([new_ids[n] for n in vertex_to_node_map]) - - return Skeleton(swc=swc, mesh=mesh, mesh_map=vertex_to_node_map, - method='wavefront') -
Skeletonize a mesh using wave fronts.
@@ -638,174 +632,174 @@Returns
40def by_vertex_clusters(mesh, sampling_dist, cluster_pos='median', progress=True): + 41 """Skeletonize a (contracted) mesh by clustering vertices. + 42 + 43 The algorithm traverses the mesh graph and groups vertices together that + 44 are within a given distance to each other. This uses the geodesic + 45 (along-the-mesh) distance, not simply the Eucledian distance. Subsequently + 46 these groups of vertices are collapsed and re-connected respecting the + 47 topology of the input mesh. + 48 + 49 The graph traversal is fast and scales well, so this method is well suited + 50 for meshes with lots of vertices. On the downside: this implementation is + 51 not very clever and you might have to play around with the parameters + 52 (mostly ``sampling_dist``) to get decent results. + 53 + 54 Parameters + 55 ---------- + 56 mesh : mesh obj + 57 The mesh to be skeletonize. Can an object that has + 58 ``.vertices`` and ``.faces`` properties (e.g. a + 59 trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a + 60 dictionary ``{'vertices': vertices, 'faces': faces}``. + 61 sampling_dist : float | int + 62 Maximal distance at which vertices are clustered. This + 63 parameter should be tuned based on the resolution of your + 64 mesh (see Examples). + 65 cluster_pos : "median" | "center" + 66 How to determine the x/y/z coordinates of the collapsed + 67 vertex clusters (i.e. the skeleton's nodes):: + 68 + 69 - "median": Use the vertex closest to cluster's center of + 70 mass. + 71 - "center": Use the center of mass. This makes for smoother + 72 skeletons but can lead to nodes outside the mesh. + 73 progress : bool + 74 If True, will show progress bar. + 75 + 76 Examples + 77 -------- + 78 >>> import skeletor as sk + 79 >>> mesh = sk.example_mesh() + 80 >>> cont = sk.pre.contract(mesh, epsilon=0.1) + 81 >>> skel = sk.skeletonize.vertex_cluster(cont) + 82 >>> skel.mesh = mesh + 83 + 84 Returns + 85 ------- + 86 skeletor.Skeleton + 87 Holds results of the skeletonization and enables quick + 88 visualization. + 89 + 90 """ + 91 assert cluster_pos in ['center', 'median'] + 92 + 93 mesh = make_trimesh(mesh, validate=False) + 94 + 95 # Produce weighted edges + 96 edges = np.concatenate((mesh.edges_unique, + 97 mesh.edges_unique_length.reshape(mesh.edges_unique.shape[0], 1)), + 98 axis=1) + 99 +100 # Generate Graph (must be undirected) +101 G = nx.Graph() +102 G.add_weighted_edges_from(edges) +103 +104 # Run the graph traversal that groups vertices into spatial clusters +105 not_visited = set(G.nodes) +106 seen = set() +107 clusters = [] +108 to_visit = len(not_visited) +109 with tqdm(desc='Clustering', total=len(not_visited), disable=progress is False) as pbar: +110 while not_visited: +111 # Pick a random node +112 start = not_visited.pop() +113 # Get all nodes in the geodesic vicinity +114 cl, seen = dfs(G, n=start, dist_traveled=0, +115 max_dist=sampling_dist, seen=seen) +116 cl = set(cl) +117 +118 # Append this cluster and track visited/not-visited nodes +119 clusters.append(cl) +120 not_visited = not_visited - cl +121 +122 # Update progress bar +123 pbar.update(to_visit - len(not_visited)) +124 to_visit = len(not_visited) +125 +126 # `clusters` is a list of sets -> let's turn it into list of arrays +127 clusters = [np.array(list(c)).astype(int) for c in clusters] +128 +129 # Get positions of clusters +130 if cluster_pos == 'center': +131 # Get the center of each cluster +132 cl_coords = np.array([np.mean(mesh.vertices[c], axis=0) for c in clusters]) +133 elif cluster_pos == 'median': +134 # Get the node that's closest to to the clusters center +135 cl_coords = [] +136 for c in clusters: +137 cnt = np.mean(mesh.vertices[c], axis=0) +138 cnt_dist = np.sum(np.fabs(mesh.vertices[c] - cnt), axis=1) +139 median = mesh.vertices[c][np.argmin(cnt_dist)] +140 cl_coords.append(median) +141 cl_coords = np.array(cl_coords) +142 +143 # Generate edges +144 cl_edges = np.array(mesh.edges_unique) +145 if fastremap: +146 mapping = {n: i for i, l in enumerate(clusters) for n in l} +147 cl_edges = fastremap.remap(cl_edges, mapping, preserve_missing_labels=False, in_place=True) +148 else: +149 for i, c in enumerate(clusters): +150 cl_edges[np.isin(cl_edges, c)] = i +151 +152 # Remove directionality from cluster edges +153 cl_edges = np.sort(cl_edges, axis=1) +154 +155 # Get unique edges +156 cl_edges = np.unique(cl_edges, axis=0) +157 +158 # Calculate edge lengths +159 co1 = cl_coords[cl_edges[:, 0]] +160 co2 = cl_coords[cl_edges[:, 1]] +161 cl_edge_lengths = np.sqrt(np.sum((co1 - co2)**2, axis=1)) +162 +163 # Produce adjacency matrix from edges and edge lengths +164 n_clusters = len(clusters) +165 adj = scipy.sparse.coo_matrix((cl_edge_lengths, +166 (cl_edges[:, 0], cl_edges[:, 1])), +167 shape=(n_clusters, n_clusters)) +168 +169 # The cluster graph likely still contain cycles, let's get rid of them using +170 # a minimum spanning tree +171 mst = scipy.sparse.csgraph.minimum_spanning_tree(adj, +172 overwrite=True) +173 +174 # Turn into COO matrix +175 coo = mst.tocoo() +176 +177 # Extract edge list +178 edges = np.array([coo.row, coo.col]).T +179 +180 # Produce final graph - this also takes care of some fixing +181 G = edges_to_graph(edges, nodes=np.unique(cl_edges.flatten()), +182 drop_disconnected=False, fix_tree=True) +183 +184 # Generate a mesh vertex -> skeleton vertex map +185 # Note that nodes are labeled by index of the cluster +186 vertex_to_node_map = [i for i, cl in enumerate(clusters) for n in cl] +187 +188 # Generate SWC +189 swc, new_ids = make_swc(G, cl_coords, reindex=True, validate=False) +190 +191 # Update mesh map +192 vertex_to_node_map = np.array([new_ids[n] for n in vertex_to_node_map]) +193 +194 return Skeleton(swc=swc, mesh=mesh, mesh_map=vertex_to_node_map, +195 method='vertex_clusters') +
View Source
-def by_vertex_clusters(mesh, sampling_dist, cluster_pos='median', progress=True): - """Skeletonize a (contracted) mesh by clustering vertices. - - The algorithm traverses the mesh graph and groups vertices together that - are within a given distance to each other. This uses the geodesic - (along-the-mesh) distance, not simply the Eucledian distance. Subsequently - these groups of vertices are collapsed and re-connected respecting the - topology of the input mesh. - - The graph traversal is fast and scales well, so this method is well suited - for meshes with lots of vertices. On the downside: this implementation is - not very clever and you might have to play around with the parameters - (mostly ``sampling_dist``) to get decent results. - - Parameters - ---------- - mesh : mesh obj - The mesh to be skeletonize. Can an object that has - ``.vertices`` and ``.faces`` properties (e.g. a - trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a - dictionary ``{'vertices': vertices, 'faces': faces}``. - sampling_dist : float | int - Maximal distance at which vertices are clustered. This - parameter should be tuned based on the resolution of your - mesh (see Examples). - cluster_pos : "median" | "center" - How to determine the x/y/z coordinates of the collapsed - vertex clusters (i.e. the skeleton's nodes):: - - - "median": Use the vertex closest to cluster's center of - mass. - - "center": Use the center of mass. This makes for smoother - skeletons but can lead to nodes outside the mesh. - progress : bool - If True, will show progress bar. - - Examples - -------- - >>> import skeletor as sk - >>> mesh = sk.example_mesh() - >>> cont = sk.pre.contract(mesh, epsilon=0.1) - >>> skel = sk.skeletonize.vertex_cluster(cont) - >>> skel.mesh = mesh - - Returns - ------- - skeletor.Skeleton - Holds results of the skeletonization and enables quick - visualization. - - """ - assert cluster_pos in ['center', 'median'] - - mesh = make_trimesh(mesh, validate=False) - - # Produce weighted edges - edges = np.concatenate((mesh.edges_unique, - mesh.edges_unique_length.reshape(mesh.edges_unique.shape[0], 1)), - axis=1) - - # Generate Graph (must be undirected) - G = nx.Graph() - G.add_weighted_edges_from(edges) - - # Run the graph traversal that groups vertices into spatial clusters - not_visited = set(G.nodes) - seen = set() - clusters = [] - to_visit = len(not_visited) - with tqdm(desc='Clustering', total=len(not_visited), disable=progress is False) as pbar: - while not_visited: - # Pick a random node - start = not_visited.pop() - # Get all nodes in the geodesic vicinity - cl, seen = dfs(G, n=start, dist_traveled=0, - max_dist=sampling_dist, seen=seen) - cl = set(cl) - - # Append this cluster and track visited/not-visited nodes - clusters.append(cl) - not_visited = not_visited - cl - - # Update progress bar - pbar.update(to_visit - len(not_visited)) - to_visit = len(not_visited) - - # `clusters` is a list of sets -> let's turn it into list of arrays - clusters = [np.array(list(c)).astype(int) for c in clusters] - - # Get positions of clusters - if cluster_pos == 'center': - # Get the center of each cluster - cl_coords = np.array([np.mean(mesh.vertices[c], axis=0) for c in clusters]) - elif cluster_pos == 'median': - # Get the node that's closest to to the clusters center - cl_coords = [] - for c in clusters: - cnt = np.mean(mesh.vertices[c], axis=0) - cnt_dist = np.sum(np.fabs(mesh.vertices[c] - cnt), axis=1) - median = mesh.vertices[c][np.argmin(cnt_dist)] - cl_coords.append(median) - cl_coords = np.array(cl_coords) - - # Generate edges - cl_edges = np.array(mesh.edges_unique) - if fastremap: - mapping = {n: i for i, l in enumerate(clusters) for n in l} - cl_edges = fastremap.remap(cl_edges, mapping, preserve_missing_labels=False, in_place=True) - else: - for i, c in enumerate(clusters): - cl_edges[np.isin(cl_edges, c)] = i - - # Remove directionality from cluster edges - cl_edges = np.sort(cl_edges, axis=1) - - # Get unique edges - cl_edges = np.unique(cl_edges, axis=0) - - # Calculate edge lengths - co1 = cl_coords[cl_edges[:, 0]] - co2 = cl_coords[cl_edges[:, 1]] - cl_edge_lengths = np.sqrt(np.sum((co1 - co2)**2, axis=1)) - - # Produce adjacency matrix from edges and edge lengths - n_clusters = len(clusters) - adj = scipy.sparse.coo_matrix((cl_edge_lengths, - (cl_edges[:, 0], cl_edges[:, 1])), - shape=(n_clusters, n_clusters)) - - # The cluster graph likely still contain cycles, let's get rid of them using - # a minimum spanning tree - mst = scipy.sparse.csgraph.minimum_spanning_tree(adj, - overwrite=True) - - # Turn into COO matrix - coo = mst.tocoo() - - # Extract edge list - edges = np.array([coo.row, coo.col]).T - - # Produce final graph - this also takes care of some fixing - G = edges_to_graph(edges, nodes=np.unique(cl_edges.flatten()), - drop_disconnected=False, fix_tree=True) - - # Generate a mesh vertex -> skeleton vertex map - # Note that nodes are labeled by index of the cluster - vertex_to_node_map = [i for i, cl in enumerate(clusters) for n in cl] - - # Generate SWC - swc, new_ids = make_swc(G, cl_coords, reindex=True, validate=False) - - # Update mesh map - vertex_to_node_map = np.array([new_ids[n] for n in vertex_to_node_map]) - - return Skeleton(swc=swc, mesh=mesh, mesh_map=vertex_to_node_map, - method='vertex_clusters') -
Skeletonize a (contracted) mesh by clustering vertices.
@@ -866,341 +860,341 @@Returns
38def by_edge_collapse(mesh, shape_weight=1, sample_weight=0.1, progress=True): + 39 """Skeletonize a (contracted) mesh by iteratively collapsing edges. + 40 + 41 This algorithm (described in [1]) iteratively collapses edges that are part + 42 of a face until no more faces are left. Edges are chosen based on a cost + 43 function that penalizes collapses that would change the shape of the object + 44 or would introduce long edges. + 45 + 46 This is somewhat sensitive to the dimensions of the input mesh: too large + 47 and you might experience slow-downs or numpy OverflowErrors; too low and + 48 you might get skeletons that don't quite match the mesh (e.g. too few nodes). + 49 If you experience either, try down- or up-scaling your mesh, respectively. + 50 + 51 Parameters + 52 ---------- + 53 mesh : mesh obj + 54 The mesh to be skeletonize. Can an object that has + 55 ``.vertices`` and ``.faces`` properties (e.g. a + 56 trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a + 57 dictionary ``{'vertices': vertices, 'faces': faces}``. + 58 shape_weight : float, optional + 59 Weight for shape costs which penalize collapsing edges that + 60 would drastically change the shape of the object. + 61 sample_weight : float, optional + 62 Weight for sampling costs which penalize collapses that + 63 would generate prohibitively long edges. + 64 progress : bool + 65 If True, will show progress bar. + 66 + 67 Returns + 68 ------- + 69 skeletor.Skeleton + 70 Holds results of the skeletonization and enables quick + 71 visualization. + 72 + 73 References + 74 ---------- + 75 [1] Au OK, Tai CL, Chu HK, Cohen-Or D, Lee TY. Skeleton extraction by mesh + 76 contraction. ACM Transactions on Graphics (TOG). 2008 Aug 1;27(3):44. + 77 + 78 """ + 79 mesh = make_trimesh(mesh, validate=False) + 80 + 81 # Shorthand faces and edges + 82 # We convert to arrays to (a) make a copy and (b) remove potential overhead + 83 # from these originally being trimesh TrackedArrays + 84 edges = np.array(mesh.edges_unique) + 85 verts = np.array(mesh.vertices) + 86 + 87 # For cost calculations we will normalise coordinates + 88 # This prevents getting ridiculuously large cost values ?e300 + 89 # verts = (verts - verts.min()) / (verts.max() - verts.min()) + 90 edge_lengths = np.sqrt(np.sum((verts[edges[:, 0]] - verts[edges[:, 1]])**2, axis=1)) + 91 + 92 # Get a list of faces: [(edge1, edge2, edge3), ...] + 93 face_edges = np.array(mesh.faces_unique_edges) + 94 # Make sure these faces are unique, i.e. no [(e1, e2, e3), (e3, e2, e1)] + 95 face_edges = np.unique(np.sort(face_edges, axis=1), axis=0) + 96 + 97 # Shape cost initialisation: + 98 # Each vertex has a matrix Q which is used to determine the shape cost + 99 # of collapsing each node. We need to generate a matrix (Q) for each +100 # vertex, then when we collapse two nodes, we can update using +101 # Qj <- Qi + Qj, so the edges previously associated with vertex i +102 # are now associated with vertex j. +103 +104 # For each edge, generate a matrix (K). K is made up of two sets of +105 # coordinates in 3D space, a and b. a is the normalised edge vector +106 # of edge(i,j) and b = a * <x/y/z coordinates of vertex i> +107 # +108 # The matrix K takes the form: +109 # +110 # Kij = 0, -az, ay, -bx +111 # az, 0, -ax, -by +112 # -ay, ax, 0, -bz +113 +114 edge_co0, edge_co1 = verts[edges[:, 0]], verts[edges[:, 1]] +115 a = (edge_co1 - edge_co0) / edge_lengths.reshape(edges.shape[0], 1) +116 # Note: It's a bit unclear to me whether the normalised edge vector should +117 # be allowed to have negative values but I seem to be getting better +118 # results if I use absolute values +119 a = np.fabs(a) +120 b = a * edge_co0 +121 +122 # Bunch of zeros +123 zero = np.zeros(a.shape[0]) +124 +125 # Generate matrix K +126 K = [[zero, -a[:, 2], a[:, 1], -b[:, 0]], +127 [a[:, 2], zero, -a[:, 0], -b[:, 1]], +128 [-a[:, 1], a[:, 0], zero, -b[:, 2]]] +129 K = np.array(K) +130 +131 # Q for vertex i is then the sum of the products of (kT,k) for ALL edges +132 # connected to vertex i: +133 # Initialize matrix of correct shape +134 Q_array = np.zeros((4, 4, verts.shape[0]), dtype=np.float64) +135 +136 # Generate (kT, K) +137 kT = np.transpose(K, axes=(1, 0, 2)) +138 +139 # To get the sum of the products in the correct format we have to +140 # do some annoying transposes to get to (4, 4, len(edges)) +141 K_dot = np.matmul(K.T, kT.T).T +142 +143 # Iterate over all vertices +144 for v in range(len(verts)): +145 # Find edges that contain this vertex +146 cond1 = edges[:, 0] == v +147 cond2 = edges[:, 1] == v +148 # Note that this does not take directionality of edges into account +149 # Not sure if that's intended? +150 +151 # Get indices of these edges +152 indices = np.where(cond1 | cond2)[0] +153 +154 # Get the products for all edges adjacent to mesh +155 Q = K_dot[:, :, indices] +156 # Sum over all edges +157 Q = Q.sum(axis=2) +158 # Add to Q array +159 Q_array[:, :, v] = Q +160 +161 # Not sure if we are doing something wrong when calculating the Q array but +162 # we end up having negative values which translate into negative scores. +163 # This in turn is bad because we propagate that negative score when +164 # collapsing edges which leads to a "zipper-effect" where nodes collapse +165 # in sequence a->b->c->d until they hit some node with really high cost +166 # Q_array -= Q_array.min() +167 +168 # Edge collapse: +169 # Determining which edge to collapse is a weighted sum of the shape and +170 # sampling cost. The shape cost of vertex i is Fa(p) = pT Qi p where p is +171 # the coordinates of point p (vertex i here) in homogeneous representation. +172 # The variable w from above is the value for the homogeneous 4th dimension. +173 # T denotes transpose of matrix. +174 # The shape cost of collapsing the edge Fa(i,j) = Fi(vj) + Fj(vj). +175 # vi and vj being the coordinates of the vertex in homogeneous representation +176 # (p in equation before) +177 # The sampling cost penalises edge collapses that generate overly long edges, +178 # based on the distance traveled by all edges to vi, when vi is merged with +179 # vj. (Eq. 7 in paper) +180 # You cannot collapse an edge (i -> j) if k is a common adjacent vertex of +181 # both i and j, but (i/j/k) is not a face. +182 # We will set the cost of these edges to infinity. +183 +184 # Now work out the shape cost of collapsing each node (eq. 7) +185 # First get coordinates of the first node of each edge +186 # Note that in Nik's implementation this was the second node +187 p = verts[edges[:, 0]] +188 +189 # Append weight factor +190 w = 1 +191 p = np.append(p, np.full((p.shape[0], 1), w), axis=1) +192 +193 this_Q1 = Q_array[:, :, edges[:, 0]] +194 this_Q2 = Q_array[:, :, edges[:, 1]] +195 +196 F1 = np.einsum('ij,kji->ij', p, this_Q1)[:, [0, 1]] +197 F2 = np.einsum('ij,kji->ij', p, this_Q2)[:, [0, 1]] +198 +199 # Calculate and append shape cost +200 F = np.append(F1, F2, axis=1) +201 shape_cost = np.sum(F, axis=1) +202 +203 # Sum lengths of all edges associated with a given vertex +204 # This is easiest by generating a sparse matrix from the edges +205 # and then summing by row +206 adj = scipy.sparse.coo_matrix((edge_lengths, +207 (edges[:, 0], edges[:, 1])), +208 shape=(verts.shape[0], verts.shape[0])) +209 +210 # This makes sure the matrix is symmetrical, i.e. a->b == a<-b +211 # Note that I'm not sure whether this is strictly necessary but it really +212 # can't hurt +213 adj = adj + adj.T +214 +215 # Get the lengths associated with each vertex +216 verts_lengths = adj.sum(axis=1) +217 +218 # We need to flatten this (something funny with summing sparse matrices) +219 verts_lengths = np.array(verts_lengths).flatten() +220 +221 # Map the sum of vertex lengths onto edges (as per first vertex in edge) +222 ik_edge = verts_lengths[edges[:, 0]] +223 +224 # Calculate sampling cost +225 sample_cost = edge_lengths * (ik_edge - edge_lengths) +226 +227 # Determine which edge to collapse and collapse it +228 # Total Cost - weighted sum of shape and sample cost, equation 8 in paper +229 F_T = shape_cost * shape_weight + sample_cost * sample_weight +230 +231 # Now start collapsing edges one at a time +232 face_count = face_edges.shape[0] # keep track of face counts for progress bar +233 is_collapsed = np.full(edges.shape[0], False) +234 keep = np.full(edges.shape[0], False) +235 with tqdm(desc='Collapsing edges', total=face_count, disable=progress is False) as pbar: +236 while face_edges.size: +237 # Uncomment to get a more-or-less random edge collapse +238 # F_T[:] = 0 +239 +240 # Update progress bar +241 pbar.update(face_count - face_edges.shape[0]) +242 face_count = face_edges.shape[0] +243 +244 # This has to come at the beginning of the loop +245 # Set cost of collapsing edges without faces to infinite +246 F_T[keep] = np.inf +247 F_T[is_collapsed] = np.inf +248 +249 # Get the edge that we want to collapse +250 collapse_ix = np.argmin(F_T) +251 # Get the vertices this edge connects +252 u, v = edges[collapse_ix] +253 # Get all edges that contain these vertices: +254 # First, edges that are (uv, x) +255 connects_uv = np.isin(edges[:, 0], [u, v]) +256 # Second, check if any (uv, x) edges are (uv, uv) +257 connects_uv[connects_uv] = np.isin(edges[connects_uv, 1], [u, v]) +258 +259 # Remove uu and vv edges +260 uuvv = edges[:, 0] == edges[:, 1] +261 connects_uv = connects_uv & ~uuvv +262 # Get the edge's indices +263 clps_edges = np.where(connects_uv)[0] +264 +265 # Now find find the faces the collapsed edge is part of +266 # Note: splitting this into three conditions is marginally faster than +267 # np.any(np.isin(face_edges, clps_edges), axis=1) +268 uv0 = np.isin(face_edges[:, 0], clps_edges) +269 uv1 = np.isin(face_edges[:, 1], clps_edges) +270 uv2 = np.isin(face_edges[:, 2], clps_edges) +271 has_uv = uv0 | uv1 | uv2 +272 +273 # If these edges do not have adjacent faces anymore +274 if not np.any(has_uv): +275 # Track this edge as a keeper +276 keep[clps_edges] = True +277 continue +278 +279 # Get the collapsed faces [(e1, e2, e3), ...] for this edge +280 clps_faces = face_edges[has_uv] +281 +282 # Remove the collapsed faces +283 face_edges = face_edges[~has_uv] +284 +285 # Track these edges as collapsed +286 is_collapsed[clps_edges] = True +287 +288 # Get the adjacent edges (i.e. non-uv edges) +289 adj_edges = clps_faces[~np.isin(clps_faces, clps_edges)].reshape(clps_faces.shape[0], 2) +290 +291 # We have to do some sorting and finding unique edges to make sure +292 # remapping is done correctly further down +293 # NOTE: Not sure we really need this, so leaving it out for now +294 # adj_edges = np.unique(np.sort(adj_edges, axis=1), axis=0) +295 +296 # We need to keep track of changes to the adjacent faces +297 # Basically each face in (i, j, k) will be reduced to one edge +298 # which points from u -> v +299 # -> replace occurrences of loosing edge with winning edge +300 for win, loose in adj_edges: +301 if fastremap: +302 face_edges = fastremap.remap(face_edges, {loose: win}, +303 preserve_missing_labels=True, +304 in_place=True) +305 else: +306 face_edges[face_edges == loose] = win +307 is_collapsed[loose] = True +308 +309 # Replace occurrences of first node u with second node v +310 if fastremap: +311 edges = fastremap.remap(edges, {u: v}, +312 preserve_missing_labels=True, +313 in_place=True) +314 else: +315 edges[edges == u] = v +316 +317 # Add shape cost of u to shape costs of v +318 Q_array[:, :, v] += Q_array[:, :, u] +319 +320 # Determine which edges require update of costs: +321 # In theory we only need to update costs for edges that are +322 # associated with vertices v and u (which now also v) +323 has_v = (edges[:, 0] == v) | (edges[:, 1] == v) +324 +325 # Uncomment to temporarily force updating costs for all edges +326 # has_v[:] = True +327 +328 # Update shape costs +329 this_Q1 = Q_array[:, :, edges[has_v, 0]] +330 this_Q2 = Q_array[:, :, edges[has_v, 1]] +331 +332 F1 = np.einsum('ij,kji->ij', p[edges[has_v, 0]], this_Q1)[:, [0, 1]] +333 F2 = np.einsum('ij,kji->ij', p[edges[has_v, 1]], this_Q2)[:, [0, 1]] +334 +335 F = np.append(F1, F2, axis=1) +336 new_shape_cost = np.sum(F, axis=1) +337 +338 # Update sum of incoming edge lengths +339 # Technically we would have to recalculate lengths of adjacent edges +340 # every time but we will take the cheap way out and simply add them up +341 verts_lengths[v] += verts_lengths[u] +342 # Update sample costs for edges associated with v +343 ik_edge = verts_lengths[edges[has_v, 0]] +344 new_sample_cost = edge_lengths[has_v] * (ik_edge - edge_lengths[has_v]) +345 +346 F_T[has_v] = new_shape_cost * shape_weight + new_sample_cost * sample_weight +347 +348 # After the edge collapse, the edges are garbled - I have yet to figure out +349 # why and whether that can be prevented. However the vertices in those +350 # edges are correct and so we just need to reconstruct their connectivity +351 # by extracting a minimum spanning tree over the mesh. +352 corrected_edges = mst_over_mesh(mesh, edges[keep].flatten()) +353 +354 # Generate graph +355 G = edges_to_graph(corrected_edges, vertices=mesh.vertices, fix_tree=True, +356 weight=False, drop_disconnected=False) +357 +358 swc, new_ids = make_swc(G, mesh, reindex=True) +359 +360 return Skeleton(swc=swc, mesh=mesh, mesh_map=None, method='edge_collapse') +
View Source
-def by_edge_collapse(mesh, shape_weight=1, sample_weight=0.1, progress=True): - """Skeletonize a (contracted) mesh by iteratively collapsing edges. - - This algorithm (described in [1]) iteratively collapses edges that are part - of a face until no more faces are left. Edges are chosen based on a cost - function that penalizes collapses that would change the shape of the object - or would introduce long edges. - - This is somewhat sensitive to the dimensions of the input mesh: too large - and you might experience slow-downs or numpy OverflowErrors; too low and - you might get skeletons that don't quite match the mesh (e.g. too few nodes). - If you experience either, try down- or up-scaling your mesh, respectively. - - Parameters - ---------- - mesh : mesh obj - The mesh to be skeletonize. Can an object that has - ``.vertices`` and ``.faces`` properties (e.g. a - trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a - dictionary ``{'vertices': vertices, 'faces': faces}``. - shape_weight : float, optional - Weight for shape costs which penalize collapsing edges that - would drastically change the shape of the object. - sample_weight : float, optional - Weight for sampling costs which penalize collapses that - would generate prohibitively long edges. - progress : bool - If True, will show progress bar. - - Returns - ------- - skeletor.Skeleton - Holds results of the skeletonization and enables quick - visualization. - - References - ---------- - [1] 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. - - """ - mesh = make_trimesh(mesh, validate=False) - - # Shorthand faces and edges - # We convert to arrays to (a) make a copy and (b) remove potential overhead - # from these originally being trimesh TrackedArrays - edges = np.array(mesh.edges_unique) - verts = np.array(mesh.vertices) - - # For cost calculations we will normalise coordinates - # This prevents getting ridiculuously large cost values ?e300 - # verts = (verts - verts.min()) / (verts.max() - verts.min()) - edge_lengths = np.sqrt(np.sum((verts[edges[:, 0]] - verts[edges[:, 1]])**2, axis=1)) - - # Get a list of faces: [(edge1, edge2, edge3), ...] - face_edges = np.array(mesh.faces_unique_edges) - # Make sure these faces are unique, i.e. no [(e1, e2, e3), (e3, e2, e1)] - face_edges = np.unique(np.sort(face_edges, axis=1), axis=0) - - # Shape cost initialisation: - # Each vertex has a matrix Q which is used to determine the shape cost - # of collapsing each node. We need to generate a matrix (Q) for each - # vertex, then when we collapse two nodes, we can update using - # Qj <- Qi + Qj, so the edges previously associated with vertex i - # are now associated with vertex j. - - # For each edge, generate a matrix (K). K is made up of two sets of - # coordinates in 3D space, a and b. a is the normalised edge vector - # of edge(i,j) and b = a * <x/y/z coordinates of vertex i> - # - # The matrix K takes the form: - # - # Kij = 0, -az, ay, -bx - # az, 0, -ax, -by - # -ay, ax, 0, -bz - - edge_co0, edge_co1 = verts[edges[:, 0]], verts[edges[:, 1]] - a = (edge_co1 - edge_co0) / edge_lengths.reshape(edges.shape[0], 1) - # Note: It's a bit unclear to me whether the normalised edge vector should - # be allowed to have negative values but I seem to be getting better - # results if I use absolute values - a = np.fabs(a) - b = a * edge_co0 - - # Bunch of zeros - zero = np.zeros(a.shape[0]) - - # Generate matrix K - K = [[zero, -a[:, 2], a[:, 1], -b[:, 0]], - [a[:, 2], zero, -a[:, 0], -b[:, 1]], - [-a[:, 1], a[:, 0], zero, -b[:, 2]]] - K = np.array(K) - - # Q for vertex i is then the sum of the products of (kT,k) for ALL edges - # connected to vertex i: - # Initialize matrix of correct shape - Q_array = np.zeros((4, 4, verts.shape[0]), dtype=np.float64) - - # Generate (kT, K) - kT = np.transpose(K, axes=(1, 0, 2)) - - # To get the sum of the products in the correct format we have to - # do some annoying transposes to get to (4, 4, len(edges)) - K_dot = np.matmul(K.T, kT.T).T - - # Iterate over all vertices - for v in range(len(verts)): - # Find edges that contain this vertex - cond1 = edges[:, 0] == v - cond2 = edges[:, 1] == v - # Note that this does not take directionality of edges into account - # Not sure if that's intended? - - # Get indices of these edges - indices = np.where(cond1 | cond2)[0] - - # Get the products for all edges adjacent to mesh - Q = K_dot[:, :, indices] - # Sum over all edges - Q = Q.sum(axis=2) - # Add to Q array - Q_array[:, :, v] = Q - - # Not sure if we are doing something wrong when calculating the Q array but - # we end up having negative values which translate into negative scores. - # This in turn is bad because we propagate that negative score when - # collapsing edges which leads to a "zipper-effect" where nodes collapse - # in sequence a->b->c->d until they hit some node with really high cost - # Q_array -= Q_array.min() - - # Edge collapse: - # Determining which edge to collapse is a weighted sum of the shape and - # sampling cost. The shape cost of vertex i is Fa(p) = pT Qi p where p is - # the coordinates of point p (vertex i here) in homogeneous representation. - # The variable w from above is the value for the homogeneous 4th dimension. - # T denotes transpose of matrix. - # The shape cost of collapsing the edge Fa(i,j) = Fi(vj) + Fj(vj). - # vi and vj being the coordinates of the vertex in homogeneous representation - # (p in equation before) - # The sampling cost penalises edge collapses that generate overly long edges, - # based on the distance traveled by all edges to vi, when vi is merged with - # vj. (Eq. 7 in paper) - # You cannot collapse an edge (i -> j) if k is a common adjacent vertex of - # both i and j, but (i/j/k) is not a face. - # We will set the cost of these edges to infinity. - - # Now work out the shape cost of collapsing each node (eq. 7) - # First get coordinates of the first node of each edge - # Note that in Nik's implementation this was the second node - p = verts[edges[:, 0]] - - # Append weight factor - w = 1 - p = np.append(p, np.full((p.shape[0], 1), w), axis=1) - - this_Q1 = Q_array[:, :, edges[:, 0]] - this_Q2 = Q_array[:, :, edges[:, 1]] - - F1 = np.einsum('ij,kji->ij', p, this_Q1)[:, [0, 1]] - F2 = np.einsum('ij,kji->ij', p, this_Q2)[:, [0, 1]] - - # Calculate and append shape cost - F = np.append(F1, F2, axis=1) - shape_cost = np.sum(F, axis=1) - - # Sum lengths of all edges associated with a given vertex - # This is easiest by generating a sparse matrix from the edges - # and then summing by row - adj = scipy.sparse.coo_matrix((edge_lengths, - (edges[:, 0], edges[:, 1])), - shape=(verts.shape[0], verts.shape[0])) - - # This makes sure the matrix is symmetrical, i.e. a->b == a<-b - # Note that I'm not sure whether this is strictly necessary but it really - # can't hurt - adj = adj + adj.T - - # Get the lengths associated with each vertex - verts_lengths = adj.sum(axis=1) - - # We need to flatten this (something funny with summing sparse matrices) - verts_lengths = np.array(verts_lengths).flatten() - - # Map the sum of vertex lengths onto edges (as per first vertex in edge) - ik_edge = verts_lengths[edges[:, 0]] - - # Calculate sampling cost - sample_cost = edge_lengths * (ik_edge - edge_lengths) - - # Determine which edge to collapse and collapse it - # Total Cost - weighted sum of shape and sample cost, equation 8 in paper - F_T = shape_cost * shape_weight + sample_cost * sample_weight - - # Now start collapsing edges one at a time - face_count = face_edges.shape[0] # keep track of face counts for progress bar - is_collapsed = np.full(edges.shape[0], False) - keep = np.full(edges.shape[0], False) - with tqdm(desc='Collapsing edges', total=face_count, disable=progress is False) as pbar: - while face_edges.size: - # Uncomment to get a more-or-less random edge collapse - # F_T[:] = 0 - - # Update progress bar - pbar.update(face_count - face_edges.shape[0]) - face_count = face_edges.shape[0] - - # This has to come at the beginning of the loop - # Set cost of collapsing edges without faces to infinite - F_T[keep] = np.inf - F_T[is_collapsed] = np.inf - - # Get the edge that we want to collapse - collapse_ix = np.argmin(F_T) - # Get the vertices this edge connects - u, v = edges[collapse_ix] - # Get all edges that contain these vertices: - # First, edges that are (uv, x) - connects_uv = np.isin(edges[:, 0], [u, v]) - # Second, check if any (uv, x) edges are (uv, uv) - connects_uv[connects_uv] = np.isin(edges[connects_uv, 1], [u, v]) - - # Remove uu and vv edges - uuvv = edges[:, 0] == edges[:, 1] - connects_uv = connects_uv & ~uuvv - # Get the edge's indices - clps_edges = np.where(connects_uv)[0] - - # Now find find the faces the collapsed edge is part of - # Note: splitting this into three conditions is marginally faster than - # np.any(np.isin(face_edges, clps_edges), axis=1) - uv0 = np.isin(face_edges[:, 0], clps_edges) - uv1 = np.isin(face_edges[:, 1], clps_edges) - uv2 = np.isin(face_edges[:, 2], clps_edges) - has_uv = uv0 | uv1 | uv2 - - # If these edges do not have adjacent faces anymore - if not np.any(has_uv): - # Track this edge as a keeper - keep[clps_edges] = True - continue - - # Get the collapsed faces [(e1, e2, e3), ...] for this edge - clps_faces = face_edges[has_uv] - - # Remove the collapsed faces - face_edges = face_edges[~has_uv] - - # Track these edges as collapsed - is_collapsed[clps_edges] = True - - # Get the adjacent edges (i.e. non-uv edges) - adj_edges = clps_faces[~np.isin(clps_faces, clps_edges)].reshape(clps_faces.shape[0], 2) - - # We have to do some sorting and finding unique edges to make sure - # remapping is done correctly further down - # NOTE: Not sure we really need this, so leaving it out for now - # adj_edges = np.unique(np.sort(adj_edges, axis=1), axis=0) - - # We need to keep track of changes to the adjacent faces - # Basically each face in (i, j, k) will be reduced to one edge - # which points from u -> v - # -> replace occurrences of loosing edge with winning edge - for win, loose in adj_edges: - if fastremap: - face_edges = fastremap.remap(face_edges, {loose: win}, - preserve_missing_labels=True, - in_place=True) - else: - face_edges[face_edges == loose] = win - is_collapsed[loose] = True - - # Replace occurrences of first node u with second node v - if fastremap: - edges = fastremap.remap(edges, {u: v}, - preserve_missing_labels=True, - in_place=True) - else: - edges[edges == u] = v - - # Add shape cost of u to shape costs of v - Q_array[:, :, v] += Q_array[:, :, u] - - # Determine which edges require update of costs: - # In theory we only need to update costs for edges that are - # associated with vertices v and u (which now also v) - has_v = (edges[:, 0] == v) | (edges[:, 1] == v) - - # Uncomment to temporarily force updating costs for all edges - # has_v[:] = True - - # Update shape costs - this_Q1 = Q_array[:, :, edges[has_v, 0]] - this_Q2 = Q_array[:, :, edges[has_v, 1]] - - F1 = np.einsum('ij,kji->ij', p[edges[has_v, 0]], this_Q1)[:, [0, 1]] - F2 = np.einsum('ij,kji->ij', p[edges[has_v, 1]], this_Q2)[:, [0, 1]] - - F = np.append(F1, F2, axis=1) - new_shape_cost = np.sum(F, axis=1) - - # Update sum of incoming edge lengths - # Technically we would have to recalculate lengths of adjacent edges - # every time but we will take the cheap way out and simply add them up - verts_lengths[v] += verts_lengths[u] - # Update sample costs for edges associated with v - ik_edge = verts_lengths[edges[has_v, 0]] - new_sample_cost = edge_lengths[has_v] * (ik_edge - edge_lengths[has_v]) - - F_T[has_v] = new_shape_cost * shape_weight + new_sample_cost * sample_weight - - # After the edge collapse, the edges are garbled - I have yet to figure out - # why and whether that can be prevented. However the vertices in those - # edges are correct and so we just need to reconstruct their connectivity - # by extracting a minimum spanning tree over the mesh. - corrected_edges = mst_over_mesh(mesh, edges[keep].flatten()) - - # Generate graph - G = edges_to_graph(corrected_edges, vertices=mesh.vertices, fix_tree=True, - weight=False, drop_disconnected=False) - - swc, new_ids = make_swc(G, mesh, reindex=True) - - return Skeleton(swc=swc, mesh=mesh, mesh_map=None, method='edge_collapse') -
Skeletonize a (contracted) mesh by iteratively collapsing edges.
@@ -1248,175 +1242,175 @@References
View Source
-def by_tangent_ball(mesh): - """Skeletonize a mesh by finding the maximal tangent ball. - - This algorithm casts a ray from every mesh vertex along its inverse normals - (requires `ncollpyde`). It then creates a sphere that is tangent to the - vertex and to where the ray hit the inside of a face on the opposite side. - Next it drops spheres that overlap with another, larger sphere. Modified - from [1]. - - The method works best on smooth meshes and is rather sensitive to errors in - the mesh such as incorrect normals (see `skeletor.pre.fix_mesh`), internal - faces, noisy surface (try smoothing or downsampling) or holes in the mesh. - - Parameters - ---------- - mesh : mesh obj - The mesh to be skeletonize. Can an object that has - ``.vertices`` and ``.faces`` properties (e.g. a - trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a - dictionary ``{'vertices': vertices, 'faces': faces}``. - - Returns - ------- - skeletor.Skeleton - Holds results of the skeletonization and enables quick - visualization. - - Examples - -------- - >>> import skeletor as sk - >>> mesh = sk.example_mesh() - >>> fixed = sk.pre.fix_mesh(mesh, fix_normals=True, remove_disconnected=10) - >>> skel = sk.skeletonize.by_tangent_ball(fixed) - - References - ---------- - [1] Ma, J., Bae, S.W. & Choi, S. 3D medial axis point approximation using - nearest neighbors and the normal field. Vis Comput 28, 7–19 (2012). - https://doi.org/10.1007/s00371-011-0594-7 - - """ - mesh = make_trimesh(mesh, validate=False) - - # Generate the KD tree - tree = scipy.spatial.cKDTree(mesh.vertices) - - dist = tree.query(mesh.vertices, k=2)[0][:, 1] - - centers = np.zeros(mesh.vertices.shape) - radii = np.zeros(mesh.vertices.shape[0]) - - coll = ncollpyde.Volume(mesh.vertices, mesh.faces, validate=False) - sources = mesh.vertices - mesh.vertex_normals * 0.01 - targets = mesh.vertices - mesh.vertex_normals * (dist.max() * 10) - ix, loc, is_backface = coll.intersections(sources, targets) - - # Now we need to invalidate centers - intersects = np.zeros(mesh.vertices.shape[0]).astype(bool) - intersects[ix[is_backface]] = True - centers[ix] = mesh.vertices[ix] + (loc - mesh.vertices[ix]) / 2 - radii[ix] = np.linalg.norm(loc - mesh.vertices[ix], axis=1) / 2 - - # Now we need to post processing - inv = np.zeros(mesh.vertices.shape[0]).astype(bool) - - # Invalidate vertices that didn't intersect - inv[~intersects] = True - - # Now invalidate any ball that is outside the mesh - inv[~coll.contains(centers)] = True - - # Find tangent balls that are fully contained in another tangent ball - # (those are not maximal inscribed) - original_ind = np.arange(mesh.vertices.shape[0]) - while True: - tree2 = scipy.spatial.cKDTree(centers[~inv]) - # For any not-yet-invalidated center find the closest other center - dist, ix = tree2.query(centers[~inv], k=2) - - # Drop self-hits - ix, dist = ix[:, 1], dist[:, 1] - - # In radius - in_radius = dist < radii[~inv] - - # Stop if no more overlapping pairs - if not in_radius.any(): - break - - # Collect radii to determine which of the overlapping ball survives - pair_rad = np.vstack((radii[~inv][in_radius], - radii[~inv][ix[in_radius]])).T - pair_ix = np.vstack((original_ind[~inv][in_radius], - original_ind[~inv][ix[in_radius]])).T - - # Invalidate the loosers - looses = np.argmax(pair_rad, axis=1) - looser_ix = np.unique(pair_ix[np.arange(pair_ix.shape[0]), looses]) - inv[looser_ix] = True - - # Now we need to collapse nodes into the remaining centers - G = ig.Graph(n=mesh.vertices.shape[0], - edges=mesh.edges_unique, - directed=False) - - # Make sure that every connected component has at least one valid target - for cc in G.clusters(): - if not np.isin(cc, original_ind[~inv]).any(): - inv[cc[0]] = False - centers[cc[0]] = mesh.vertices[cc[0]] - - # For each invalidated vertex, find the closest vertex that is still valid - # This works on unweighted edges but should be good enough - way faster - # than a proper path search for sure - pairs = find_closest(G, sources=original_ind[inv], - targets=original_ind[~inv]) - - # Generate a mesh vertex to skeleton node map - mesh_map = original_ind.copy() - mesh_map[pairs[:, 0]] = pairs[:, 1] - - # Renumber the vertices from 0 -> N_vertices - uni, ind, mesh_map = np.unique(mesh_map, return_inverse=True, return_index=True) - - # Make sure centers and radii match the new order - centers = centers[uni] - radii = radii[uni] - - # Contract vertices to nodes according to the mesh - G.contract_vertices(mesh_map, combine_attrs=None) - - # This only drops duplicate and self-loop edges - G = G.simplify() - - # Generate weights between remaining centers - el = np.array(G.get_edgelist()) - weights = np.linalg.norm(centers[el[:, 0]] - centers[el[:, 1]], axis=1) - - # Generate hierarchical tree - tree = G.spanning_tree(weights=weights) - - # Create a directed acyclic and hierarchical graph - G_nx = edges_to_graph(edges=np.array(tree.get_edgelist()), - nodes=np.arange(0, len(G.vs)), - fix_tree=True, - drop_disconnected=False) - - # Generate the SWC table - swc = make_swc(G_nx, coords=centers, reindex=False) - swc['radius'] = radii[swc.node_id.values] - _, new_ids = reindex_swc(swc, inplace=True) - - # Update vertex to node ID map - mesh_map = np.array([new_ids[n] for n in mesh_map]) - - return Skeleton(swc=swc, mesh=mesh, mesh_map=mesh_map, - method='tangent_ball') -
125def by_tangent_ball(mesh): +126 """Skeletonize a mesh by finding the maximal tangent ball. +127 +128 This algorithm casts a ray from every mesh vertex along its inverse normals +129 (requires `ncollpyde`). It then creates a sphere that is tangent to the +130 vertex and to where the ray hit the inside of a face on the opposite side. +131 Next it drops spheres that overlap with another, larger sphere. Modified +132 from [1]. +133 +134 The method works best on smooth meshes and is rather sensitive to errors in +135 the mesh such as incorrect normals (see `skeletor.pre.fix_mesh`), internal +136 faces, noisy surface (try smoothing or downsampling) or holes in the mesh. +137 +138 Parameters +139 ---------- +140 mesh : mesh obj +141 The mesh to be skeletonize. Can an object that has +142 ``.vertices`` and ``.faces`` properties (e.g. a +143 trimesh.Trimesh) or a tuple ``(vertices, faces)`` or a +144 dictionary ``{'vertices': vertices, 'faces': faces}``. +145 +146 Returns +147 ------- +148 skeletor.Skeleton +149 Holds results of the skeletonization and enables quick +150 visualization. +151 +152 Examples +153 -------- +154 >>> import skeletor as sk +155 >>> mesh = sk.example_mesh() +156 >>> fixed = sk.pre.fix_mesh(mesh, fix_normals=True, remove_disconnected=10) +157 >>> skel = sk.skeletonize.by_tangent_ball(fixed) +158 +159 References +160 ---------- +161 [1] Ma, J., Bae, S.W. & Choi, S. 3D medial axis point approximation using +162 nearest neighbors and the normal field. Vis Comput 28, 7–19 (2012). +163 https://doi.org/10.1007/s00371-011-0594-7 +164 +165 """ +166 mesh = make_trimesh(mesh, validate=False) +167 +168 # Generate the KD tree +169 tree = scipy.spatial.cKDTree(mesh.vertices) +170 +171 dist = tree.query(mesh.vertices, k=2)[0][:, 1] +172 +173 centers = np.zeros(mesh.vertices.shape) +174 radii = np.zeros(mesh.vertices.shape[0]) +175 +176 coll = ncollpyde.Volume(mesh.vertices, mesh.faces, validate=False) +177 sources = mesh.vertices - mesh.vertex_normals * 0.01 +178 targets = mesh.vertices - mesh.vertex_normals * (dist.max() * 10) +179 ix, loc, is_backface = coll.intersections(sources, targets) +180 +181 # Now we need to invalidate centers +182 intersects = np.zeros(mesh.vertices.shape[0]).astype(bool) +183 intersects[ix[is_backface]] = True +184 centers[ix] = mesh.vertices[ix] + (loc - mesh.vertices[ix]) / 2 +185 radii[ix] = np.linalg.norm(loc - mesh.vertices[ix], axis=1) / 2 +186 +187 # Now we need to post processing +188 inv = np.zeros(mesh.vertices.shape[0]).astype(bool) +189 +190 # Invalidate vertices that didn't intersect +191 inv[~intersects] = True +192 +193 # Now invalidate any ball that is outside the mesh +194 inv[~coll.contains(centers)] = True +195 +196 # Find tangent balls that are fully contained in another tangent ball +197 # (those are not maximal inscribed) +198 original_ind = np.arange(mesh.vertices.shape[0]) +199 while True: +200 tree2 = scipy.spatial.cKDTree(centers[~inv]) +201 # For any not-yet-invalidated center find the closest other center +202 dist, ix = tree2.query(centers[~inv], k=2) +203 +204 # Drop self-hits +205 ix, dist = ix[:, 1], dist[:, 1] +206 +207 # In radius +208 in_radius = dist < radii[~inv] +209 +210 # Stop if no more overlapping pairs +211 if not in_radius.any(): +212 break +213 +214 # Collect radii to determine which of the overlapping ball survives +215 pair_rad = np.vstack((radii[~inv][in_radius], +216 radii[~inv][ix[in_radius]])).T +217 pair_ix = np.vstack((original_ind[~inv][in_radius], +218 original_ind[~inv][ix[in_radius]])).T +219 +220 # Invalidate the loosers +221 looses = np.argmax(pair_rad, axis=1) +222 looser_ix = np.unique(pair_ix[np.arange(pair_ix.shape[0]), looses]) +223 inv[looser_ix] = True +224 +225 # Now we need to collapse nodes into the remaining centers +226 G = ig.Graph(n=mesh.vertices.shape[0], +227 edges=mesh.edges_unique, +228 directed=False) +229 +230 # Make sure that every connected component has at least one valid target +231 for cc in G.clusters(): +232 if not np.isin(cc, original_ind[~inv]).any(): +233 inv[cc[0]] = False +234 centers[cc[0]] = mesh.vertices[cc[0]] +235 +236 # For each invalidated vertex, find the closest vertex that is still valid +237 # This works on unweighted edges but should be good enough - way faster +238 # than a proper path search for sure +239 pairs = find_closest(G, sources=original_ind[inv], +240 targets=original_ind[~inv]) +241 +242 # Generate a mesh vertex to skeleton node map +243 mesh_map = original_ind.copy() +244 mesh_map[pairs[:, 0]] = pairs[:, 1] +245 +246 # Renumber the vertices from 0 -> N_vertices +247 uni, ind, mesh_map = np.unique(mesh_map, return_inverse=True, return_index=True) +248 +249 # Make sure centers and radii match the new order +250 centers = centers[uni] +251 radii = radii[uni] +252 +253 # Contract vertices to nodes according to the mesh +254 G.contract_vertices(mesh_map, combine_attrs=None) +255 +256 # This only drops duplicate and self-loop edges +257 G = G.simplify() +258 +259 # Generate weights between remaining centers +260 el = np.array(G.get_edgelist()) +261 weights = np.linalg.norm(centers[el[:, 0]] - centers[el[:, 1]], axis=1) +262 +263 # Generate hierarchical tree +264 tree = G.spanning_tree(weights=weights) +265 +266 # Create a directed acyclic and hierarchical graph +267 G_nx = edges_to_graph(edges=np.array(tree.get_edgelist()), +268 nodes=np.arange(0, len(G.vs)), +269 fix_tree=True, +270 drop_disconnected=False) +271 +272 # Generate the SWC table +273 swc = make_swc(G_nx, coords=centers, reindex=False) +274 swc['radius'] = radii[swc.node_id.values] +275 _, new_ids = reindex_swc(swc, inplace=True) +276 +277 # Update vertex to node ID map +278 mesh_map = np.array([new_ids[n] for n in mesh_map]) +279 +280 return Skeleton(swc=swc, mesh=mesh, mesh_map=mesh_map, +281 method='tangent_ball') +
Skeletonize a mesh by finding the maximal tangent ball.
@@ -1459,7 +1453,7 @@References
[1] Ma, J., Bae, S.W. & Choi, S. 3D medial axis point approximation using nearest neighbors and the normal field. Vis Comput 28, 7–19 (2012). - https://doi.org/10.1007/s00371-011-0594-7
+ https://doi.org/10.1007/s00371-011-0594-7