[Insight-users] DeformableRegistration8.cxx Works in C++,
but Java version does not
sumit shah
sshah at mednet.ucla.edu
Tue Sep 13 03:03:00 EDT 2005
Dear Itk Users:
I'm a bit confused with the result I've observed. I have implemented
example DeformableRegistration8 in java and tested the Java version
to the CXX version. I did have to change a few things to get the
necessary classes wrapped (e.g. itkLBFGSBOptimizer, itkArrayI, etc.)
I also changed the c++ version to use image type of float instead of
signed short in order to keep everything as similar as possible.
I ran the c++ version with a command similar to:
DeformableRegistration8 c:/RatLungSlice1.mha c:/RatLungSlice2.mha
test.mha
and the result is:
Starting Registration
Probe Tag Starts Stops Time
Registration 1 1 0.313
I ran the Java version with similar data and got the following result:
ava.lang.RuntimeException: c:\insighttoolkit-2.2.0\code\algorithms
\itkMattesMutualInformationImageToImageMetric.txx:985:
itk::ERROR: MattesMutualInformationImageToImageMetric(068FB208): Too
many samples map outside moving image buffer: 11 / 1638
at
InsightToolkit.itkImageRegistrationMethodJNI.itkImageRegistrationMethodF
3F3_Pointer_StartRegistration(Native Method)
at
InsightToolkit.itkImageRegistrationMethodF3F3_Pointer.StartRegistration(
itkImageRegistrationMethodF3F3_Pointer.java:175)
at edu.ucla.rip.process.RegistrationTestUtils.defregister
(RegistrationTestUtils.java:125)
at edu.ucla.rip.process.RegistrationTestUtils.main
(RegistrationTestUtils.java:131)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.intellij.rt.execution.application.AppMain.main
(AppMain.java:78)
Here is my config:
WindowsXP SP2,
Visual Studio.NET 2003
JDK1.5
ITK 2.2
CableSWIG CVS
I realize the example I tried was a 2D data set, but the results I
observe with the 2D dataset are similar to the results I observe with
some of our internal data sets (i.e. the too many samples map outside
error). I just wanted to show an example with the included ITK
datasets.
My Java source code is at the end of this message. I'm not sure what
I am doing wrong, I've checked the source code many times to see if I
overlooked something, but if I did it is not jumping out at me. Any
help that anyone out there can provide will be very much
appreciated. Thank you very much.
Sumit
package edu.ucla.rip.process;
import InsightToolkit.itkArrayD;
import InsightToolkit.itkArrayI;
import InsightToolkit.itkBSplineDeformableTransform33;
import InsightToolkit.itkBSplineDeformableTransform33_Pointer;
import InsightToolkit.itkImageFileReaderF3;
import InsightToolkit.itkImageFileReaderF3_Pointer;
import InsightToolkit.itkImageRegion3;
import InsightToolkit.itkImageRegistrationMethodF3F3;
import InsightToolkit.itkImageRegistrationMethodF3F3_Pointer;
import InsightToolkit.itkIterationEvent;
import InsightToolkit.itkJavaCommand;
import InsightToolkit.itkLBFGSBOptimizer;
import InsightToolkit.itkLBFGSBOptimizer_Pointer;
import InsightToolkit.itkLinearInterpolateImageFunctionF3D;
import InsightToolkit.itkLinearInterpolateImageFunctionF3D_Pointer;
import InsightToolkit.itkMattesMutualInformationImageToImageMetricF3F3;
import
InsightToolkit.itkMattesMutualInformationImageToImageMetricF3F3_Pointer;
import InsightToolkit.itkPointD3;
import InsightToolkit.itkSize3;
import InsightToolkit.itkVectorD3;
/**
* User: sshah
* Date: May 17, 2005
* Time: 12:03:36 PM
*/
public class RegistrationTestUtils {
public static void defregister(String fix, String mov) throws
Exception {
itkImageFileReaderF3_Pointer fixedReader =
itkImageFileReaderF3.itkImageFileReaderF3_New();
fixedReader.SetFileName(fix);
itkImageFileReaderF3_Pointer movingReader =
itkImageFileReaderF3.itkImageFileReaderF3_New();
movingReader.SetFileName(mov);
movingReader.Update();
final itkLinearInterpolateImageFunctionF3D_Pointer interpolator
=
itkLinearInterpolateImageFunctionF3D.itkLinearInterpolateImageFunctionF3
D_New();
final itkMattesMutualInformationImageToImageMetricF3F3_Pointer
metric =
itkMattesMutualInformationImageToImageMetricF3F3.itkMattesMutualInformat
ionImageToImageMetricF3F3_New();
final itkLBFGSBOptimizer_Pointer optimizer =
itkLBFGSBOptimizer.itkLBFGSBOptimizer_New();
final itkBSplineDeformableTransform33_Pointer transform =
itkBSplineDeformableTransform33.itkBSplineDeformableTransform33_New();
final itkImageRegistrationMethodF3F3_Pointer registration =
itkImageRegistrationMethodF3F3.itkImageRegistrationMethodF3F3_New();
registration.SetMetric(metric.GetPointer());
registration.SetOptimizer(optimizer.GetPointer());
registration.SetInterpolator(interpolator.GetPointer());
registration.SetTransform(transform.GetPointer());
registration.SetFixedImage(fixedReader.GetOutput());
registration.SetMovingImage(movingReader.GetOutput());
fixedReader.Update();
itkImageRegion3 fixedRegion = fixedReader.GetOutput
().GetBufferedRegion();
registration.SetFixedImageRegion(fixedRegion);
itkImageRegion3 bsplineRegion = new itkImageRegion3();
itkSize3 gridSizeOnImage = new itkSize3();
itkSize3 gridBorderSize = new itkSize3();
itkSize3 totalGridSize = new itkSize3();
gridSizeOnImage.Fill(12);
gridBorderSize.Fill(3);
totalGridSize.Fill(15);
bsplineRegion.SetSize(totalGridSize);
itkVectorD3 spacing = fixedReader.GetOutput().GetSpacing();
itkPointD3 origin = fixedReader.GetOutput().GetOrigin();
itkSize3 fixedImageSize = fixedRegion.GetSize();
for (int r = 0; r < 3; r++) {
spacing.SetElement(r, spacing.GetElement(r) * Math.floor
(((double) (fixedImageSize.GetElement(r) - 1)) / ((double)
(gridSizeOnImage.GetElement(r) - 1))));
origin.SetElement(r, origin.GetElement(r) - spacing.GetElement
(r));
}
transform.SetGridSpacing(spacing);
transform.SetGridOrigin(origin);
transform.SetGridRegion(bsplineRegion);
for (int i = 0; i < 3; i++) System.out.print(spacing.GetElement
(i) + " ");
System.out.println();
for (int i = 0; i < 3; i++) System.out.print(origin.GetElement
(i) + " ");
System.out.println();
for (int i = 0; i < 3; i++) System.out.print
(bsplineRegion.GetSize(i) + " ");
System.out.println();
for (int i = 0; i < 3; i++) System.out.print
(bsplineRegion.GetIndex(i) + " ");
System.out.println();
long numberOfParameters = transform.GetNumberOfParameters();
itkArrayD parameters = new itkArrayD(numberOfParameters);
parameters.Fill(0);
transform.SetParameters(parameters);
registration.SetInitialTransformParameters
(transform.GetParameters());
itkArrayI boundSelect = new itkArrayI
(transform.GetNumberOfParameters());
itkArrayD upperBound = new itkArrayD
(transform.GetNumberOfParameters());
itkArrayD lowerBound = new itkArrayD
(transform.GetNumberOfParameters());
boundSelect.Fill(0);
upperBound.Fill(0.0);
lowerBound.Fill(0.0);
optimizer.SetBoundSelection(boundSelect);
optimizer.SetUpperBound(upperBound);
optimizer.SetLowerBound(lowerBound);
optimizer.SetCostFunctionConvergenceFactor(1e7);
optimizer.SetProjectedGradientTolerance(1e-4);
optimizer.SetMaximumNumberOfIterations(500);
optimizer.SetMaximumNumberOfEvaluations(500);
optimizer.SetMaximumNumberOfCorrections(12);
System.out.println(optimizer.GetBoundSelection
().GetNumberOfElements() + " " + optimizer.GetBoundSelection
().GetElement(0));
metric.SetNumberOfHistogramBins(50);
metric.SetNumberOfSpatialSamples((int)
(fixedRegion.GetNumberOfPixels() * 0.1));
class CommandIterationUpdate extends itkJavaCommand {
public void Execute() {
System.out.println("iteration " +
optimizer.GetCurrentIteration() + " " + optimizer.GetValue() + " " +
optimizer.GetInfinityNormOfProjectedGradient());
}
}
CommandIterationUpdate p = new CommandIterationUpdate();
registration.AddObserver(new itkIterationEvent(), p);
registration.StartRegistration();
}
public static void main(String args[]) {
try {
defregister(args[0], args[1]);
} catch (Exception e) {
e.printStackTrace();
}
}
}
More information about the Insight-users
mailing list