Source code for ClearMap.ImageProcessing.Filter.StructureElement
# -*- coding: utf-8 -*-
"""
StrutureElement
===============
Routines to generate structure elements for filters.
"""
__author__ = 'Christoph Kirst <christoph.kirst.ck@gmail.com>'
__license__ = 'GPLv3 - GNU General Pulic License v3 (see LICENSE.txt)'
__copyright__ = 'Copyright © 2020 by Christoph Kirst'
__webpage__ = 'http://idisco.info'
__download__ = 'http://www.github.com/ChristophKirst/ClearMap2'
import numpy as np
[docs]def disk(shape = (3,3)):
"""Disk structuring element."""
return sphere(shape = shape) > 0;
[docs]def sphere(shape = (3,3)):
"""Disk structuring element."""
offsets = structure_element_offsets(shape);
mesh = [range(-o[0], o[1]) for o in offsets];
mesh = np.array(np.meshgrid(*mesh, indexing = 'ij'), dtype = float);
add = ((np.array(shape) + 1) % 2) / 2.0;
nrm = np.max(offsets, axis=1);
for d in range(len(add)):
mesh[d] = (mesh[d] + add[d]) / nrm[d];
r = 1 - np.sum(mesh * mesh, axis = 0);
r[r < 0] = 0;
r /= r.sum();
return r;
[docs]def cube(shape = (3,3)):
"""Cube structuring element."""
return np.ones(shape, dtype = bool);
[docs]def structure_element(shape = (3,3), form = 'Disk', ndim = None):
"""Creates specific 2d and 3d structuring elements
Arguments
---------
shape : array or tuple
Shape of the structure element.
form : str
structure element type
Returns:
array
structure element
"""
if isinstance(shape, int) and ndim is not None:
shape = (shape,) * ndim;
if isinstance(shape, tuple):
shape = np.array([shape]).flatten();
if ndim is None:
ndim = len(shape);
else:
shape = np.pad(shape[:ndim], (0, max(0, ndim - len(shape))), 'wrap');
if form in ['Disk', 'disk', 'd']:
return disk(shape = shape);
elif form in ['Sphere', 'shpere', 's']:
return sphere(shape = shape);
elif form in ['Cube', 'cube', 'c', 'Rectangle', 'rectangle', 'r']:
return cube(shape = shape);
else:
ValueError('Form %r for structuring element not valid!' % form);
else:
return shape;
[docs]def structure_element_offsets(shape):
"""Calculates offsets to center for a structural element given its shape.
Arguments
---------
shape : array or tuple
Shape of the structure element
Returns
-------
offsets : array
Offsets to center taking care of even/odd number of elements.
"""
off = np.array([shape], dtype = int).flatten() // 2;
off = np.array([off, shape - off]).T;
return off;
###############################################################################
### Tests
###############################################################################
def _test():
import ClearMap.ImageProcessing.Filter.StructureElement as se
from importlib import reload
reload(se)
d = se.sphere((150,50,10));
import ClearMap.Visualization.Plot3d as p3d
p3d.plot(d)