Ejemplo n.º 1
0
static mitk::Image::Pointer TransformToReference(mitk::Image *reference, mitk::Image *moving, bool sincInterpol = false)
{
  // Convert to itk Images
  InputImageType::Pointer itkReference = InputImageType::New();
  InputImageType::Pointer itkMoving = InputImageType::New();
  mitk::CastToItkImage(reference,itkReference);
  mitk::CastToItkImage(moving,itkMoving);

  // Identify Transform
  typedef itk::IdentityTransform<double, 3> T_Transform;
  T_Transform::Pointer _pTransform = T_Transform::New();
  _pTransform->SetIdentity();

  typedef itk::WindowedSincInterpolateImageFunction< InputImageType, 3> WindowedSincInterpolatorType;
  WindowedSincInterpolatorType::Pointer sinc_interpolator = WindowedSincInterpolatorType::New();

  typedef itk::ResampleImageFilter<InputImageType, InputImageType>  ResampleFilterType;


  ResampleFilterType::Pointer resampler = ResampleFilterType::New();
  resampler->SetInput(itkMoving);
  resampler->SetReferenceImage( itkReference );
  resampler->UseReferenceImageOn();
  resampler->SetTransform(_pTransform);
  resampler->SetInterpolator(sinc_interpolator);
  resampler->Update();

  // Convert back to mitk
  mitk::Image::Pointer result = mitk::Image::New();
  result->InitializeByItk(resampler->GetOutput());
  GrabItkImageMemory( resampler->GetOutput() , result );
  return result;
}
Ejemplo n.º 2
0
FilterImageType::Pointer gaussTransform(const FilterImageType::Pointer sourceImage, FilterImageType::SizeType destSize, 
										float gaussSigma, const BaseTransformType *transform) {
std::cerr << "Filter, Transformation and Output start" << std::endl;
	itk::TimeProbesCollectorBase collector;
	collector.Start( "Filter, Transformation and Output" );
	collector.Start( "Filter" );
std::cerr << "dbg:" << __FILE__ << " line:" << __LINE__ << std::endl;

	FilterImageType::SizeType sourceSize = sourceImage->GetBufferedRegion().GetSize();
std::cerr << "dbg:" << __FILE__ << " line:" << __LINE__ << std::endl;

	FilterImageType::ConstPointer temp;
#ifdef useFastMemoryHungryGaussian
	{
		GaussFilterType::Pointer filter = GaussFilterType::New();
		filter->SetDirection( 0 );   // 0 --> X direction
		filter->SetOrder( GaussFilterType::ZeroOrder );
		filter->SetSigma( gaussSigma );
		filter->SetInput( sourceImage );
std::cerr << "dbg:" << __FILE__ << " line:" << __LINE__ << std::endl;
		try { filter->Update(); }
		catch( itk::ExceptionObject & excep ) { std::cerr << "Exception caught !" << std::endl << excep << std::endl; }
		temp = filter->GetOutput();
	}
	{
		GaussFilterType::Pointer filter = GaussFilterType::New();
		filter->SetDirection( 1 );   // 1 --> Y direction
		filter->SetOrder( GaussFilterType::ZeroOrder );
		filter->SetSigma( gaussSigma );
		filter->SetInput( temp );
std::cerr << "dbg:" << __FILE__ << " line:" << __LINE__ << std::endl;
		try { filter->Update(); }
		catch( itk::ExceptionObject & excep ) { std::cerr << "Exception caught !" << std::endl << excep << std::endl; }
		temp = filter->GetOutput();
	}
	{
		GaussFilterType::Pointer filter = GaussFilterType::New();
		filter->SetDirection( 2 );   // 2 --> Z direction
		filter->SetOrder( GaussFilterType::ZeroOrder );
		filter->SetSigma( gaussSigma );
		filter->SetInput( temp );
std::cerr << "dbg:" << __FILE__ << " line:" << __LINE__ << std::endl;
		try { filter->Update(); }
		catch( itk::ExceptionObject & excep ) { std::cerr << "Exception caught !" << std::endl << excep << std::endl; }
		temp = filter->GetOutput();
	}
#else
	{
		GaussFilterType::Pointer filter = GaussFilterType::New();
		filter->SetUseImageSpacingOn();
		filter->SetVariance( std::sqrt(gaussSigma) );
		filter->SetInput( sourceImage );
std::cerr << "dbg:" << __FILE__ << " line:" << __LINE__ << std::endl;
		try { filter->Update(); }
		catch( itk::ExceptionObject & excep ) { std::cerr << "Exception caught !" << std::endl << excep << std::endl; }
		temp = filter->GetOutput();
	}
#endif

	collector.Stop( "Filter" );
	InterpolatorType::Pointer interpolator = InterpolatorType::New();
	ResampleFilterType::Pointer resampler = ResampleFilterType::New();
	resampler->SetInterpolator( interpolator );

	IdentityTransformType::Pointer identPointer;
	if (transform == NULL) {
			identPointer  = IdentityTransformType::New();
			transform = identPointer;
	}

	resampler->SetTransform( transform );
	FilterImageType::SpacingType destSpacing;
	for(unsigned int i = 0; i < Dimension; ++i) {
		destSpacing[i] = sourceImage->GetSpacing()[i] * float(sourceSize[i]) / float(destSize[i]);
	}
	resampler->SetInput( temp );
std::cerr << "dbg:" << __FILE__ << " line:" << __LINE__ << std::endl;
	resampler->SetSize( destSize );
	resampler->SetOutputSpacing( destSpacing );
	resampler->SetOutputOrigin( sourceImage->GetOrigin() );
	resampler->SetDefaultPixelValue( 0 );
std::cerr << "dbg:" << __FILE__ << " line:" << __LINE__ << std::endl;

	FilterImageType::Pointer result;
	try { resampler->Update(); result = resampler->GetOutput(); }
	catch( itk::ExceptionObject & excep ) { std::cerr << "Exception caught !" << std::endl << excep << std::endl; }
std::cerr << "dbg:" << __FILE__ << " line:" << __LINE__ << std::endl;
	collector.Stop( "Filter, Transformation and Output" );
	collector.Report();
std::cerr << "Filter, Transformation and Output end" << std::endl;

	return result;
}
Ejemplo n.º 3
0
void mitk::RegistrationWrapper::ApplyTransformationToImage(mitk::Image::Pointer img, const mitk::RegistrationWrapper::RidgidTransformType &transformation,double* offset, mitk::Image* resampleReference,  bool binary)
{
  typedef mitk::DiffusionImage<short> DiffusionImageType;

  if (dynamic_cast<DiffusionImageType*> (img.GetPointer()) == NULL)
  {

    ItkImageType::Pointer itkImage = ItkImageType::New();


    MITK_ERROR << "imgCopy  0 " <<  "/" << img->GetReferenceCount();
    MITK_ERROR << "pixel type  " << img->GetPixelType().GetComponentTypeAsString();

    CastToItkImage(img, itkImage);



    typedef itk::Euler3DTransform< double > RigidTransformType;
    RigidTransformType::Pointer rtransform = RigidTransformType::New();
    RigidTransformType::ParametersType parameters(RigidTransformType::ParametersDimension);

    for (int i = 0; i<6;++i)
      parameters[i] = transformation[i];

    rtransform->SetParameters( parameters );

    mitk::Point3D origin = itkImage->GetOrigin();
    origin[0]-=offset[0];
    origin[1]-=offset[1];
    origin[2]-=offset[2];

    mitk::Point3D newOrigin = rtransform->GetInverseTransform()->TransformPoint(origin);

    itk::Matrix<double,3,3> dir = itkImage->GetDirection();
    itk::Matrix<double,3,3> transM  ( vnl_inverse(rtransform->GetMatrix().GetVnlMatrix()));
    itk::Matrix<double,3,3> newDirection = transM * dir;

    itkImage->SetOrigin(newOrigin);
    itkImage->SetDirection(newDirection);

    // Perform Resampling if reference image is provided
    if (resampleReference != NULL)
    {
      typedef itk::ResampleImageFilter<ItkImageType, ItkImageType>  ResampleFilterType;

      ItkImageType::Pointer itkReference = ItkImageType::New();
      CastToItkImage(resampleReference,itkReference);

      typedef itk::WindowedSincInterpolateImageFunction< ItkImageType, 3> WindowedSincInterpolatorType;
      WindowedSincInterpolatorType::Pointer sinc_interpolator = WindowedSincInterpolatorType::New();

      typedef itk::NearestNeighborInterpolateImageFunction< ItkImageType, double > NearestNeighborInterpolatorType;
      NearestNeighborInterpolatorType::Pointer nn_interpolator = NearestNeighborInterpolatorType::New();


      ResampleFilterType::Pointer resampler = ResampleFilterType::New();
      resampler->SetInput(itkImage);
      resampler->SetReferenceImage( itkReference );
      resampler->UseReferenceImageOn();
      if (binary)
        resampler->SetInterpolator(nn_interpolator);
      else
        resampler->SetInterpolator(sinc_interpolator);

      resampler->Update();

      GrabItkImageMemory(resampler->GetOutput(), img);
    }
    else
    {
      // !! CastToItk behaves very differently depending on the original data type
      // if the target type is the same as the original, only a pointer to the data is set
      // and an additional GrabItkImageMemory will cause a segfault when the image is destroyed
      // GrabItkImageMemory - is not necessary in this case since we worked on the original data
      // See Bug 17538.
      if (img->GetPixelType().GetComponentTypeAsString() != "double")
        img = GrabItkImageMemory(itkImage);
    }
  }
  else
  {
    DiffusionImageType::Pointer diffImages = dynamic_cast<DiffusionImageType*>(img.GetPointer());

    typedef itk::Euler3DTransform< double > RigidTransformType;
    RigidTransformType::Pointer rtransform = RigidTransformType::New();
    RigidTransformType::ParametersType parameters(RigidTransformType::ParametersDimension);

    for (int i = 0; i<6;++i)
    {
      parameters[i] = transformation[i];
    }

    rtransform->SetParameters( parameters );

    mitk::Point3D b0origin = diffImages->GetVectorImage()->GetOrigin();
    b0origin[0]-=offset[0];
    b0origin[1]-=offset[1];
    b0origin[2]-=offset[2];

    mitk::Point3D newOrigin = rtransform->GetInverseTransform()->TransformPoint(b0origin);

    itk::Matrix<double,3,3> dir = diffImages->GetVectorImage()->GetDirection();
    itk::Matrix<double,3,3> transM  ( vnl_inverse(rtransform->GetMatrix().GetVnlMatrix()));
    itk::Matrix<double,3,3> newDirection = transM * dir;

    diffImages->GetVectorImage()->SetOrigin(newOrigin);
    diffImages->GetVectorImage()->SetDirection(newDirection);
    diffImages->Modified();

    mitk::DiffusionImageCorrectionFilter<short>::Pointer correctionFilter = mitk::DiffusionImageCorrectionFilter<short>::New();

    // For Diff. Images: Need to rotate the gradients (works in-place)
    correctionFilter->SetImage(diffImages);
    correctionFilter->CorrectDirections(transM.GetVnlMatrix());
    img = diffImages;
  }
}