import org.itk.simple.*;
public class DemonsRegistration2 {
public static void main(String[] args) {
if (args.length < 3) {
System.out.println("Usage: DemonsRegistration2 <fixedImageFile> <movingImageFile> [initialTransformFile] <outputTransformFile>");
System.exit(1);
}
Image fixed = SimpleITK.readImage(args[0]);
Image moving = SimpleITK.readImage(args[1]);
HistogramMatchingImageFilter matcher = new HistogramMatchingImageFilter();
if (fixed.getPixelID() == PixelIDValueEnum.sitkUInt8 || fixed.getPixelID() == PixelIDValueEnum.sitkInt8) {
matcher.setNumberOfHistogramLevels(128);
} else {
matcher.setNumberOfHistogramLevels(1024);
}
matcher.setNumberOfMatchPoints(7);
matcher.thresholdAtMeanIntensityOn();
moving = matcher.execute(moving, fixed);
FastSymmetricForcesDemonsRegistrationFilter demons = new FastSymmetricForcesDemonsRegistrationFilter();
demons.setNumberOfIterations(200);
demons.setStandardDeviations(1.0);
IterationUpdate cmd = new IterationUpdate(demons);
demons.addCommand(EventEnum.sitkIterationEvent, cmd);
Image displacementField;
if (args.length > 3) {
Transform initialTransform = SimpleITK.readTransform(args[2]);
String outputTransformFile = args[3];
TransformToDisplacementFieldFilter toDisplacementFilter = new TransformToDisplacementFieldFilter();
toDisplacementFilter.setReferenceImage(fixed);
displacementField = toDisplacementFilter.execute(initialTransform);
displacementField = demons.execute(fixed, moving, displacementField);
Transform outTx = new DisplacementFieldTransform(displacementField);
SimpleITK.writeTransform(outTx, outputTransformFile);
} else {
displacementField = demons.execute(fixed, moving);
Transform outTx = new DisplacementFieldTransform(displacementField);
SimpleITK.writeTransform(outTx, args[2]);
}
System.out.println("-------");
System.out.println("Number Of Iterations: " + demons.getElapsedIterations());
System.out.println(" RMS: " + demons.getRMSChange());
if (System.getenv("SITK_NOSHOW") == null) {
ResampleImageFilter resampler = new ResampleImageFilter();
resampler.setReferenceImage(fixed);
resampler.setInterpolator(InterpolatorEnum.sitkLinear);
resampler.setDefaultPixelValue(100);
resampler.setTransform(new DisplacementFieldTransform(displacementField));
Image out = resampler.execute(moving);
Image simg1 = SimpleITK.cast(SimpleITK.rescaleIntensity(fixed), PixelIDValueEnum.sitkUInt8);
Image simg2 = SimpleITK.cast(SimpleITK.rescaleIntensity(out), PixelIDValueEnum.sitkUInt8);
Image cimg = SimpleITK.compose(simg1, simg2, SimpleITK.add(SimpleITK.divide(simg1, 2.0), SimpleITK.divide(simg2, 2.0)));
SimpleITK.show(cimg, "DeformableRegistration2 Composition");
}
}
static class IterationUpdate extends Command {
private FastSymmetricForcesDemonsRegistrationFilter filter;
public IterationUpdate(FastSymmetricForcesDemonsRegistrationFilter filter) {
super();
this.filter = filter;
}
public void execute() {
System.out.format("%3d = %10.5f\n", filter.getElapsedIterations(), filter.getMetric());
}
}
}