diff --git a/Modules/DiffusionImaging/DiffusionCore/IODataStructures/DiffusionWeightedImages/mitkImageToDiffusionImageSource.cpp b/Modules/DiffusionImaging/DiffusionCore/IODataStructures/DiffusionWeightedImages/mitkImageToDiffusionImageSource.cpp new file mode 100644 index 0000000000..628e34e963 --- /dev/null +++ b/Modules/DiffusionImaging/DiffusionCore/IODataStructures/DiffusionWeightedImages/mitkImageToDiffusionImageSource.cpp @@ -0,0 +1,165 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#ifndef __mitk_ImageToDiffusionImageSource_txx +#define __mitk_ImageToDiffusionImageSource_txx + +#include "mitkImageToDiffusionImageSource.h" + +#include +#include + +#include "mitkImageTimeSelector.h" + +#include +#include + +#include "mitkImageCast.h" + +#include "mitkException.h" + +template< typename TPixelType> +mitk::ImageToDiffusionImageSource::ImageToDiffusionImageSource() + : m_SourceImage(0), + m_GradientDirections(0) +{ + +} + +template< typename TPixelType> +void mitk::ImageToDiffusionImageSource +::GenerateOutputInformation() +{ + // sanity checks ( input not null, timesteps corresponds to number of directions specified ) + if( m_GradientDirections->empty() ) + { + mitkThrow() << "No gradient directions were set. Cannot proceed."; + } + + if( m_SourceImage.IsNull() ) + { + mitkThrow() << "No input image was set. Cannot proceed."; + } + + if( m_GradientDirections->size() != m_SourceImage->GetTimeSteps() ) + { + mitkThrow() << "Size mismatch between container size " << m_GradientDirections->size() << + "and image volumes."<< m_SourceImage->GetTimeSteps() <<" Cannot proceed."; + } + + + // already pass in the meta-data + typename OutputType::Pointer metaImage = OutputType::New(); + + // set directions and bvalue + metaImage->SetDirections(this->m_GradientDirections); + metaImage->SetB_Value(this->m_BValue); + + // set identity as measurement frame + vnl_matrix_fixed< double, 3, 3 > measurement_frame; + measurement_frame.set_identity(); + metaImage->SetMeasurementFrame( measurement_frame ); + + + m_OutputCache = metaImage; + m_CacheTime.Modified(); + +} + +template< typename TPixelType> +void mitk::ImageToDiffusionImageSource +::GenerateData() +{ + if ( ( ! m_OutputCache ) || ( this->GetMTime( ) > m_CacheTime.GetMTime( ) ) ) + { + this->GenerateOutputInformation(); + itkWarningMacro("Cache regenerated!"); + } + + // now cast the mitk image to the vector image and pass in as volume + typedef itk::Image< TPixelType, 4 > InputItkType; + typedef itk::Image< TPixelType, 3> SingleVolumeType; + typedef itk::VectorImage< TPixelType, 3> VectorImageType; + + typedef itk::ComposeImageFilter< SingleVolumeType > ComposeFilterType; + typename ComposeFilterType::Pointer vec_composer = ComposeFilterType::New(); + + typename InputItkType::Pointer itkImage; + //mitk::CastToItkImage(m_SourceImage, itkImage); +/* + typename InputItkType::RegionType lpr;// = itkImage->GetLargestPossibleRegion(); + typename InputItkType::SizeType extract_size = lpr.GetSize(); + extract_size[3] = 0; + + unsigned int* dimensions = m_SourceImage->GetDimensions(); + extract_size[0] = dimensions[0]; + extract_size[1] = dimensions[1]; + extract_size[2] = dimensions[2]; + + typename InputItkType::IndexType extract_index = lpr.GetIndex(); + extract_index.Fill() + + + typename InputItkType::RegionType exr; + exr.SetSize( extract_size ); + exr.SetIndex( extract_index ); +*/ + mitk::ImageTimeSelector::Pointer t_selector = + mitk::ImageTimeSelector::New(); + + t_selector->SetInput( m_SourceImage ); + + + for( unsigned int i=0; i< m_SourceImage->GetTimeSteps(); i++) + { + t_selector->SetTimeNr(i); + t_selector->Update(); + + typename SingleVolumeType::Pointer singleImageItk; + mitk::CastToItkImage( t_selector->GetOutput(), singleImageItk ); + + vec_composer->SetInput( i, singleImageItk ); + + } + + try + { + vec_composer->Update(); + } + catch( const itk::ExceptionObject& e) + { + MITK_ERROR << "Caugt exception while updating compose filter: " << e.what(); + } + + + m_OutputCache->SetVectorImage( vec_composer->GetOutput() ); + + // transfer to the output image + static_cast(this->GetOutput()) + ->SetVectorImage(m_OutputCache->GetVectorImage()); + static_cast(this->GetOutput()) + ->SetB_Value(m_OutputCache->GetB_Value()); + static_cast(this->GetOutput()) + ->SetDirections(m_OutputCache->GetDirections()); + static_cast(this->GetOutput()) + ->SetMeasurementFrame(m_OutputCache->GetMeasurementFrame()); + static_cast(this->GetOutput()) + ->InitializeFromVectorImage(); + + +} + +#endif //__mitk_ImageToDiffusionImageSource_txx diff --git a/Modules/DiffusionImaging/DiffusionCore/IODataStructures/DiffusionWeightedImages/mitkImageToDiffusionImageSource.h b/Modules/DiffusionImaging/DiffusionCore/IODataStructures/DiffusionWeightedImages/mitkImageToDiffusionImageSource.h new file mode 100644 index 0000000000..c3e2cc4fa4 --- /dev/null +++ b/Modules/DiffusionImaging/DiffusionCore/IODataStructures/DiffusionWeightedImages/mitkImageToDiffusionImageSource.h @@ -0,0 +1,90 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#ifndef MITKIMAGETODIFFUSIONIMAGESOURCE_H +#define MITKIMAGETODIFFUSIONIMAGESOURCE_H + +#include "mitkDiffusionImageSource.h" + +namespace mitk +{ +template< typename TPixelType > +class ImageToDiffusionImageSource + : public DiffusionImageSource< TPixelType > +{ +public: + + typedef vnl_vector_fixed< double, 3 > GradientDirectionType; + typedef vnl_matrix_fixed< double, 3, 3 > MeasurementFrameType; + typedef itk::VectorContainer< unsigned int, + GradientDirectionType >::Pointer GradientDirectionContainerType; + + mitkClassMacro( ImageToDiffusionImageSource, + DiffusionImageSource ) + + itkSimpleNewMacro(Self) + + typedef typename Superclass::OutputType OutputType; + typedef itk::VectorImage ImageType; + + /** + * @brief Set the mitk image ( a 3d+t image ) which is to be reinterpreted as dw image + * @param mitkImage + */ + void SetImage( mitk::Image::Pointer mitkImage ) + { + m_SourceImage = mitkImage; + } + + /** + * @brief Set the gradient directions corresponding to the volumes of the input image + * @param container the container with the gradient directions + * + * @note The gradient directions must correspond to the volumes stored in the 3d+t input + */ + void SetGradientDirections( GradientDirectionContainerType container ) + { + m_GradientDirections = container; + } + + void SetBValue( float bvalue ) + { + this->m_BValue = bvalue; + } + + +protected: + ImageToDiffusionImageSource(); + virtual ~ImageToDiffusionImageSource(){} + + virtual void GenerateData(); + + virtual void GenerateOutputInformation(); + + mitk::Image::Pointer m_SourceImage; + GradientDirectionContainerType m_GradientDirections; + + typename OutputType::Pointer m_OutputCache; + itk::TimeStamp m_CacheTime; + + float m_BValue; +}; + + +} + +#include "mitkImageToDiffusionImageSource.cpp" +#endif // MITKIMAGETODIFFUSIONIMAGESOURCE_H diff --git a/Modules/DiffusionImaging/DiffusionCore/files.cmake b/Modules/DiffusionImaging/DiffusionCore/files.cmake index c46cbcea09..971532ea80 100644 --- a/Modules/DiffusionImaging/DiffusionCore/files.cmake +++ b/Modules/DiffusionImaging/DiffusionCore/files.cmake @@ -1,128 +1,130 @@ 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 # 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/mitkPartialVolumeAnalysisHistogramCalculator.cpp Algorithms/mitkPartialVolumeAnalysisClusteringCalculator.cpp Algorithms/itkDwiGradientLengthCorrectionFilter.cpp # Registration Algorithms & Co. Algorithms/Registration/mitkPyramidImageRegistrationMethod.cpp + Algorithms/Registration/mitkDWIHeadMotionCorrectionFilter.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 ) set( TOOL_FILES )