Go to the documentation of this file.00001
00002 #ifndef __itkTensorDerivedMeasurementsFilter_txx
00003 #define __itkTensorDerivedMeasurementsFilter_txx
00004
00005
00006
00007
00008
00009 namespace itk {
00010
00011 template <class TPixel>
00012 TensorDerivedMeasurementsFilter<TPixel>::TensorDerivedMeasurementsFilter() : m_Measure(AD)
00013 {
00014 }
00015
00016 template <class TPixel>
00017 void TensorDerivedMeasurementsFilter<TPixel>::GenerateData()
00018 {
00019 typename TensorImageType::Pointer tensorImage = static_cast< TensorImageType * >( this->ProcessObject::GetInput(0) );
00020 typedef ImageRegionConstIterator< TensorImageType > TensorImageIteratorType;
00021 typedef ImageRegionIterator< OutputImageType > OutputImageIteratorType;
00022
00023
00024 typename OutputImageType::Pointer outputImage =
00025 static_cast< OutputImageType * >(this->ProcessObject::GetOutput(0));
00026
00027 typename TensorImageType::RegionType region = tensorImage->GetLargestPossibleRegion();
00028
00029
00030 outputImage->SetSpacing( tensorImage->GetSpacing() );
00031 outputImage->SetOrigin( tensorImage->GetOrigin() );
00032 outputImage->SetDirection( tensorImage->GetDirection() );
00033 outputImage->SetRegions( tensorImage->GetLargestPossibleRegion());
00034 outputImage->Allocate();
00035
00036 TensorImageIteratorType tensorIt(tensorImage, tensorImage->GetLargestPossibleRegion());
00037 OutputImageIteratorType outputIt(outputImage, outputImage->GetLargestPossibleRegion());
00038
00039 tensorIt.GoToBegin();
00040 outputIt.GoToBegin();
00041
00042 while(!tensorIt.IsAtEnd() && !outputIt.IsAtEnd()){
00043
00044 TensorType tensor = tensorIt.Get();
00045
00046 switch(m_Measure)
00047 {
00048 case FA:
00049 {
00050 TPixel diffusionIndex = tensor.GetFractionalAnisotropy();
00051 outputIt.Set(diffusionIndex);
00052 break;
00053 }
00054 case RA:
00055 {
00056 TPixel diffusionIndex = tensor.GetRelativeAnisotropy();
00057 outputIt.Set(diffusionIndex);
00058 break;
00059 }
00060 case AD:
00061 {
00062
00063
00064 typename TensorType::EigenValuesArrayType evs;
00065 tensor.ComputeEigenValues(evs);
00066 outputIt.Set(evs[2]);
00067 break;
00068 }
00069 case RD:
00070 {
00071
00072
00073 typename TensorType::EigenValuesArrayType evs;
00074 tensor.ComputeEigenValues(evs);
00075 outputIt.Set((evs[0]+evs[1])/2);
00076
00077 break;
00078 }
00079 case CA:
00080 {
00081
00082
00083 typename TensorType::EigenValuesArrayType evs;
00084 tensor.ComputeEigenValues(evs);
00085 if (evs[2] == 0)
00086 {
00087 outputIt.Set(0);
00088 break;
00089 }
00090 outputIt.Set(1-(evs[0]+evs[1])/(2*evs[2]));
00091 break;
00092 }
00093 case L2:
00094 {
00095
00096
00097 typename TensorType::EigenValuesArrayType evs;
00098 tensor.ComputeEigenValues(evs);
00099 outputIt.Set(evs[1]);
00100 break;
00101 }
00102 case L3:
00103 {
00104
00105
00106 typename TensorType::EigenValuesArrayType evs;
00107 tensor.ComputeEigenValues(evs);
00108 outputIt.Set(evs[0]);
00109 break;
00110 }
00111 }
00112
00113 ++tensorIt;
00114 ++outputIt;
00115 }
00116
00117
00118 }
00119
00120
00121 }
00122
00123 #endif // __itkTensorDerivedMeasurements_txx