medpy.metric.binary.asd#
- medpy.metric.binary.asd(result, reference, voxelspacing=None, connectivity=1)[source]#
Average surface distance metric.
Computes the average surface distance (ASD) between the binary objects in two images.
- Parameters:
- resultarray_like
Input data containing objects. Can be any type but will be converted into binary: background where 0, object everywhere else.
- referencearray_like
Input data containing objects. Can be any type but will be converted into binary: background where 0, object everywhere else.
- voxelspacingfloat or sequence of floats, optional
The voxelspacing in a distance unit i.e. spacing of elements along each dimension. If a sequence, must be of length equal to the input rank; if a single number, this is used for all axes. If not specified, a grid spacing of unity is implied.
- connectivityint
The neighbourhood/connectivity considered when determining the surface of the binary objects. This value is passed to
scipy.ndimage.generate_binary_structureand should usually be \(> 1\). The decision on the connectivity is important, as it can influence the results strongly. If in doubt, leave it as it is.
- Returns:
- asdfloat
The average surface distance between the object(s) in
resultand the object(s) inreference. The distance unit is the same as for the spacing of elements along each dimension, which is usually given in mm.
Notes
This is not a real metric, as it is directed. See
assdfor a real metric of this.The method is implemented making use of distance images and simple binary morphology to achieve high computational speed.
Examples
The connectivity determines what pixels/voxels are considered the surface of a binary object. Take the following binary image showing a cross
>>> from scipy.ndimage import generate_binary_structure >>> cross = generate_binary_structure(2, 1) array([[0, 1, 0], [1, 1, 1], [0, 1, 0]])
With connectivity set to 1 a 4-neighbourhood is considered when determining the object surface, resulting in the surface
array([[0, 1, 0], [1, 0, 1], [0, 1, 0]])
Changing connectivity to 2, a 8-neighbourhood is considered and we get:
array([[0, 1, 0], [1, 1, 1], [0, 1, 0]])
, as a diagonal connection does no longer qualifies as valid object surface.
This influences the results
asdreturns. Imagine we want to compute the surface distance of our cross to a cube-like object:>>> cube = generate_binary_structure(2, 1) array([[1, 1, 1], [1, 1, 1], [1, 1, 1]])
, which surface is, independent of the connectivity value set, always
array([[1, 1, 1], [1, 0, 1], [1, 1, 1]])
Using a connectivity of 1 we get
>>> asd(cross, cube, connectivity=1) 0.0
while a value of 2 returns us
>>> asd(cross, cube, connectivity=2) 0.20000000000000001
due to the center of the cross being considered surface as well.