diff --git a/Modules/DiffusionImaging/DiffusionCore/Algorithms/Registration/mitkBatchedRegistration.cpp b/Modules/DiffusionImaging/DiffusionCore/Algorithms/Registration/mitkBatchedRegistration.cpp new file mode 100644 index 0000000000..da32c6ca8d --- /dev/null +++ b/Modules/DiffusionImaging/DiffusionCore/Algorithms/Registration/mitkBatchedRegistration.cpp @@ -0,0 +1,74 @@ +#include "mitkBatchedRegistration.h" +#include "mitkPyramidImageRegistrationMethod.h" +#include "mitkDiffusionImage.h" + +mitk::BatchedRegistration::BatchedRegistration() : + m_RegisteredImagesValid(false) +{ +} + +void mitk::BatchedRegistration::SetFixedImage(mitk::Image::Pointer& fixedImage) +{ + m_FixedImage = fixedImage; +} + +void mitk::BatchedRegistration::SetMovingReferenceImage(Image::Pointer &movingImage) +{ + m_MovingReference = movingImage; + m_RegisteredImagesValid = false; +} + +void mitk::BatchedRegistration::SetBatch(std::vector imageBatch) +{ + m_ImageBatch.clear(); + m_ImageBatch = imageBatch; +} + +std::vector mitk::BatchedRegistration::GetRegisteredImages() +{ + if (!m_RegisteredImagesValid) + { + m_RegisteredImages.clear(); + // First transform moving reference image + TransformType transf = GetTransformation(m_FixedImage, m_MovingReference); + // store it as first element in vector + m_RegisteredImages.push_back(ApplyTransformationToImage(m_MovingReference,transf)); + // apply transformation to whole batch + std::vector::const_iterator itEnd = m_ImageBatch.end(); + for (std::vector::iterator it = m_ImageBatch.begin(); it != itEnd; ++it) + { + m_RegisteredImages.push_back(ApplyTransformationToImage(*it,transf)); + } + } + return m_RegisteredImages; +} + +mitk::Image::Pointer mitk::BatchedRegistration::ApplyTransformationToImage(mitk::Image::Pointer &img, const mitk::BatchedRegistration::TransformType &transformation) const +{ + // TODO: perform some magic! + + if (dynamic_cast*> (img.GetPointer()) != NULL) // gaaaaahh template mist! + { + // apply transformation to image geometry as well as to all gradients !? + } + else + { + // do regular stuff + } + + return NULL; +} + +mitk::BatchedRegistration::TransformType mitk::BatchedRegistration::GetTransformation(mitk::Image::Pointer fixedImage, mitk::Image::Pointer movingImage) +{ + mitk::PyramidImageRegistrationMethod::Pointer registrationMethod = mitk::PyramidImageRegistrationMethod::New(); + registrationMethod->SetFixedImage( fixedImage ); + registrationMethod->SetTransformToRigid(); + registrationMethod->SetCrossModalityOn(); + registrationMethod->SetMovingImage(movingImage); + registrationMethod->Update(); + // TODO fancy shit, where you query and create a transformation type object thingy + TransformType transformation; + + return transformation; +} diff --git a/Modules/DiffusionImaging/DiffusionCore/Algorithms/Registration/mitkBatchedRegistration.h b/Modules/DiffusionImaging/DiffusionCore/Algorithms/Registration/mitkBatchedRegistration.h new file mode 100644 index 0000000000..093742c8e8 --- /dev/null +++ b/Modules/DiffusionImaging/DiffusionCore/Algorithms/Registration/mitkBatchedRegistration.h @@ -0,0 +1,74 @@ +#ifndef MITKBATCHEDREGISTRATION_H +#define MITKBATCHEDREGISTRATION_H + +// ITK +#include +// MITK +#include +#include "mitkCommon.h" +#include "mitkImage.h" + + +namespace mitk +{ +/** + * @brief The BatchedRegistration class Wrapper to calculate and apply a reference transformation to several images. + * + * Use if several pictures with the same world geometry are to be registered + * to one reference image, the registration is only computed once (for the moving image) and the geometry transformed for the complete + * image batch accordingly. Can handle image types that are usually not supported by registrations filters, e.g. fiber bundles and segmentations: + * these can be registered if a "registerable" image such as B0/T2 from which they are derived is supplied, since the transformation can be calculated + * on those and applied to the derived objects. + */ +class DiffusionCore_EXPORT BatchedRegistration : public itk::LightObject +{ +public: + + typedef vnl_matrix TransformType; + + BatchedRegistration(); + + void SetFixedImage(Image::Pointer &fixedImage); + void SetMovingReferenceImage(mitk::Image::Pointer& movingImage); + + void SetBatch(std::vector imageBatch); + + /** + * @brief GetRegisteredImages returns registered images , + * + * at position 0 the registered moving reference image is supplied followed all registered images from the batch. + */ + std::vector GetRegisteredImages(); + + mitk::Image::Pointer ApplyTransformationToImage(mitk::Image::Pointer& img, const TransformType& transformation) const; + + TransformType GetTransformation(mitk::Image::Pointer fixedImage, mitk::Image::Pointer movingImage); + +protected: + +private: + BatchedRegistration(const Self &); //purposely not implemented + void operator=(const Self &); //purposely not implemented + + bool m_RegisteredImagesValid; + + + mitk::Image::Pointer m_FixedImage; + mitk::Image::Pointer m_MovingReference; + + /** + * @brief m_ImageBatch List of images on which that the reference transformation is applied + * + */ + std::vector m_ImageBatch; + + /** + * @brief m_RegisteredImages List of references to registered images. + * + */ + std::vector m_RegisteredImages; + +}; + +} +#endif // MITKBATCHEDREGISTRATION_H diff --git a/Modules/DiffusionImaging/DiffusionCore/files.cmake b/Modules/DiffusionImaging/DiffusionCore/files.cmake index 063f891c42..c504e13ee0 100644 --- a/Modules/DiffusionImaging/DiffusionCore/files.cmake +++ b/Modules/DiffusionImaging/DiffusionCore/files.cmake @@ -1,135 +1,136 @@ set(CPP_FILES # DicomImport DicomImport/mitkDicomDiffusionImageReader.cpp # DicomImport/mitkGroupDiffusionHeadersFilter.cpp DicomImport/mitkDicomDiffusionImageHeaderReader.cpp DicomImport/mitkGEDicomDiffusionImageHeaderReader.cpp DicomImport/mitkPhilipsDicomDiffusionImageHeaderReader.cpp DicomImport/mitkSiemensDicomDiffusionImageHeaderReader.cpp DicomImport/mitkSiemensMosaicDicomDiffusionImageHeaderReader.cpp # DataStructures IODataStructures/mitkDiffusionCoreObjectFactory.cpp # DataStructures -> DWI IODataStructures/DiffusionWeightedImages/mitkDiffusionImageHeaderInformation.cpp IODataStructures/DiffusionWeightedImages/mitkDiffusionImageSource.cpp IODataStructures/DiffusionWeightedImages/mitkNrrdDiffusionImageReader.cpp IODataStructures/DiffusionWeightedImages/mitkNrrdDiffusionImageWriter.cpp IODataStructures/DiffusionWeightedImages/mitkNrrdDiffusionImageIOFactory.cpp IODataStructures/DiffusionWeightedImages/mitkNrrdDiffusionImageWriterFactory.cpp IODataStructures/DiffusionWeightedImages/mitkDiffusionImageSerializer.cpp IODataStructures/DiffusionWeightedImages/mitkImageToDiffusionImageSource.cpp IODataStructures/DiffusionWeightedImages/mitkDiffusionImageCorrectionFilter.cpp # DataStructures -> QBall IODataStructures/QBallImages/mitkQBallImageSource.cpp IODataStructures/QBallImages/mitkNrrdQBallImageReader.cpp IODataStructures/QBallImages/mitkNrrdQBallImageWriter.cpp IODataStructures/QBallImages/mitkNrrdQBallImageIOFactory.cpp IODataStructures/QBallImages/mitkNrrdQBallImageWriterFactory.cpp IODataStructures/QBallImages/mitkQBallImage.cpp IODataStructures/QBallImages/mitkQBallImageSerializer.cpp # DataStructures -> Tensor IODataStructures/TensorImages/mitkTensorImageSource.cpp IODataStructures/TensorImages/mitkNrrdTensorImageReader.cpp IODataStructures/TensorImages/mitkNrrdTensorImageWriter.cpp IODataStructures/TensorImages/mitkNrrdTensorImageIOFactory.cpp IODataStructures/TensorImages/mitkNrrdTensorImageWriterFactory.cpp IODataStructures/TensorImages/mitkTensorImage.cpp IODataStructures/TensorImages/mitkTensorImageSerializer.cpp #IODataStructures/mitkRegistrationObject.cpp # Rendering Rendering/vtkMaskedProgrammableGlyphFilter.cpp Rendering/mitkCompositeMapper.cpp Rendering/mitkVectorImageVtkGlyphMapper3D.cpp Rendering/vtkOdfSource.cxx Rendering/vtkThickPlane.cxx Rendering/mitkOdfNormalizationMethodProperty.cpp Rendering/mitkOdfScaleByProperty.cpp Rendering/mitkPlanarFigureMapper3D.cpp # Algorithms + Algorithms/Registration/mitkBatchedRegistration.cpp Algorithms/mitkPartialVolumeAnalysisHistogramCalculator.cpp Algorithms/mitkPartialVolumeAnalysisClusteringCalculator.cpp Algorithms/itkDwiGradientLengthCorrectionFilter.cpp # Registration Algorithms & Co. Algorithms/Registration/mitkPyramidImageRegistrationMethod.cpp # Function Collection mitkDiffusionFunctionCollection.cpp ) set(H_FILES # function Collection mitkDiffusionFunctionCollection.h # Rendering Rendering/mitkDiffusionImageMapper.h Rendering/mitkOdfVtkMapper2D.h Rendering/mitkPlanarFigureMapper3D.h # Reconstruction Algorithms/Reconstruction/itkDiffusionQballReconstructionImageFilter.h Algorithms/Reconstruction/mitkTeemDiffusionTensor3DReconstructionImageFilter.h Algorithms/Reconstruction/itkAnalyticalDiffusionQballReconstructionImageFilter.h Algorithms/Reconstruction/itkDiffusionMultiShellQballReconstructionImageFilter.h Algorithms/Reconstruction/itkPointShell.h Algorithms/Reconstruction/itkOrientationDistributionFunction.h Algorithms/Reconstruction/itkDiffusionIntravoxelIncoherentMotionReconstructionImageFilter.h Algorithms/Reconstruction/itkMultiShellAdcAverageReconstructionImageFilter.h Algorithms/Reconstruction/itkMultiShellRadialAdcKurtosisImageFilter.h # IO Datastructures IODataStructures/DiffusionWeightedImages/mitkDiffusionImage.h # Algorithms Algorithms/itkDiffusionQballGeneralizedFaImageFilter.h Algorithms/itkDiffusionQballPrepareVisualizationImageFilter.h Algorithms/itkTensorDerivedMeasurementsFilter.h Algorithms/itkBrainMaskExtractionImageFilter.h Algorithms/itkB0ImageExtractionImageFilter.h Algorithms/itkB0ImageExtractionToSeparateImageFilter.h Algorithms/itkTensorImageToDiffusionImageFilter.h Algorithms/itkTensorToL2NormImageFilter.h Algorithms/itkGaussianInterpolateImageFunction.h Algorithms/mitkPartialVolumeAnalysisHistogramCalculator.h Algorithms/mitkPartialVolumeAnalysisClusteringCalculator.h Algorithms/itkDiffusionTensorPrincipalDirectionImageFilter.h Algorithms/itkCartesianToPolarVectorImageFilter.h Algorithms/itkPolarToCartesianVectorImageFilter.h Algorithms/itkDistanceMapFilter.h Algorithms/itkProjectionFilter.h Algorithms/itkResidualImageFilter.h Algorithms/itkExtractChannelFromRgbaImageFilter.h Algorithms/itkTensorReconstructionWithEigenvalueCorrectionFilter.h Algorithms/itkMergeDiffusionImagesFilter.h Algorithms/itkDwiPhantomGenerationFilter.h Algorithms/itkFiniteDiffOdfMaximaExtractionFilter.h Algorithms/itkMrtrixPeakImageConverter.h Algorithms/itkFslPeakImageConverter.h Algorithms/itkShCoefficientImageImporter.h Algorithms/itkOdfMaximaExtractionFilter.h Algorithms/itkResampleDwiImageFilter.h Algorithms/itkDwiGradientLengthCorrectionFilter.h Algorithms/itkAdcImageFilter.h Algorithms/itkSplitDWImageFilter.h Algorithms/Registration/mitkDWIHeadMotionCorrectionFilter.h Algorithms/mitkDiffusionImageToDiffusionImageFilter.h ) set( TOOL_FILES )