[Insight-users] Image interpolation problem
Marcus Alley
mtalley at stanford.edu
Wed Sep 8 17:57:47 EDT 2004
Hi,
I'm new to itk, and as such I'm having trouble figuring out how to
solve my particular problem. I have non-uniformly spaced 3D image
data from which I would like to extract interpolated data at various
points.
I've attempted to solve this using the itk kernel based transforms,
and I've included a simple example program at the end of this note.
The program works quite well for small image dimensions, but the
problem occurs if I set any one of the dimensions (nx, ny, nz) to
something more appropriate (for my problem) like 256. In this case
the ComputeWMatrix() either crashes with a segmentation fault or else
takes far too long to be really useful for my application.
I would appreciate any advice on better ways to approach the problem.
I'm happy to clarify anything that I might have left out.
Thanks very much,
Marc
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
Example:
#include "itkThinPlateSplineKernelTransform.h"
using namespace std;
int main()
{
typedef itk::ThinPlateSplineKernelTransform<float, 4> TransformType;
const int nx = 4;
const int ny = 4;
const int nz = 4;
// Target landmark
TransformType::PointSetType::Pointer tLandmarks =
TransformType::PointSetType::New();
tLandmarks->GetPoints()->Reserve(nx*ny*nz);
// Source landmark set
TransformType::PointSetType::Pointer sLandmarks =
TransformType::PointSetType::New();
sLandmarks->GetPoints()->Reserve(nx*ny*nz);
// Iterators
TransformType::PointsIterator tIt = tLandmarks->GetPoints()->Begin();
TransformType::PointsIterator sIt = sLandmarks->GetPoints()->Begin();
for (int x = 0; x < nx; x++) {
for (int y = 0; y < ny; y++) {
for (int z = 0; z < nz; z++) {
// Source points
TransformType::InputPointType ptS;
ptS[0] = x;
ptS[1] = y;
ptS[2] = z;
ptS[3] = 0;
sIt.Value() = ptS;
sIt++;
// Target points
TransformType::InputPointType ptT;
ptT[0] = 2*x;
ptT[1] = 2*y;
ptT[2] = 2*z;
ptT[3] = 2*ptT[0] + 3*ptT[1];
tIt.Value() = ptT;
tIt++;
}
}
}
// Create the transform
TransformType::Pointer mytrans = TransformType::New();
mytrans->SetSourceLandmarks(sLandmarks);
mytrans->SetTargetLandmarks(tLandmarks);
mytrans->ComputeWMatrix();
sIt = sLandmarks->GetPoints()->Begin();
TransformType::PointsIterator endIt = sLandmarks->GetPoints()->End();
while (sIt != endIt) {
TransformType::InputPointType pt0 = sIt.Value();
TransformType::InputPointType pt1 = mytrans->TransformPoint(pt0);
cout << pt0 << " warps to: " << pt1 << endl;
sIt++;
}
cout << endl;
return 0;
}
****************************************************************
Marcus Alley, PhD | mtalley at stanford.edu
Research Associate | office: 650.498.5581
Department of Radiology | fax: 650.723.5795
Radiological Sciences Laboratory
Stanford University School of Medicine
Lucas MRS Center, Room P-272
Stanford, California, 94305-5488
****************************************************************
More information about the Insight-users
mailing list