[Insight-developers] Strategy pattern for SimpleITK

Dan Mueller dan.muel at gmail.com
Sat Nov 6 07:24:59 EDT 2010


Hi all,

I cannot attend the ITKv4 meeting in Iowa.

Before the meeting I wanted to put together an example of how the
strategy pattern
    http://en.wikipedia.org/wiki/Strategy_pattern
could be used to simplify ITK.

Unfortunately I have not had time to put the finishing touches on the
example, but I include it here nonetheless. I hope it can be
discussed.
    https://github.com/danmuel/SimpleITK/commit/275570295619aa3c812bcf3c7973eff84c374bc7

In my example, I created "itkSimpleUnaryImageFilter" which employs the
"itkStrategyFactory" to bring together 20+ filters into a single
filter. If I had the time, it would have been used as follows (using
C# wrapping):
    Unary unary = new Unary();
    unary.setStrategy(UnaryStrategy.UnaryStrategyAbs);
    //unary.setStrategy(UnaryStrategy.UnaryStrategyExp); // Cos,
Log10, Log, Not, Sin, Tan...
    image = unary.execute(image);

The strategy pattern could be applied to a wide range of
filters/object, including the registration framework Eg. (syntax
dreamed up)
    Metric metric = new Metric(MetricStrategy.NormalizedCorrelation);
    metric.setSomeParameter(someValue1);
    Interpolator interpolator = new Interpolator(InterpolatorStrategy.BSpline);
    Transform transform = new Transform(TransformStrategy.Affine);
    Optimizer optimizer = new Optimizer(OptimizerStrategy.GradientDescent);
    optimizer.setSomeParameter(someValue2);
    RegistrationMethod registration = new RegistrationMethod();
    registration.setMetric(metric);
    registration.setInterpolator(interpolator);
    registration.setTransform(transform);
    registration.setOptimizer(optimizer);
    registration.setFixedImage(fixed);
    registration.setMovingImage(moving);
    registration.execute();

Here is an initial list of possible objects which could employ the pattern:
UnaryPixelMath: Abs, Acos, Asin, Atan, Cos, Exp, Log10, Log, Not,
Sigmoid, Sin, Sqrt, Square, ...
BinaryPixelMath: Add, Subtract, Multiple, Divide, And, Or, Xor,
Maximum, Minimum, Mask, SquaredDifferance, CheckerBoard, ...
InterpolateImageFunction: Linear, BSpline, CosineWindowedSinc,
HammingWindowedSinc, LanczosWindowedSinc, WelchWindowedSinc
DistanceMap: Danielsson, SignedDanielsson, Chamfer, ApproximateSigned,
SignedMaurer
Morphology: BinaryDilate, BinaryErode, BinaryOpen, BinaryClose,
BinaryShapeOpen, GreyscaleOpen, GreyscaleClose, GreyscaleDilate,
GreyscaleErode, AreaOpen, AnchorOpen, AnchorClose,
VanHerkGilWermanOpen, VanHerkGilWermanClose, ...
ImageToImageMetric: KappaStatistic, MatchCardinality,
MattesMutualInformation, MeanReciprocalSquareDifference, MeanSquares,
NormalizedCorrelation, NormalizedMutualInformationHistogram

Obviously there are still some issues to sort out, but I think the
strategy pattern can really help make ITK "simple".

What do you think?

Cheers, Dan


More information about the Insight-developers mailing list