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
Additional specialized filters including histogram matching, image comparison, hash computation, multi-resolution pyramids, voting filters, and utility operations.
class HistogramMatchingImageFilter:
"""Match histogram of image to reference."""
def SetNumberOfHistogramLevels(self, levels: int) -> None:
"""Set histogram bin resolution."""
def SetNumberOfMatchPoints(self, points: int) -> None:
"""Set number of histogram match points."""
def SetThresholdAtMeanIntensity(self, threshold: bool) -> None:
"""Threshold at mean intensity."""
def Execute(self, image, referenceImage):
"""
Match histogram.
Args:
image: Image to transform
referenceImage: Reference for target histogram
Returns:
Histogram-matched image
"""
def HistogramMatching(image, referenceImage, numberOfHistogramLevels: int = 256,
numberOfMatchPoints: int = 1, thresholdAtMeanIntensity: bool = True):
"""Procedural: histogram matching."""
class AdaptiveHistogramEqualizationImageFilter:
"""Adaptive histogram equalization (CLAHE)."""
def SetRadius(self, radius: int | tuple[int, ...]) -> None:
"""Set neighborhood radius."""
def SetAlpha(self, alpha: float) -> None:
"""Set blending parameter (0=none, 1=full)."""
def SetBeta(self, beta: float) -> None:
"""Set slope control parameter."""
def Execute(self, image):
"""
Adaptive histogram equalization.
Returns:
Equalized image
"""
def AdaptiveHistogramEqualization(image, radius: int | tuple[int, ...] = 5,
alpha: float = 0.3, beta: float = 0.3):
"""Procedural: adaptive histogram equalization."""class SimilarityIndexImageFilter:
"""Compute similarity metrics between images."""
def Execute(self, image1, image2):
"""
Compute similarity.
Args:
image1: First image
image2: Second image
"""
def GetSimilarityIndex(self) -> float:
"""Get similarity index (overlap coefficient)."""
def GetNumberOfPixelsInImage1(self) -> int:
"""Get pixels in first image."""
def GetNumberOfPixelsInImage2(self) -> int:
"""Get pixels in second image."""
class CheckerBoardImageFilter:
"""Create checkerboard pattern from two images."""
def SetCheckerPattern(self, pattern: tuple[int, ...]) -> None:
"""
Set checkerboard pattern.
Args:
pattern: Size of checker squares in each dimension
"""
def Execute(self, image1, image2):
"""
Create checkerboard.
Returns:
Checkerboard image alternating between inputs
"""
def CheckerBoard(image1, image2, checkerPattern: tuple[int, ...]):
"""Procedural: create checkerboard."""class HashImageFilter:
"""Compute hash of image for verification."""
def SetHashFunction(self, hashFunction: int) -> None:
"""Set hash function (SHA1, MD5, etc.)."""
def Execute(self, image):
"""Compute hash."""
def GetHashValue(self) -> str:
"""
Get computed hash string.
Returns:
Hash as hex string
"""
def Hash(image, hashFunction: int = 0):
"""Procedural: compute hash (returns filter for hash access)."""class RecursiveMultiResolutionPyramidImageFilter:
"""Generate multi-resolution pyramid using recursive smoothing."""
def SetNumberOfLevels(self, levels: int) -> None:
"""Set number of pyramid levels."""
def SetShrinkFactors(self, factors: tuple[int, ...]) -> None:
"""Set shrink factors per level."""
def Execute(self, image):
"""
Generate pyramid.
Returns:
List of images at different resolutions
"""
def RecursiveMultiResolutionPyramid(image, numberOfLevels: int = 2,
shrinkFactors: tuple[int, ...] = None):
"""Procedural: generate pyramid."""class GaussianImageSource:
"""Generate Gaussian image."""
def SetSize(self, size: tuple[int, ...]) -> None:
"""Set output size."""
def SetSigma(self, sigma: float | tuple[float, ...]) -> None:
"""Set Gaussian sigma."""
def SetMean(self, mean: tuple[float, ...]) -> None:
"""Set Gaussian center."""
def SetScale(self, scale: float) -> None:
"""Set amplitude scale."""
def SetNormalized(self, normalized: bool) -> None:
"""Normalize to unit sum."""
def Execute(self):
"""Returns: Gaussian image"""
class GaborImageSource:
"""Generate Gabor filter image."""
def SetSize(self, size: tuple[int, ...]) -> None:
"""Set output size."""
def SetSigma(self, sigma: float | tuple[float, ...]) -> None:
"""Set Gaussian envelope sigma."""
def SetFrequency(self, frequency: float) -> None:
"""Set frequency."""
def Execute(self):
"""Returns: Gabor filter image"""
class GridImageSource:
"""Generate grid pattern image."""
def SetSize(self, size: tuple[int, ...]) -> None:
"""Set output size."""
def SetSigma(self, sigma: float | tuple[float, ...]) -> None:
"""Set line thickness (Gaussian sigma)."""
def SetGridSpacing(self, spacing: tuple[float, ...]) -> None:
"""Set grid spacing."""
def SetGridOffset(self, offset: tuple[float, ...]) -> None:
"""Set grid offset."""
def SetScale(self, scale: float) -> None:
"""Set line intensity."""
def Execute(self):
"""Returns: grid image"""
class PhysicalPointImageSource:
"""Generate image with physical point coordinates."""
def SetSize(self, size: tuple[int, ...]) -> None:
"""Set output size."""
def SetOrigin(self, origin: tuple[float, ...]) -> None:
"""Set origin."""
def SetSpacing(self, spacing: tuple[float, ...]) -> None:
"""Set spacing."""
def SetDirection(self, direction: tuple[float, ...]) -> None:
"""Set direction."""
def Execute(self):
"""Returns: vector image with physical coordinates at each pixel"""class ScalarImageKmeansImageFilter:
"""K-means clustering on scalar image."""
def SetClassWithInitialMean(self, classIndex: int, mean: float) -> None:
"""Set initial mean for class."""
def AddClassWithInitialMean(self, mean: float) -> None:
"""Add class with initial mean."""
def Execute(self, image):
"""
K-means clustering.
Returns:
Label image with cluster assignments
"""
def GetFinalMeans(self) -> tuple[float, ...]:
"""Get final cluster means."""class ProcessObject:
"""
Base class for all filters (inherited by all filter classes).
Provides common functionality for progress monitoring, threading,
and observer pattern.
"""
def GetName(self) -> str:
"""Get filter name."""
def GetNumberOfThreads(self) -> int:
"""Get number of threads for execution."""
def SetNumberOfThreads(self, threads: int) -> None:
"""
Set number of threads.
Args:
threads: Number of threads (0 = default/auto)
"""
def GetProgress(self) -> float:
"""
Get execution progress.
Returns:
Progress in [0, 1]
"""
def AddCommand(self, event: int, callback) -> None:
"""
Add observer callback.
Args:
event: Event type (sitkProgressEvent, sitkIterationEvent, etc.)
callback: Callback function
"""
def RemoveAllCommands(self) -> None:
"""Remove all observer callbacks."""
def Abort(self) -> None:
"""Abort filter execution."""
def GetGlobalDefaultNumberOfThreads() -> int:
"""Get global default thread count."""
def SetGlobalDefaultNumberOfThreads(threads: int) -> None:
"""Set global default thread count."""sitkAnyEvent = 0
sitkAbortEvent = 1
sitkDeleteEvent = 2
sitkEndEvent = 3
sitkIterationEvent = 4
sitkProgressEvent = 5
sitkStartEvent = 6
sitkUserEvent = 7
sitkMultiResolutionIterationEvent = 9import SimpleITK as sitk
def progress_callback():
progress = filter.GetProgress()
print(f"Progress: {progress * 100:.1f}%")
# Create filter
filter = sitk.DiscreteGaussianImageFilter()
filter.SetVariance(2.0)
# Add progress callback
filter.AddCommand(sitk.sitkProgressEvent, progress_callback)
# Execute with progress updates
result = filter.Execute(image)import SimpleITK as sitk
# Set global default threads
sitk.ProcessObject.SetGlobalDefaultNumberOfThreads(4)
# Or set per filter
filter = sitk.DiscreteGaussianImageFilter()
filter.SetNumberOfThreads(8)
result = filter.Execute(image)import SimpleITK as sitk
# Match histogram of image to reference
normalized = sitk.HistogramMatching(
image,
reference_image,
numberOfHistogramLevels=1024,
numberOfMatchPoints=10
)import SimpleITK as sitk
# Create checkerboard for visual comparison
checker = sitk.CheckerBoard(
fixed_image,
moving_image,
checkerPattern=(10, 10, 10)
)import SimpleITK as sitk
# K-means clustering
kmeans = sitk.ScalarImageKmeansImageFilter()
kmeans.AddClassWithInitialMean(100)
kmeans.AddClassWithInitialMean(200)
kmeans.AddClassWithInitialMean(300)
segmented = kmeans.Execute(image)
final_means = kmeans.GetFinalMeans()
print(f"Final cluster means: {final_means}")import SimpleITK as sitk
# Compute hash for verification
hash_filter = sitk.HashImageFilter()
hash_filter.Execute(image)
image_hash = hash_filter.GetHashValue()
print(f"Image hash: {image_hash}")
# Verify images are identical
hash_filter2 = sitk.HashImageFilter()
hash_filter2.Execute(image2)
image_hash2 = hash_filter2.GetHashValue()
if image_hash == image_hash2:
print("Images are identical")import SimpleITK as sitk
# Gaussian blob
gaussian = sitk.GaussianImageSource()
gaussian.SetSize([128, 128, 64])
gaussian.SetSigma([10.0, 10.0, 5.0])
gaussian.SetMean([64.0, 64.0, 32.0])
blob = gaussian.Execute()
# Grid pattern
grid = sitk.GridImageSource()
grid.SetSize([256, 256])
grid.SetSigma([0.5, 0.5])
grid.SetGridSpacing([20.0, 20.0])
grid_image = grid.Execute()Install with Tessl CLI
npx tessl i tessl/pypi-simpleitk