X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=registration%2FclitkBLUTDIRGenericFilter.cxx;h=15afacf1b475b6f734bee22854a01dc6d6625ae8;hb=f3c961676689a38cca96888462ddb9689d9e0217;hp=9640282ec800d2cf1d3a4aa622b3f244f6248c8d;hpb=2d83e4d660b0fb679977954c0ffcb8a34e8eb455;p=clitk.git diff --git a/registration/clitkBLUTDIRGenericFilter.cxx b/registration/clitkBLUTDIRGenericFilter.cxx old mode 100755 new mode 100644 index 9640282..15afacf --- a/registration/clitkBLUTDIRGenericFilter.cxx +++ b/registration/clitkBLUTDIRGenericFilter.cxx @@ -3,7 +3,7 @@ Program: vv http://www.creatis.insa-lyon.fr/rio/vv Authors belong to: - University of LYON http://www.universite-lyon.fr/ -- Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr +- Léon Bérard cancer center http://www.centreleonberard.fr - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr This software is distributed WITHOUT ANY WARRANTY; without even @@ -14,7 +14,7 @@ It is distributed under dual licence - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html -======================================================================-====*/ +===========================================================================**/ #ifndef clitkBLUTDIRGenericFilter_cxx #define clitkBLUTDIRGenericFilter_cxx @@ -28,6 +28,7 @@ It is distributed under dual licence ===================================================*/ #include "clitkBLUTDIRGenericFilter.h" +#include "clitkBLUTDIRCommandIterationUpdateDVF.h" namespace clitk { @@ -78,7 +79,7 @@ namespace clitk { InitializeImageType<2>(); InitializeImageType<3>(); - m_Verbose=true; + m_Verbose=false; } //=========================================================================// @@ -93,6 +94,8 @@ namespace clitk } if (m_ArgsInfo.output_given) SetOutputFilename(m_ArgsInfo.output_arg); + + if (m_ArgsInfo.verbose_given) m_Verbose=true; } //=========================================================================// @@ -127,8 +130,8 @@ namespace clitk typedef typename RegistrationType::FixedImageType FixedImageType; typedef typename FixedImageType::RegionType RegionType; itkStaticConstMacro(ImageDimension, unsigned int,FixedImageType::ImageDimension); - typedef clitk::BSplineDeformableTransform TransformType; - typedef clitk::BSplineDeformableTransformInitializer InitializerType; + typedef clitk::MultipleBSplineDeformableTransform TransformType; + typedef clitk::MultipleBSplineDeformableTransformInitializer InitializerType; typedef typename InitializerType::CoefficientImageType CoefficientImageType; typedef itk::CastImageFilter CastImageFilterType; typedef typename TransformType::ParametersType ParametersType; @@ -186,14 +189,20 @@ namespace clitk registration->SetMetric(metric); // Get the current coefficient image and make a COPY - typename itk::ImageDuplicator::Pointer caster=itk::ImageDuplicator::New(); - caster->SetInputImage(m_Initializer->GetTransform()->GetCoefficientImage()); - caster->Update(); - typename CoefficientImageType::Pointer currentCoefficientImage=caster->GetOutput(); + typename itk::ImageDuplicator::Pointer caster = itk::ImageDuplicator::New(); + std::vector currentCoefficientImages = m_Initializer->GetTransform()->GetCoefficientImages(); + for (unsigned i = 0; i < currentCoefficientImages.size(); ++i) + { + caster->SetInputImage(currentCoefficientImages[i]); + caster->Update(); + currentCoefficientImages[i] = caster->GetOutput(); + } + /* // Write the intermediate result? if (m_ArgsInfo.intermediate_given>=numberOfLevels) writeImage(currentCoefficientImage, m_ArgsInfo.intermediate_arg[currentLevel-2], m_ArgsInfo.verbose_flag); + */ // Set the new transform properties m_Initializer->SetImage(registration->GetFixedImagePyramid()->GetOutput(currentLevel-1)); @@ -231,7 +240,7 @@ namespace clitk // Set the previous transform parameters to the registration // if(m_Initializer->m_Parameters!=NULL )delete m_Initializer->m_Parameters; - m_Initializer->SetInitialParameters(currentCoefficientImage,*newParameters); + m_Initializer->SetInitialParameters(currentCoefficientImages, *newParameters); registration->SetInitialTransformParametersOfNextLevel(*newParameters); } } @@ -267,6 +276,8 @@ namespace clitk template void BLUTDIRGenericFilter::UpdateWithInputImageType() { + if (m_Verbose) std::cout << "BLUTDIRGenericFilter::UpdateWithInputImageType()" << std::endl; + //============================================================================= //Input //============================================================================= @@ -320,43 +331,46 @@ namespace clitk // If given, we connect a mask to reference or target //============================================================================ typedef itk::ImageMaskSpatialObject< InputImageType::ImageDimension > MaskType; - typename MaskType::Pointer fixedMask=NULL; + typedef itk::Image< unsigned char, InputImageType::ImageDimension > ImageLabelType; + typename MaskType::Pointer fixedMask = NULL; + typename ImageLabelType::Pointer labels = NULL; if (m_ArgsInfo.referenceMask_given) { - fixedMask= MaskType::New(); - typedef itk::Image< unsigned char,InputImageType::ImageDimension > ImageMaskType; - typedef itk::ImageFileReader< ImageMaskType > MaskReaderType; - typename MaskReaderType::Pointer maskReader = MaskReaderType::New(); - maskReader->SetFileName(m_ArgsInfo.referenceMask_arg); + fixedMask = MaskType::New(); + labels = ImageLabelType::New(); + typedef itk::ImageFileReader< ImageLabelType > LabelReaderType; + typename LabelReaderType::Pointer labelReader = LabelReaderType::New(); + labelReader->SetFileName(m_ArgsInfo.referenceMask_arg); try { - maskReader->Update(); + labelReader->Update(); } catch( itk::ExceptionObject & err ) { - std::cerr << "ExceptionObject caught while reading mask !" << std::endl; + std::cerr << "ExceptionObject caught while reading mask or labels !" << std::endl; std::cerr << err << std::endl; return; } if (m_Verbose)std::cout <<"Reference image mask was read..." < ResamplerType; + // Resample labels + typedef itk::ResampleImageFilter ResamplerType; typename ResamplerType::Pointer resampler = ResamplerType::New(); - typedef itk::NearestNeighborInterpolateImageFunction InterpolatorType; + typedef itk::NearestNeighborInterpolateImageFunction InterpolatorType; typename InterpolatorType::Pointer interpolator = InterpolatorType::New(); resampler->SetOutputParametersFromImage(fixedImage); resampler->SetInterpolator(interpolator); - resampler->SetInput(maskReader->GetOutput()); + resampler->SetInput(labelReader->GetOutput()); resampler->Update(); + labels = resampler->GetOutput(); // Set the image to the spatialObject - fixedMask->SetImage(resampler->GetOutput()); + fixedMask->SetImage(labels); // Find the bounding box of the "inside" label - typedef itk::LabelGeometryImageFilter GeometryImageFilterType; + typedef itk::LabelGeometryImageFilter GeometryImageFilterType; typename GeometryImageFilterType::Pointer geometryImageFilter=GeometryImageFilterType::New(); - geometryImageFilter->SetInput(resampler->GetOutput()); + geometryImageFilter->SetInput(labels); geometryImageFilter->Update(); typename GeometryImageFilterType::BoundingBoxType boundingBox = geometryImageFilter->GetBoundingBox(1); @@ -484,15 +498,15 @@ namespace clitk //======================================================= // B-LUT FFD Transform //======================================================= - typedef clitk::BSplineDeformableTransform TransformType; - typename TransformType::Pointer transform= TransformType::New(); - if (fixedMask) transform->SetMask( fixedMask ); - if (rigidTransform) transform->SetBulkTransform( rigidTransform ); + typedef clitk::MultipleBSplineDeformableTransform TransformType; + typename TransformType::Pointer transform = TransformType::New(); + if (labels) transform->SetLabels(labels); + if (rigidTransform) transform->SetBulkTransform(rigidTransform); //------------------------------------------------------------------------- // The transform initializer //------------------------------------------------------------------------- - typedef clitk::BSplineDeformableTransformInitializer< TransformType,FixedImageType> InitializerType; + typedef clitk::MultipleBSplineDeformableTransformInitializer< TransformType,FixedImageType> InitializerType; typename InitializerType::Pointer initializer = InitializerType::New(); initializer->SetVerbose(m_Verbose); initializer->SetImage(fixedImagePyramid->GetOutput(0)); @@ -658,6 +672,17 @@ namespace clitk command->SetMaximize(genericMetric->GetMaximize()); command->SetMetricRegion(metricRegion); registration->AddObserver( itk::IterationEvent(), command ); + + if (m_ArgsInfo.coeff_given) + { + std::cout << std::endl << "Output coefficient images every " << m_ArgsInfo.coeffEveryN_arg << " iterations." << std::endl; + typedef CommandIterationUpdateDVF DVFCommandType; + typename DVFCommandType::Pointer observerdvf = DVFCommandType::New(); + observerdvf->SetFixedImage(fixedImage); + observerdvf->SetTransform(transform); + observerdvf->SetArgsInfo(m_ArgsInfo); + optimizer->AddObserver( itk::IterationEvent(), observerdvf ); + } } @@ -696,12 +721,24 @@ namespace clitk if (m_ArgsInfo.coeff_given) { typedef typename TransformType::CoefficientImageType CoefficientImageType; - typename CoefficientImageType::Pointer coefficientImage =transform->GetCoefficientImage(); + std::vector coefficientImages = transform->GetCoefficientImages(); typedef itk::ImageFileWriter CoeffWriterType; - typename CoeffWriterType::Pointer coeffWriter=CoeffWriterType::New(); - coeffWriter->SetInput(coefficientImage); - coeffWriter->SetFileName(m_ArgsInfo.coeff_arg); - coeffWriter->Update(); + typename CoeffWriterType::Pointer coeffWriter = CoeffWriterType::New(); + unsigned nLabels = transform->GetnLabels(); + + std::string fname(m_ArgsInfo.coeff_arg); + int dotpos = fname.length() - 1; + while (dotpos >= 0 && fname[dotpos] != '.') + dotpos--; + + for (unsigned i = 0; i < nLabels; ++i) + { + std::ostringstream osfname; + osfname << fname.substr(0, dotpos) << '_' << i << fname.substr(dotpos); + coeffWriter->SetInput(coefficientImages[i]); + coeffWriter->SetFileName(osfname.str()); + coeffWriter->Update(); + } }