Metadata-Version: 2.4
Name: medialaxis3d
Version: 1.0.3
Summary: Module to perform 3D skeletonization using Medial Axis Transform
Author-email: Giovanni Bocchi <giovanni.bocchi1@unimi.it>
Maintainer-email: Giovanni Bocchi <giovanni.bocchi1@unimi.it>
License-Expression: MIT
Project-URL: Homepage, https://github.com/jb-sharp/medialaxis3d
Project-URL: Bug Reports, https://github.com/jb-sharp/medialaxis3d/issues
Project-URL: Source, https://github.com/jb-sharp/medialaxis3d
Keywords: MAT,skeletonization,3D
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Science/Research
Classifier: Topic :: Scientific/Engineering :: Image Processing
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Operating System :: OS Independent
Requires-Python: >=3.8
Description-Content-Type: text/markdown
Requires-Dist: scipy>=1.15.2
Requires-Dist: numpy>=2.1.3
Requires-Dist: cython>=3.0.11
Provides-Extra: visualization
Requires-Dist: napari>=0.5.6; extra == "visualization"

# medialaxis3d

This package extends the [scikit-image](https://scikit-image.org/) function [medial_axis](https://scikit-image.org/docs/stable/api/skimage.morphology.html#skimage.morphology.medial_axis)
to the 3D case.

## Install

```bash
pip install medialaxis3d
```

### Dependencies
Automatically installed with `pip`:

- `numpy`
- `scipy`
- `cython`

Optional only for visualization

- `napari`

## Documentation 

WIP

## Quickstart

Use it without returning the medial distance.

```Python
>>> import numpy as np
>>> import skimage as ski
>>> import medialaxis3d
>>> import napari

>>> rng = np.random.default_rng(1278)

>>> image = ski.data.binary_blobs(length = 128,
>>>                           blob_size_fraction = 0.2,
>>>                           n_dim = 3,
>>>                           volume_fraction = 0.6,
>>>                           rng = rng)

>>> skeleton = medialaxis3d.medial_axis_3d(image, 
>>>                                        return_distance = False, 
>>>                                        size = 8, 
>>>                                        rng = rng)

>>> viewer = napari.Viewer()
>>> viewer.add_image(image, 
>>>                  rendering = "attenuated_mip", 
>>>                  attenuation = 0.5, 
>>>                  scale = [1, 1, 1])
>>> viewer.add_image(skeleton, 
>>>                  interpolation3d = "nearest", 
>>>                  colormap = "magenta", 
>>>                  scale = [1, 1, 1])
>>> napari.run()
```

<img src="https://raw.githubusercontent.com/jb-sharp/medialaxis3d/main/screenshots/example_nodist1.png" width="32%"/> <img src="https://raw.githubusercontent.com/jb-sharp/medialaxis3d/main/screenshots/example_nodist2.png" width="32%"/> <img src="https://raw.githubusercontent.com/jb-sharp/medialaxis3d/main/screenshots/example_nodist3.png" width="32%"/>

or use it to return the distance as well.

```Python
>>> import numpy as np
>>> import skimage as ski
>>> import medialaxis3d
>>> import napari

>>> rng = np.random.default_rng(1278)
>>> image = ski.data.binary_blobs(length = 128,
                              blob_size_fraction = 0.2,
                              n_dim = 3,
                              volume_fraction = 0.6,
                              rng = rng)

>>> skeleton, distance = medialaxis3d.medial_axis_3d(image, 
>>>                                                  return_distance = True, 
>>>                                                  size = 8, 
>>>                                                  rng = rng)

>>> viewer = napari.Viewer()
>>> viewer.add_image(image, 
>>>                  rendering = "attenuated_mip", 
>>>                  attenuation = 0.5, 
>>>                  scale = [1, 1, 1])
>>> viewer.add_image(skeleton*distance, 
>>>                  interpolation3d = "nearest", 
>>>                  colormap = "turbo", 
>>>                  scale = [1, 1, 1])
>>> napari.run()
```

<img src="https://raw.githubusercontent.com/jb-sharp/medialaxis3d/main/screenshots/example_nodist1.png" width="32%"/> <img src="https://raw.githubusercontent.com/jb-sharp/medialaxis3d/main/screenshots/example_dist2.png" width="32%"/> <img src="https://raw.githubusercontent.com/jb-sharp/medialaxis3d/main/screenshots/example_dist3.png" width="32%"/>
