import org.itk.simple.*;
class IterationUpdate extends Command {
private ImageRegistrationMethod method;
private Transform bsplineTransform;
public IterationUpdate(ImageRegistrationMethod m, Transform bsplineTransform) {
method = m;
this.bsplineTransform = bsplineTransform;
}
public void execute() {
if (method.getOptimizerIteration() == 0) {
System.out.println(bsplineTransform.toString());
}
System.out.printf("%3d = %10.5f%n",
method.getOptimizerIteration(),
method.getMetricValue());
}
}
class MultiResolutionIterationUpdate extends Command {
private ImageRegistrationMethod method;
public MultiResolutionIterationUpdate(ImageRegistrationMethod m) {
method = m;
}
public void execute() {
if (method.getCurrentLevel() > 0) {
System.out.println("Optimizer stop condition: " + method.getOptimizerStopConditionDescription());
System.out.println(" Iteration: " + method.getOptimizerIteration());
System.out.println(" Metric value: " + method.getMetricValue());
}
System.out.println("--------- Resolution Changing ---------");
}
}
class ImageRegistrationMethodBSpline3 {
public static void main(String[] args) {
if (args.length < 3) {
System.out.println("Usage: ImageRegistrationMethodBSpline3 <fixedImageFile> <movingImageFile> <outputTransformFile>");
return;
}
VectorUInt32 transformDomainMeshSize = new VectorUInt32();
for (int i = 0; i < fixedImage.getDimension(); i++) {
transformDomainMeshSize.add(2L);
}
BSplineTransform tx = SimpleITK.bSplineTransformInitializer(fixedImage, transformDomainMeshSize);
System.out.println("Initial Number of Parameters: " + tx.getNumberOfParameters());
ImageRegistrationMethod R = new ImageRegistrationMethod();
R.setMetricAsJointHistogramMutualInformation();
double learningRate = 5.0;
int numberOfIterations = 100;
double convergenceMinimumValue = 1e-4;
int convergenceWindowSize = 5;
R.setOptimizerAsGradientDescentLineSearch(learningRate, numberOfIterations,
convergenceMinimumValue, convergenceWindowSize);
VectorUInt32 scaleFactors = new VectorUInt32();
scaleFactors.add(1L); scaleFactors.add(2L); scaleFactors.add(5L);
R.setInitialTransformAsBSpline(tx, true, scaleFactors);
VectorUInt32 shrinkFactors = new VectorUInt32();
shrinkFactors.add(4L); shrinkFactors.add(2L); shrinkFactors.add(1L);
R.setShrinkFactorsPerLevel(shrinkFactors);
VectorDouble smoothingSigmas = new VectorDouble();
smoothingSigmas.add(4.0); smoothingSigmas.add(2.0); smoothingSigmas.add(1.0);
R.setSmoothingSigmasPerLevel(smoothingSigmas);
IterationUpdate cmd1 = new IterationUpdate(R, tx);
R.addCommand(
EventEnum.sitkIterationEvent, cmd1);
MultiResolutionIterationUpdate cmd2 = new MultiResolutionIterationUpdate(R);
R.addCommand(
EventEnum.sitkMultiResolutionIterationEvent, cmd2);
Transform outTx = R.execute(fixedImage, movingImage);
System.out.println("-------");
System.out.println(tx.toString());
System.out.println(outTx.toString());
System.out.println("Optimizer stop condition: " + R.getOptimizerStopConditionDescription());
System.out.println(" Iteration: " + R.getOptimizerIteration());
System.out.println(" Metric value: " + R.getMetricValue());
SimpleITK.writeTransform(outTx, args[2]);
if (System.getenv("SITK_NOSHOW") == null) {
ResampleImageFilter resampler = new ResampleImageFilter();
resampler.setReferenceImage(fixedImage);
resampler.setDefaultPixelValue(100);
resampler.setTransform(outTx);
Image outputImage = resampler.execute(movingImage);
Image simg1 = SimpleITK.cast(SimpleITK.rescaleIntensity(fixedImage),
PixelIDValueEnum.sitkUInt8);
Image simg2 = SimpleITK.cast(SimpleITK.rescaleIntensity(outputImage),
PixelIDValueEnum.sitkUInt8);
Image cimg = SimpleITK.compose(simg1, simg2, SimpleITK.divide(SimpleITK.add(simg1, simg2), 2.0));
SimpleITK.show(cimg, "Image Registration Composition");
}
}
}
EventEnum
Events which can be observed from ProcessObject.
PixelIDValueEnum
Enumerated values of pixelIDs.