[Insight-users] problem of deforming a 3D image
Ming Chao
mingchao2005 at gmail.com
Mon Mar 20 13:16:06 EST 2006
Hi Luis,
Thanks a lot for looking into the problem. You are right that the problem
was related to the numbr (7426, too large) of landmark points I used to
deform the image. Anyhow, you could find the image I wanted to deform and
the polydata input file in the following locations:
http://www.stanford.edu/~mingchao/image/phase1.vtk (image)
and
http://www.stanford.edu/~mingchao/image/LTLung.vtk (polydata).
Is there an easy way to reduce the number of landmark points in my polydata
input files?
Cheers,
Ming
On 3/20/06, Luis Ibanez <luis.ibanez at kitware.com> wrote:
>
>
> Hi Ming,
>
> Thanks for your detailed report and for posting your source code.
>
> Your code seems to be very similar to the example:
>
>
> Insight/
> Examples/
> Registration/
> DeformationFieldInitialization.cxx
>
>
> The problem seems to be related to the number of landmark points
> that you are passing for initializing the deformation field.
>
> Could you please let us know how many points you are using ?
>
> Could you send us the input file with the vtkPolyData that you
> are using for feeding this program ?
> That data could help us to figure out what may be going wrong
> with your code.
>
>
> Please let us know,
>
>
> Thanks
>
>
> Luis
>
>
> --------------
> Ming Chao wrote:
> > Hi,
> >
> > I encountered a problem when trying to deform a 3D image. The way I
> > deformed the image is as the following: I created a 3D contour for an
> > organ, say, lung for this image. Along the contours I have a bunch of
> > points. Then I generated a vector field for these points and used these
> > vectors to deform the image. I didn't have trouble deforming any 2D
> > image. But for 3D image I got an error. I traced down to the point where
> > the problem occured: in the try-catch block with
> > deformer->UpdateLargestPossibleRegion(); debugging reports a problem on
> > line 417 of vnl_matrix.txx file. For reference purpose I copy and paste
> > that part of code here:
> >
> > //: Sets all elements of matrix to specified value. O(m*n).
> >
> > template<class T>
> > void vnl_matrix<T>::fill (T const& value)
> > {
> > for (unsigned int i = 0; i < this->num_rows; i++)
> > for (unsigned int j = 0; j < this->num_cols; j++)
> > this->data[i][j] = value;
> > <========================================= debugging reports problem !
> > }
> >
> >
> >
> >
> > Also, I am attaching my code of deforming 3D images below. I would
> > greatly appreciate it if anybody can help look into it.
> >
> > Best regards,
> > Ming
> >
> >
> > // ---------------- starting of the code -------------------------
> > #include "itkVector.h"
> > #include "itkImage.h"
> > #include "itkImageRegionIteratorWithIndex.h"
> > #include "itkDeformationFieldSource.h "
> > #include "itkImageFileReader.h"
> > #include "itkImageFileWriter.h"
> > #include "itkWarpImageFilter.h"
> > #include "itkLinearInterpolateImageFunction.h"
> >
> > #include "itkNormalVariateGenerator.h"
> > #include "vtkPolyDataReader.h"
> > #include "vtkPolyDataWriter.h"
> > #include "vtkFloatArray.h"
> > #include "vtkPolyData.h"
> > #include "vtkPointData.h"
> > #include "vtkPoints.h"
> >
> > #include <fstream>
> >
> > int main( int argc, char * argv[] )
> > {
> >
> > if( argc < 2 )
> > {
> > std::cerr << "Missing Parameters " << std::endl;
> > std::cerr << "Usage: " << argv[0];
> > std::cerr << " landmarksFile fixedImage ";
> > std::cerr << "movingImage deformedMovingImage" << std::endl;
> > return 1;
> > }
> >
> > const unsigned int Dimension = 3;
> > typedef float VectorComponentType;
> >
> > typedef itk::Vector< VectorComponentType, Dimension > VectorType;
> > typedef itk::Image< VectorType, Dimension > DeformationFieldType;
> > typedef float PixelType;
> > typedef itk::Image< PixelType, Dimension > ImageType ;
> > typedef itk::ImageFileReader< ImageType > ReaderType ;
> > typedef itk::ImageFileWriter< ImageType > WriterType ;
> >
> > ReaderType::Pointer Reader = ReaderType::New();
> > Reader->SetFileName( argv[1] );
> >
> > try
> > {
> > Reader->Update();
> > }
> > catch( itk::ExceptionObject & excp )
> > {
> > std::cerr << "Exception thrown " << std::endl;
> > std::cerr << excp << std::endl;
> > return EXIT_FAILURE;
> > }
> >
> > WriterType::Pointer Writer = WriterType::New();
> > Writer->SetFileName( argv[2] );
> >
> > ImageType::ConstPointer fixedImage = Reader->GetOutput();
> >
> >
> > typedef itk::DeformationFieldSource< DeformationFieldType >
> > DeformationSourceType;
> > DeformationSourceType::Pointer deformer = DeformationSourceType::New();
> > deformer->SetOutputSpacing( fixedImage->GetSpacing() );
> > deformer->SetOutputOrigin( fixedImage->GetOrigin() );
> > deformer->SetOutputRegion( fixedImage->GetLargestPossibleRegion() );
> >
> > typedef DeformationSourceType::LandmarkContainer
> > LandmarkContainerType;
> > typedef DeformationSourceType::LandmarkPointType
> > LandmarkPointType;
> > LandmarkContainerType::Pointer sourceLandmarks =
> > LandmarkContainerType::New();
> > LandmarkContainerType::Pointer targetLandmarks =
> > LandmarkContainerType::New();
> >
> > vtkPolyDataReader *reader = vtkPolyDataReader::New();
> > reader->SetFileName( argv[2] );
> > reader->Update();
> > vtkPolyData *poly = vtkPolyData::New();
> > poly->DeepCopy( reader->GetOutput());
> > reader->Delete();
> > vtkPoints *points = poly->GetPoints();
> > int NumberOfTotalPoints = points->GetNumberOfPoints();
> >
> > unsigned int pointId = 0;
> > for ( int i = 0; i< NumberOfTotalPoints; i++)
> > {
> > double pos[3]; points->GetPoint(i,pos);
> >
> > double x = 0;
> > double y = 0;
> > double z = 0;
> >
> > if ( i < (int)NumberOfTotalPoints/2 ) {
> > x = 0.002*i;
> > y = 0.003*i;
> > z = 0.0001*i;
> > } else {
> > x = 0.002*(NumberOfTotalPoints-1-i);
> > y = 0.003*(NumberOfTotalPoints-1-i);
> > z = 0.0001* (NumberOfTotalPoints-1-i);
> > }
> >
> > std::cout << "generator 1 and 2 :: " << i << ": \t" << x << "\t" << y
> > << "\t" << z << std::endl;
> >
> > // Create source and target landmarks.
> > //
> > LandmarkPointType sourcePoint;
> > LandmarkPointType targetPoint;
> >
> > sourcePoint[0] = pos[0] ;
> > sourcePoint[1] = pos[1] ;
> > sourcePoint[2] = pos[2] ;
> >
> > targetPoint[0] = sourcePoint[0] + x ;
> > targetPoint[1] = sourcePoint[1] + y ;
> > targetPoint[2] = sourcePoint[2] + z ;
> >
> > sourceLandmarks->InsertElement( pointId, sourcePoint );
> > targetLandmarks->InsertElement( pointId, targetPoint );
> > pointId++;
> >
> > }
> >
> > deformer->SetSourceLandmarks( sourceLandmarks.GetPointer() );
> > deformer->SetTargetLandmarks( targetLandmarks.GetPointer() );
> >
> > std::cout << " Up to this point we are still okay...." << std::endl;
> >
> > try
> > {
> > deformer->UpdateLargestPossibleRegion();
> > }
> > catch( itk::ExceptionObject & excp )
> > {
> > std::cerr << "Exception thrown " << std::endl;
> > std::cerr << excp << std::endl;
> > return EXIT_FAILURE;
> > }
> >
> > std::cout << "the deformer is done at this point .... " << std::endl;
> >
> > DeformationFieldType::ConstPointer deformationField =
> > deformer->GetOutput();
> > typedef itk::WarpImageFilter< ImageType, ImageType,
> > DeformationFieldType > FilterType;
> >
> > FilterType::Pointer warper = FilterType::New();
> > typedef itk::LinearInterpolateImageFunction<
> > ImageType, double > InterpolatorType;
> >
> > InterpolatorType::Pointer interpolator = InterpolatorType::New();
> > warper->SetInterpolator( interpolator );
> > warper->SetOutputSpacing( deformationField->GetSpacing() );
> > warper->SetOutputOrigin( deformationField->GetOrigin() );
> > warper->SetDeformationField( deformationField );
> > warper->SetInput( Reader->GetOutput() );
> > Writer->SetInput( warper->GetOutput() );
> >
> >
> >
> > try
> > {
> > Writer->Update();
> > }
> > catch( itk::ExceptionObject & excp )
> > {
> > std::cerr << "Exception thrown " << std::endl;
> > std::cerr << excp << std::endl;
> > return EXIT_FAILURE;
> > }
> >
> >
> > return EXIT_SUCCESS;
> >
> > }
> >
> > // ---------------- end --------------------
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Insight-users mailing list
> > Insight-users at itk.org
> > http://www.itk.org/mailman/listinfo/insight-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://public.kitware.com/pipermail/insight-users/attachments/20060320/e0532546/attachment.html
More information about the Insight-users
mailing list