diff --git a/Modules/DiffusionImaging/DiffusionCore/src/IODataStructures/mitkShImage.cpp b/Modules/DiffusionImaging/DiffusionCore/src/IODataStructures/mitkShImage.cpp index ad46da3454..2c1dfbf9f4 100644 --- a/Modules/DiffusionImaging/DiffusionCore/src/IODataStructures/mitkShImage.cpp +++ b/Modules/DiffusionImaging/DiffusionCore/src/IODataStructures/mitkShImage.cpp @@ -1,157 +1,157 @@ /*=================================================================== 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. ===================================================================*/ #include "mitkShImage.h" #include "mitkImageCast.h" #include "itkImage.h" #include "mitkImageVtkAccessor.h" #include #include "itkShToRgbImageFilter.h" #include mitk::ShImage::ShImage() : Image() , m_ShOrder(0) , m_NumCoefficients(0) { m_RgbImage = nullptr; // not needed anymore as soon as all diffusion images are identified via properties anyway this->SetProperty("IsShImage", mitk::BoolProperty::New(true)); } mitk::ShImage::~ShImage() { } int mitk::ShImage::NumCoefficients() { if (m_NumCoefficients==0 || m_ShOrder==0) { m_NumCoefficients = this->m_ImageDescriptor->GetChannelTypeById(0).GetNumberOfComponents(); int c=3, d=2-2*m_NumCoefficients; double D = c*c-4*d; if (D>0) { m_ShOrder = (-c+sqrt(D))/2.0; if (m_ShOrder<0) m_ShOrder = (-c-sqrt(D))/2.0; } else if (D==0) m_ShOrder = -c/2.0; } return m_NumCoefficients; } int mitk::ShImage::ShOrder() { if (m_NumCoefficients==0 || m_ShOrder==0) { m_NumCoefficients = this->m_ImageDescriptor->GetChannelTypeById(0).GetNumberOfComponents(); int c=3, d=2-2*m_NumCoefficients; double D = c*c-4*d; if (D>0) { m_ShOrder = (-c+sqrt(D))/2.0; if (m_ShOrder<0) m_ShOrder = (-c-sqrt(D))/2.0; } else if (D==0) m_ShOrder = -c/2.0; } return m_ShOrder; } vtkImageData* mitk::ShImage::GetVtkImageData(int t, int n) { if(m_RgbImage.IsNull()) { ShOrder(); NumCoefficients(); ConstructRgbImage(); } return m_RgbImage->GetVtkImageData(t,n); } const vtkImageData*mitk::ShImage::GetVtkImageData(int t, int n) const { if(m_RgbImage.IsNull()) { ConstructRgbImage(); } return m_RgbImage->GetVtkImageData(t,n); } -template +template void mitk::ShImage::Construct() const { - typedef itk::Image,3> ImageType; - typedef itk::ShToRgbImageFilter FilterType; + typedef itk::Image,3> ImageType; + typedef itk::ShToRgbImageFilter FilterType; typename FilterType::Pointer filter = FilterType::New(); typename ImageType::Pointer itkvol = ImageType::New(); mitk::CastToItkImage(this, itkvol); filter->SetInput(itkvol); filter->Update(); itk::Image,3>::Pointer tmp = filter->GetOutput(); m_RgbImage = mitk::Image::New(); m_RgbImage->InitializeByItk( tmp.GetPointer() ); m_RgbImage->SetVolume( tmp->GetBufferPointer() ); } void mitk::ShImage::ConstructRgbImage() const { switch (this->m_ImageDescriptor->GetChannelTypeById(0).GetNumberOfComponents()) { case 6: Construct<2>(); break; case 15: Construct<4>(); break; case 28: Construct<6>(); break; case 45: Construct<8>(); break; case 66: Construct<10>(); break; case 91: Construct<12>(); break; default : mitkThrow() << "SH order larger 12 not supported"; } } const vtkImageData* mitk::ShImage::GetNonRgbVtkImageData(int t, int n) const { return Superclass::GetVtkImageData(t,n); } vtkImageData* mitk::ShImage::GetNonRgbVtkImageData(int t, int n) { return Superclass::GetVtkImageData(t,n); } void mitk::ShImage::PrintSelf(std::ostream &os, itk::Indent indent) const { os << indent << "Spherical harmonics order: " << m_ShOrder << std::endl; os << indent << "Number of coefficients: " << m_NumCoefficients << std::endl; Superclass::PrintSelf(os, indent); }