19 #ifndef __itkImagePCADecompositionCalculator_txx
20 #define __itkImagePCADecompositionCalculator_txx
22 #pragma warning( disable : 4288 )
34 template<
class TInputImage,
class TBasisImage>
40 m_BasisMatrixCalculated =
false;
43 template<
class TInputImage,
class TBasisImage>
48 itkDebugMacro(<<
"setting BasisImages");
49 this->m_BasisMatrixCalculated =
false;
56 this->m_BasisImages = v;
63 template<
class TInputImage,
class TBasisImage>
68 if (!m_BasisMatrixCalculated)
70 this->CalculateBasisMatrix();
72 this->CalculateRecenteredImageAsVector();
73 m_Projection = m_BasisMatrix * m_ImageAsVector;
79 template<
class TInputImage,
class TBasisImage>
83 m_Size = m_BasisImages[0]->GetRequestedRegion().GetSize();
85 for(
unsigned int i = 0; i < BasisImageDimension; i++ )
87 m_NumPixels *= m_Size[i];
93 for(
typename BasisImagePointerVector::const_iterator basis_it = m_BasisImages.begin();
94 basis_it != m_BasisImages.end(); ++basis_it)
96 if( (*basis_it)->GetRequestedRegion().GetSize() != m_Size)
98 itkExceptionMacro(
"All basis images must be the same size!");
102 (*basis_it)->GetRequestedRegion());
104 for (image_it.GoToBegin(); !image_it.IsAtEnd(); ++image_it)
106 m_BasisMatrix(i, j++) = image_it.
Get();
110 m_BasisMatrixCalculated =
true;
111 m_ImageAsVector.set_size(m_NumPixels);
117 template<
class TInputImage,
class TBasisImage>
121 if ( m_Image->GetRequestedRegion().GetSize() != m_Size)
123 itkExceptionMacro(
"Input image must be the same size as the basis images!");
127 m_Image->GetRequestedRegion());
128 typename BasisVectorType::iterator vector_it;
129 for (image_it.GoToBegin(), vector_it = m_ImageAsVector.begin();
130 !image_it.
IsAtEnd(); ++image_it, ++vector_it)
138 m_MeanImage->GetRequestedRegion());
139 for (mimage_it.GoToBegin(), vector_it = m_ImageAsVector.begin();
140 !mimage_it.
IsAtEnd(); ++mimage_it, ++vector_it)
142 *vector_it -= (mimage_it.Get());
148 template<
class TInputImage,
class TBasisImage>
153 unsigned int nImages = model->GetNumberOfPrincipalComponentsRequired();
154 images.reserve(nImages);
155 for(
int i = 1; i <= nImages; i++)
157 images.push_back(model->GetOutput(i));
159 this->SetBasisImages(images);
160 this->SetMeanImage(model->GetOutput(0));
163 template<
class TInputImage,
class TBasisImage>
168 Superclass::PrintSelf(os,indent);
169 os << indent <<
"Projection: " << m_Projection << std::endl;
170 os << indent <<
"Image: " << m_Image.GetPointer() << std::endl;
171 os << indent <<
"Mean Image: " << m_MeanImage.GetPointer() << std::endl;