SimpleITK is a simplified interface to the Insight Toolkit (ITK) for image registration and segmentation
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Filters for computing distance transforms and distance measures between objects. Distance maps represent the distance from each pixel to the nearest boundary or feature.
class SignedMaurerDistanceMapImageFilter:
"""Compute signed Euclidean distance map (Maurer's algorithm)."""
def SetSquaredDistance(self, squared: bool) -> None:
"""
Return squared distances.
Args:
squared: If True, return distance^2 instead of distance
"""
def SetUseImageSpacing(self, useSpacing: bool) -> None:
"""
Account for image spacing.
Args:
useSpacing: If True, distances are in physical units
"""
def SetInsideIsPositive(self, positive: bool) -> None:
"""
Set sign convention.
Args:
positive: If True, inside is positive, outside negative
"""
def SetBackgroundValue(self, value: float) -> None:
"""Set background pixel value."""
def Execute(self, image):
"""
Compute signed distance map.
Returns:
Distance map (positive inside, negative outside, or vice versa)
"""
def SignedMaurerDistanceMap(image, insideIsPositive: bool = False,
squaredDistance: bool = False, useImageSpacing: bool = False,
backgroundValue: float = 0):
"""Procedural: signed Maurer distance map."""
class SignedDanielssonDistanceMapImageFilter:
"""Signed distance map using Danielsson's algorithm."""
def SetInsideIsPositive(self, positive: bool) -> None:
"""Set sign convention."""
def SetSquaredDistance(self, squared: bool) -> None:
"""Return squared distances."""
def SetUseImageSpacing(self, useSpacing: bool) -> None:
"""Account for image spacing."""
def Execute(self, image):
"""Returns: signed distance map"""
def SignedDanielssonDistanceMap(image, insideIsPositive: bool = False,
squaredDistance: bool = False,
useImageSpacing: bool = False):
"""Procedural: signed Danielsson distance map."""
class DanielssonDistanceMapImageFilter:
"""Unsigned distance map using Danielsson's algorithm."""
def SetSquaredDistance(self, squared: bool) -> None:
"""Return squared distances."""
def SetUseImageSpacing(self, useSpacing: bool) -> None:
"""Account for image spacing."""
def SetInputIsBinary(self, binary: bool) -> None:
"""Specify if input is binary."""
def Execute(self, image):
"""
Compute unsigned distance map.
Returns:
Distance map (distance to nearest zero pixel)
"""
def DanielssonDistanceMap(image, inputIsBinary: bool = False,
squaredDistance: bool = False, useImageSpacing: bool = False):
"""Procedural: Danielsson distance map."""
class ApproximateSignedDistanceMapImageFilter:
"""Fast approximate signed distance map."""
def SetInsideValue(self, value: float) -> None:
"""Set inside pixel value."""
def SetOutsideValue(self, value: float) -> None:
"""Set outside pixel value."""
def Execute(self, image):
"""
Compute approximate signed distance.
Returns:
Approximate signed distance map
"""
def ApproximateSignedDistanceMap(image, insideValue: float = 1, outsideValue: float = 0):
"""Procedural: approximate signed distance map."""
class IsoContourDistanceImageFilter:
"""Distance to iso-contour in image."""
def SetLevelSetValue(self, value: float) -> None:
"""Set iso-contour level."""
def SetFarValue(self, value: float) -> None:
"""Set value for pixels far from contour."""
def Execute(self, image):
"""
Compute distance to iso-contour.
Returns:
Distance map
"""
def IsoContourDistance(image, levelSetValue: float = 0, farValue: float = 10):
"""Procedural: iso-contour distance."""class HausdorffDistanceImageFilter:
"""Compute Hausdorff distance between two segmentations."""
def Execute(self, image1, image2):
"""
Compute Hausdorff distance.
Args:
image1: First binary segmentation
image2: Second binary segmentation
"""
def GetHausdorffDistance(self) -> float:
"""Get Hausdorff distance (call after Execute)."""
def GetAverageHausdorffDistance(self) -> float:
"""Get average Hausdorff distance."""
def HausdorffDistance(image1, image2):
"""
Procedural: Hausdorff distance (returns filter object for distance access).
Example:
filter = sitk.HausdorffDistance(seg1, seg2)
dist = filter.GetHausdorffDistance()
"""
class ContourMeanDistanceImageFilter:
"""Mean distance between contours."""
def Execute(self, image1, image2):
"""Compute mean contour distance."""
def GetMeanDistance(self) -> float:
"""Get mean distance."""
class ContourDirectedMeanDistanceImageFilter:
"""Directed mean distance from one contour to another."""
def Execute(self, image1, image2):
"""
Compute directed mean distance.
Args:
image1: Source contour
image2: Target contour
"""
def GetDirectedMeanDistance(self) -> float:
"""Get directed mean distance from image1 to image2."""import SimpleITK as sitk
# Binary segmentation
binary = sitk.BinaryThreshold(image, lowerThreshold=100, upperThreshold=255)
# Signed distance map (negative inside, positive outside)
distance_map = sitk.SignedMaurerDistanceMap(
binary,
insideIsPositive=False,
squaredDistance=False,
useImageSpacing=True
)
# Distance in physical units (mm, not pixels)import SimpleITK as sitk
# Compute distance map
dist_map = sitk.SignedMaurerDistanceMap(binary, useImageSpacing=True)
# Boundary is zero-crossing
boundary = sitk.BinaryThreshold(
sitk.Abs(dist_map),
lowerThreshold=0,
upperThreshold=1.0
)import SimpleITK as sitk
# Compute Hausdorff distance
hausdorff_filter = sitk.HausdorffDistanceImageFilter()
hausdorff_filter.Execute(segmentation1, segmentation2)
print(f"Hausdorff distance: {hausdorff_filter.GetHausdorffDistance():.2f}")
print(f"Average Hausdorff: {hausdorff_filter.GetAverageHausdorffDistance():.2f}")Install with Tessl CLI
npx tessl i tessl/pypi-simpleitk