00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __itkDiffusionQballReconstructionImageFilter_h_
00019 #define __itkDiffusionQballReconstructionImageFilter_h_
00020
00021 #include "itkImageToImageFilter.h"
00022
00023 #include "vnl/vnl_vector_fixed.h"
00024 #include "vnl/vnl_matrix.h"
00025 #include "vnl/algo/vnl_svd.h"
00026 #include "itkVectorContainer.h"
00027 #include "itkVectorImage.h"
00028
00029 namespace itk{
00096 template< class TReferenceImagePixelType,
00097 class TGradientImagePixelType,
00098 class TOdfPixelType,
00099 int NrOdfDirections,
00100 int NrBasisFunctionCenters = NrOdfDirections>
00101 class DiffusionQballReconstructionImageFilter :
00102 public ImageToImageFilter< Image< TReferenceImagePixelType, 3 >,
00103 Image< Vector< TOdfPixelType, NrOdfDirections >, 3 > >
00104 {
00105
00106 public:
00107
00119 enum Normalization {
00120 QBR_STANDARD,
00121 QBR_B_ZERO_B_VALUE,
00122 QBR_B_ZERO,
00123 QBR_NONE
00124 };
00125
00126 typedef DiffusionQballReconstructionImageFilter Self;
00127 typedef SmartPointer<Self> Pointer;
00128 typedef SmartPointer<const Self> ConstPointer;
00129 typedef ImageToImageFilter< Image< TReferenceImagePixelType, 3>,
00130 Image< Vector< TOdfPixelType, NrOdfDirections >, 3 > >
00131 Superclass;
00132
00134 itkNewMacro(Self);
00135
00137 itkTypeMacro(DiffusionQballReconstructionImageFilter,
00138 ImageToImageFilter);
00139
00140 typedef TReferenceImagePixelType ReferencePixelType;
00141
00142 typedef TGradientImagePixelType GradientPixelType;
00143
00144 typedef Vector< TOdfPixelType, NrOdfDirections >
00145 OdfPixelType;
00146
00149 typedef typename Superclass::InputImageType ReferenceImageType;
00150
00151 typedef Image< OdfPixelType, 3 > OdfImageType;
00152
00153 typedef OdfImageType OutputImageType;
00154
00155 typedef TOdfPixelType BZeroPixelType;
00156
00157 typedef Image< BZeroPixelType, 3 > BZeroImageType;
00158
00159 typedef typename Superclass::OutputImageRegionType
00160 OutputImageRegionType;
00161
00163 typedef Image< GradientPixelType, 3 > GradientImageType;
00164
00169 typedef VectorImage< GradientPixelType, 3 > GradientImagesType;
00170
00172 typedef vnl_matrix< TOdfPixelType >*
00173 OdfReconstructionMatrixType;
00174
00176 typedef vnl_vector_fixed< double, 3 > GradientDirectionType;
00177
00179 typedef VectorContainer< unsigned int,
00180 GradientDirectionType > GradientDirectionContainerType;
00181
00182 itkStaticConstMacro(NOdfDirections,int,NrOdfDirections);
00183 itkStaticConstMacro(NBasisFunctionCenters,int,NrBasisFunctionCenters);
00184
00186 void AddGradientImage( const GradientDirectionType &, const GradientImageType *image);
00187
00194 void SetGradientImage( GradientDirectionContainerType *,
00195 const GradientImagesType *image);
00196
00198 void SetReferenceImage( ReferenceImageType *referenceImage )
00199 {
00200 if( m_GradientImageTypeEnumeration == GradientIsInASingleImage)
00201 {
00202 itkExceptionMacro( << "Cannot call both methods:"
00203 << "AddGradientImage and SetGradientImage. Please call only one of them.");
00204 }
00205
00206 this->ProcessObject::SetNthInput( 0, referenceImage );
00207
00208 m_GradientImageTypeEnumeration = GradientIsInManyImages;
00209 }
00210
00212 virtual ReferenceImageType * GetReferenceImage()
00213 { return ( static_cast< ReferenceImageType *>(this->ProcessObject::GetInput(0)) ); }
00214
00216 virtual GradientDirectionType GetGradientDirection( unsigned int idx) const
00217 {
00218 if( idx >= m_NumberOfGradientDirections )
00219 {
00220 itkExceptionMacro( << "Gradient direction " << idx << "does not exist" );
00221 }
00222 return m_GradientDirectionContainer->ElementAt( idx+1 );
00223 }
00224
00228 OdfPixelType Normalize(OdfPixelType odf, typename NumericTraits<ReferencePixelType>::AccumulateType b0 );
00229
00233 vnl_vector<TOdfPixelType> PreNormalize( vnl_vector<TOdfPixelType> vec );
00234
00238 itkSetMacro( Threshold, ReferencePixelType );
00239 itkGetMacro( Threshold, ReferencePixelType );
00240
00242 itkSetMacro( NormalizationMethod, Normalization);
00243 itkGetMacro( NormalizationMethod, Normalization );
00244
00246 itkGetMacro( BZeroImage, typename BZeroImageType::Pointer);
00247
00249 itkSetMacro( BValue, TOdfPixelType);
00250 #ifdef GetBValue
00251 #undef GetBValue
00252 #endif
00253 itkGetConstReferenceMacro( BValue, TOdfPixelType);
00254
00255 #ifdef ITK_USE_CONCEPT_CHECKING
00256
00257 itkConceptMacro(ReferenceEqualityComparableCheck,
00258 (Concept::EqualityComparable<ReferencePixelType>));
00259 itkConceptMacro(TensorEqualityComparableCheck,
00260 (Concept::EqualityComparable<OdfPixelType>));
00261 itkConceptMacro(GradientConvertibleToDoubleCheck,
00262 (Concept::Convertible<GradientPixelType, double>));
00263 itkConceptMacro(DoubleConvertibleToTensorCheck,
00264 (Concept::Convertible<double, OdfPixelType>));
00265 itkConceptMacro(GradientReferenceAdditiveOperatorsCheck,
00266 (Concept::AdditiveOperators<GradientPixelType, GradientPixelType,
00267 ReferencePixelType>));
00268 itkConceptMacro(ReferenceOStreamWritableCheck,
00269 (Concept::OStreamWritable<ReferencePixelType>));
00270 itkConceptMacro(TensorOStreamWritableCheck,
00271 (Concept::OStreamWritable<OdfPixelType>));
00273 #endif
00274
00275 protected:
00276 DiffusionQballReconstructionImageFilter();
00277 ~DiffusionQballReconstructionImageFilter() {};
00278 void PrintSelf(std::ostream& os, Indent indent) const;
00279
00281 void ComputeReconstructionMatrix();
00282
00283 void BeforeThreadedGenerateData();
00284 void ThreadedGenerateData( const
00285 OutputImageRegionType &outputRegionForThread, int);
00286
00289 typedef enum
00290 {
00291 GradientIsInASingleImage = 1,
00292 GradientIsInManyImages,
00293 Else
00294 } GradientImageTypeEnumeration;
00295
00296 private:
00297
00298
00299 OdfReconstructionMatrixType m_ReconstructionMatrix;
00300
00302 GradientDirectionContainerType::Pointer m_GradientDirectionContainer;
00303
00305 unsigned int m_NumberOfGradientDirections;
00306
00308 unsigned int m_NumberOfEquatorSamplingPoints;
00309
00311 unsigned int m_NumberOfBaselineImages;
00312
00314 ReferencePixelType m_Threshold;
00315
00317 TOdfPixelType m_BValue;
00318
00320 GradientImageTypeEnumeration m_GradientImageTypeEnumeration;
00321
00323 typename BZeroImageType::Pointer m_BZeroImage;
00324
00328 bool m_DirectionsDuplicated;
00329
00331 Normalization m_NormalizationMethod;
00332 };
00333
00334 }
00335
00336 #ifndef ITK_MANUAL_INSTANTIATION
00337 #include "itkDiffusionQballReconstructionImageFilter.txx"
00338 #endif
00339
00340 #endif //__itkDiffusionQballReconstructionImageFilter_h_
00341