diff --git a/Modules/DiffusionImaging/Algorithms/itkMergeDiffusionImagesFilter.h b/Modules/DiffusionImaging/Algorithms/itkMergeDiffusionImagesFilter.h index 92f9a0759c..7eafe31b16 100644 --- a/Modules/DiffusionImaging/Algorithms/itkMergeDiffusionImagesFilter.h +++ b/Modules/DiffusionImaging/Algorithms/itkMergeDiffusionImagesFilter.h @@ -1,100 +1,99 @@ /*=================================================================== 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. ===================================================================*/ /*========================================================================= Program: Tensor ToolKit - TTK Module: $URL: svn://scm.gforge.inria.fr/svn/ttk/trunk/Algorithms/itkMergeDiffusionImagesFilter.h $ Language: C++ Date: $Date: 2010-06-07 13:39:13 +0200 (Mo, 07 Jun 2010) $ Version: $Revision: 68 $ Copyright (c) INRIA 2010. All rights reserved. See LICENSE.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #ifndef _itk_MergeDiffusionImagesFilter_h_ #define _itk_MergeDiffusionImagesFilter_h_ #include "itkImageToImageFilter.h" #include #include #include namespace itk { template class MergeDiffusionImagesFilter : public ImageSource > { public: typedef itk::VectorImage DwiImageType; typedef MergeDiffusionImagesFilter Self; typedef ImageSource Superclass; typedef SmartPointer Pointer; typedef SmartPointer ConstPointer; typedef typename DwiImageType::PixelType DwiPixelType; typedef typename DwiImageType::RegionType DwiRegionType; typedef typename std::vector< typename DwiImageType::Pointer > DwiImageContainerType; typedef vnl_vector_fixed< double, 3 > GradientType; typedef itk::VectorContainer< unsigned int, GradientType > GradientListType; typedef typename std::vector< GradientListType::Pointer > GradientListContainerType; - itkTypeMacro (MergeDiffusionImagesFilter, ImageToImageFilter) - itkStaticConstMacro (ImageDimension, unsigned int, DwiImageType::ImageDimension); - itkNewMacro (Self) + itkTypeMacro(MergeDiffusionImagesFilter, ImageToImageFilter) + itkNewMacro(Self) - void SetImageVolumes(DwiImageContainerType cont){ m_ImageVolumes=cont; } - void SetGradientLists(GradientListContainerType cont){ m_GradientLists=cont; } - void SetBValues(std::vector< double > cont){ m_BValues=cont; } + void SetImageVolumes(DwiImageContainerType cont); + void SetGradientLists(GradientListContainerType cont); + void SetBValues(std::vector< double > bvals); - GradientListType::Pointer GetOutputGradients(){ return m_OutputGradients; } - double GetBValue(){ return m_BValue; } + GradientListType::Pointer GetOutputGradients(); + double GetBValue(); protected: - MergeDiffusionImagesFilter(){} - ~MergeDiffusionImagesFilter(){} + MergeDiffusionImagesFilter(); + ~MergeDiffusionImagesFilter(); void GenerateData(); DwiImageContainerType m_ImageVolumes; GradientListContainerType m_GradientLists; std::vector< double > m_BValues; int m_NumGradients; GradientListType::Pointer m_OutputGradients; double m_BValue; }; } // end of namespace #ifndef ITK_MANUAL_INSTANTIATION #include "itkMergeDiffusionImagesFilter.txx" #endif #endif diff --git a/Modules/DiffusionImaging/Algorithms/itkMergeDiffusionImagesFilter.txx b/Modules/DiffusionImaging/Algorithms/itkMergeDiffusionImagesFilter.txx index 9dd0e145f1..e030a5c3c6 100644 --- a/Modules/DiffusionImaging/Algorithms/itkMergeDiffusionImagesFilter.txx +++ b/Modules/DiffusionImaging/Algorithms/itkMergeDiffusionImagesFilter.txx @@ -1,128 +1,175 @@ /*=================================================================== 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. ===================================================================*/ /*========================================================================= 2 3 Program: Tensor ToolKit - TTK 4 Module: $URL: svn://scm.gforge.inria.fr/svn/ttk/trunk/Algorithms/itkMergeDiffusionImagesFilter.txx $ 5 Language: C++ 6 Date: $Date: 2010-06-07 13:39:13 +0200 (Mo, 07 Jun 2010) $ 7 Version: $Revision: 68 $ 8 9 Copyright (c) INRIA 2010. All rights reserved. 10 See LICENSE.txt for details. 11 12 This software is distributed WITHOUT ANY WARRANTY; without even 13 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 14 PURPOSE. See the above copyright notices for more information. 15 16 =========================================================================*/ #ifndef _itk_MergeDiffusionImagesFilter_txx_ #define _itk_MergeDiffusionImagesFilter_txx_ #endif #include "itkMergeDiffusionImagesFilter.h" #include "itkTensorToL2NormImageFilter.h" #include "itkRescaleIntensityImageFilter.h" #include #include #include namespace itk { +template +MergeDiffusionImagesFilter::MergeDiffusionImagesFilter() +{ + +} + +template +MergeDiffusionImagesFilter::~MergeDiffusionImagesFilter() +{ + +} + +template +void MergeDiffusionImagesFilter +::SetImageVolumes(DwiImageContainerType cont) +{ + m_ImageVolumes=cont; +} + +template +void MergeDiffusionImagesFilter +::SetGradientLists(GradientListContainerType cont) +{ + m_GradientLists=cont; +} + +template +void MergeDiffusionImagesFilter +::SetBValues(std::vector< double > bvals) +{ + m_BValues=bvals; +} + +template +MergeDiffusionImagesFilter::GradientListType::Pointer MergeDiffusionImagesFilter +::GetOutputGradients() +{ + return m_OutputGradients; +} + +template +double MergeDiffusionImagesFilter +::GetBValue() +{ + return m_BValue; +} + template void MergeDiffusionImagesFilter ::GenerateData () { if( m_ImageVolumes.size()<2 ) throw itk::ExceptionObject (__FILE__,__LINE__,"Error: cannot combine less than two DWIs."); if( m_GradientLists.size()!=m_ImageVolumes.size() || m_ImageVolumes.size()!=m_BValues.size() || m_BValues.size()!=m_GradientLists.size() ) throw itk::ExceptionObject (__FILE__,__LINE__,"Error: need same number of b-values, image volumes and gradient containers."); typename DwiImageType::Pointer img = m_ImageVolumes.at(0); m_NumGradients = 0; for (int i=0; iSize(); typename DwiImageType::Pointer tmp = m_ImageVolumes.at(i); if ( img->GetLargestPossibleRegion()!=tmp->GetLargestPossibleRegion() ) throw itk::ExceptionObject (__FILE__,__LINE__,"Error: images are not of same size."); } m_BValue = m_BValues.at(0); m_OutputGradients = GradientListType::New(); typename DwiImageType::Pointer outImage = DwiImageType::New(); outImage->SetSpacing( img->GetSpacing() ); // Set the image spacing outImage->SetOrigin( img->GetOrigin() ); // Set the image origin outImage->SetDirection( img->GetDirection() ); // Set the image direction outImage->SetLargestPossibleRegion( img->GetLargestPossibleRegion()); outImage->SetBufferedRegion( img->GetLargestPossibleRegion() ); outImage->SetRequestedRegion( img->GetLargestPossibleRegion() ); outImage->SetVectorLength(m_NumGradients); outImage->Allocate(); this->SetNumberOfRequiredOutputs(1); this->SetNthOutput (0, outImage); typedef ImageRegionIterator IteratorOutputType; IteratorOutputType itOut (this->GetOutput(0), this->GetOutput(0)->GetLargestPossibleRegion()); MITK_INFO << "MergeDiffusionImagesFilter: merging images"; GradientType zeroG; zeroG.fill(0.0); boost::progress_display disp(this->GetOutput(0)->GetLargestPossibleRegion().GetNumberOfPixels()); while(!itOut.IsAtEnd()) { ++disp; DwiPixelType out; out.SetSize(m_NumGradients); out.Fill(0); int c=0; for (int i=0; iSize(); j++) { GradientType g = gradients->GetElement(j); if (g.magnitude()>0.0001) { g.normalize(); g *= std::sqrt(bValue/m_BValue); } else g = zeroG; m_OutputGradients->InsertElement(c, g); out[c] = static_cast(img->GetPixel(itOut.GetIndex())[j]); c++; } } itOut.Set(out); ++itOut; } } } // end of namespace