[Insight-users] Image-Registration Output-Direction
Yusuf OEZBEK
nasil122002 at yahoo.de
Sat Dec 11 15:51:06 EST 2010
Hallo,
I wanted to have my MI-Registration in sagittal and coronal view. I made the
registration in ITK and I presented it with VTK. But the output-direction is
only in the axial-slice. How can I get the registration in sagittal and coronal
view represent?
Thanks
Here is my Code:
const unsigned int Dimension = 2;
typedef unsigned short PixelType;
typedef itk::Image< PixelType, Dimension > FixedImageType;
typedef itk::Image< PixelType, Dimension > MovingImageType;
typedef itk::TranslationTransform< double, Dimension > TransformType;
typedef itk::RegularStepGradientDescentOptimizer OptimizerType;
typedef itk::LinearInterpolateImageFunction< MovingImageType,double >
InterpolatorType;
typedef itk::ImageRegistrationMethod<FixedImageType,MovingImageType>
RegistrationType;
typedef
itk::MattesMutualInformationImageToImageMetric<FixedImageType,MovingImageType >
MetricType;
TransformType::Pointer transform= TransformType::New();
OptimizerType::Pointer optimizer= OptimizerType::New();
InterpolatorType::Pointer interpolator= InterpolatorType::New();
RegistrationType::Pointer registration= RegistrationType::New();
registration->SetOptimizer(optimizer);
registration->SetTransform(transform);
registration->SetInterpolator(interpolator);
MetricType::Pointer metric = MetricType::New();
registration->SetMetric( metric );
unsigned int numberOfBins = 24;
unsigned int numberOfSamples = 10000;
numberOfBins =24;
numberOfSamples =10000;
metric->SetNumberOfHistogramBins( numberOfBins );
metric->SetNumberOfSpatialSamples( numberOfSamples );
metric->SetUseExplicitPDFDerivatives(4);
typedef itk::ImageFileReader< FixedImageType > FixedImageReaderType;
typedef itk::ImageFileReader< MovingImageType > MovingImageReaderType;
FixedImageReaderType::Pointer fixedImageReader =
FixedImageReaderType::New();
MovingImageReaderType::Pointer movingImageReader =
MovingImageReaderType::New();
//std::cout<<"pfad"<<filesSecondFusion.at((int)this->sliderFusion2->value()).c_str()<<endl;
fixedImageReader->SetFileName(filesFirstFusion.at((int)this->sliderFusion1->value()).c_str());
movingImageReader->SetFileName(filesSecondFusion.at((int)this->sliderFusion2->value()).c_str());
registration->SetFixedImage(fixedImageReader->GetOutput());
registration->SetMovingImage(movingImageReader->GetOutput());
fixedImageReader->Update();
registration->SetFixedImageRegion(fixedImageReader->GetOutput()->GetBufferedRegion());
typedef RegistrationType::ParametersType ParametersType;
ParametersType initialParameters( transform->GetNumberOfParameters() );
initialParameters[0] = 0.0; // Initial offset in mm along X
initialParameters[1] = 0.0; // Initial offset in mm along Y
registration->SetInitialTransformParameters( initialParameters );
optimizer->MinimizeOn();
optimizer->SetMaximumStepLength(2.00);
optimizer->SetMinimumStepLength(0.001);
optimizer->SetNumberOfIterations(2000);
optimizer->SetRelaxationFactor(0.8);
ParametersType finalParameters = registration->GetLastTransformParameters();
double TranslationAlongX= finalParameters[0];
double TranslationAlongY= finalParameters[1];
unsigned int numberOfIterations = optimizer->GetCurrentIteration();
double bestValue = optimizer->GetValue();
std::cout << "Result = " << std::endl;
std::cout << " Translation X = " << TranslationAlongX << std::endl;
std::cout << " Translation Y = " << TranslationAlongY << std::endl;
std::cout << " Iterations = " << numberOfIterations << std::endl;
std::cout << " Metric value = " << bestValue << std::endl;
std::cout << " Stop Condition = " << optimizer->GetStopCondition() <<
std::endl;
typedef itk::ResampleImageFilter<MovingImageType,FixedImageType>
ResampleFilterType;
TransformType::Pointer finalTransform = TransformType::New();
finalTransform->SetParameters(finalParameters);
finalTransform->SetFixedParameters( transform->GetFixedParameters() );
ResampleFilterType::Pointer resample = ResampleFilterType::New();
resample->SetTransform( finalTransform );
resample->SetInput( movingImageReader->GetOutput() );
FixedImageType::Pointer fixedImage = fixedImageReader->GetOutput();
PixelType defaultPixelValue= 100;
defaultPixelValue= 100;
resample->SetSize(fixedImage->GetLargestPossibleRegion().GetSize());
resample->SetOutputOrigin(fixedImage->GetOrigin());
resample->SetOutputSpacing(fixedImage->GetSpacing());
resample->SetOutputDirection(fixedImage->GetDirection());
resample->SetDefaultPixelValue(defaultPixelValue);
typedef unsigned char OutputPixelType;
typedef itk::Image<OutputPixelType, Dimension> OutputImageType;
typedef itk::CastImageFilter<FixedImageType,OutputImageType> CastFilterType;
typedef itk::ImageFileWriter<OutputImageType> WriterType;
WriterType::Pointer writer= WriterType::New();
CastFilterType::Pointer caster= CastFilterType::New();
writer->SetFileName("registration1.jpg");
caster->SetInput(resample->GetOutput());
writer->SetInput(caster->GetOutput());
writer->Update();
typedef itk::CheckerBoardImageFilter< FixedImageType >
CheckerBoardFilterType;
CheckerBoardFilterType::Pointer checker = CheckerBoardFilterType::New();
checker->SetInput1(fixedImage);
checker->SetInput2(resample->GetOutput());
if(imageRegistrationCheckerboardChoice->value()== 0){
unsigned int checkerArray[3]= {2,2,2};
checker->SetCheckerPattern(checkerArray);
}
if(imageRegistrationCheckerboardChoice->value()== 1){
unsigned int checkerArray[3]= {4,4,4};
checker->SetCheckerPattern(checkerArray);
}
if(imageRegistrationCheckerboardChoice->value()== 2){
unsigned int checkerArray[3]= {8,8,8};
checker->SetCheckerPattern(checkerArray);
}
if(imageRegistrationCheckerboardChoice->value()== 3){
unsigned int checkerArray[3]= {16,16,16};
checker->SetCheckerPattern(checkerArray);
}
caster->SetInput(checker->GetOutput());
writer->SetInput(caster->GetOutput() );
resample->SetDefaultPixelValue(100);
// Before registration
TransformType::Pointer identityTransform = TransformType::New();
identityTransform->SetIdentity();
resample->SetTransform( identityTransform );
writer->SetFileName("registration2.jpg");
writer->Update();
// After registration
resample->SetTransform( finalTransform );
writer->SetFileName("registration3.jpg");
writer->Update();
typedef itk::VTKImageExport< OutputImageType > ExportFilterType;
ExportFilterType::Pointer itkExporter = ExportFilterType::New();
itkExporter->SetInput(caster->GetOutput() );
vtkImageImport* vtkImporter = vtkImageImport::New();
ConnectPipelines(itkExporter, vtkImporter);
vtkImporter->Update();
modeFusion = vtkInteractorStyleTrackballCamera::New();
rendererFusion = vtkRenderer::New();
renderWindowFusion = vtkRenderWindow::New();
renderWindowFusion->AddRenderer(rendererFusion);
imageFusionBox->SetRenderWindow(renderWindowFusion);
imageFusionBox->SetInteractorStyle(modeFusion);
imageFusionBox->Initialize();
imgFirstColorMap = vtkLookupTable::New();
imgFirstColorMap->SetTableRange(-250, 1200);
imgFirstColorMap->SetSaturationRange(0,0);
imgFirstColorMap->SetHueRange(0, 0);
imgFirstColorMap->SetValueRange(0, 2);
imgFirstColorMap->Build();
firstColorMapper = vtkImageMapToColors::New();
firstColorMapper->SetInput(vtkImporter->GetOutput());
firstColorMapper->SetLookupTable(imgFirstColorMap);
imgFusionMIActor = vtkImageActor::New();
imgFusionMIActor->SetInput(firstColorMapper->GetOutput());
imgFusionMIActor->SetOpacity(1.0);
cameraFusion = vtkCamera::New();
cameraFusion->SetViewUp(0, 0, -1);
cameraFusion->SetPosition(0, 1, 0);
cameraFusion->SetFocalPoint(0, 0, 0);
cameraFusion->ComputeViewPlaneNormal();
cameraFusion->Roll(-90);
cameraFusion->Azimuth(90);
cameraFusion->Roll(90);
rendererFusion->AddActor(imgFusionMIActor);
rendererFusion->SetActiveCamera(cameraFusion);
rendererFusion->ResetCamera();
cameraFusion->Dolly(1.7);
rendererFusion->ResetCameraClippingRange();
Mit freundlichen Grüßen
Yusuf ÖZBEK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20101211/3ee58d62/attachment.htm>
More information about the Insight-users
mailing list