17 #ifndef __itkImagePCAShapeModelEstimator_txx
18 #define __itkImagePCAShapeModelEstimator_txx
25 template<
class TInputImage,
class TOutputImage>
29 m_EigenVectors.set_size(0,0);
30 m_EigenValues.set_size(0);
32 m_NumberOfPrincipalComponentsRequired = 0;
33 this->SetNumberOfPrincipalComponentsRequired( 1 );
37 template<
class TInputImage,
class TOutputImage>
47 template <
class TInputImage,
class TOutputImage>
53 os << indent <<
" " << std::endl;
54 os << indent <<
"Shape Models " << std::endl;
55 os << indent <<
"Results printed in the superclass " << std::endl;
56 os << indent <<
" " << std::endl;
58 Superclass::PrintSelf(os,indent);
61 itkDebugMacro(<<
"Results of the shape model algorithms");
62 itkDebugMacro(<<
"====================================");
64 itkDebugMacro(<<
"The eigen values new method are: ");
66 itkDebugMacro(<< m_EigenValues);
67 itkDebugMacro(<< m_EigenVectorNormalizedEnergy);
69 itkDebugMacro(<<
" ");
70 itkDebugMacro(<<
"================== ");
72 itkDebugMacro(<<
"The eigen vectors new method are: ");
75 for(
unsigned int i = 0; i < m_EigenValues.size(); i++)
77 itkDebugMacro(<< m_EigenVectors.get_row(i));
80 itkDebugMacro(<<
" ");
81 itkDebugMacro(<<
"+++++++++++++++++++++++++");
84 os << indent <<
"NumberOfPrincipalComponentsRequired: ";
85 os << m_NumberOfPrincipalComponentsRequired << std::endl;
86 os << indent <<
"NumberOfTrainingImages: ";
87 os << m_NumberOfTrainingImages << std::endl;
95 template<
class TInputImage,
class TOutputImage>
103 for (
unsigned int idx = 0; idx < this->GetNumberOfOutputs(); ++idx)
105 if ( this->GetOutput(idx) )
107 this->GetOutput(idx)->SetRequestedRegionToLargestPossibleRegion();
117 template<
class TInputImage,
class TOutputImage>
122 Superclass::GenerateInputRequestedRegion();
124 if ( this->GetInput(0) )
129 input->SetRequestedRegionToLargestPossibleRegion();
134 for (idx = 1; idx < this->GetNumberOfInputs(); ++idx)
136 if ( this->GetInput(idx) )
138 typename TInputImage::RegionType requestedRegion =
139 this->GetInput(0)->GetLargestPossibleRegion();
141 typename TInputImage::RegionType largestRegion =
142 this->GetInput(idx)->GetLargestPossibleRegion();
144 if( !largestRegion.IsInside( requestedRegion ) )
146 itkExceptionMacro(
"LargestPossibleRegion of input " << idx <<
147 " is not a superset of the LargestPossibleRegion of input 0" );
151 ptr->SetRequestedRegion( requestedRegion );
162 template<
class TInputImage,
class TOutputImage>
167 this->EstimateShapeModels();
170 unsigned int numberOfOutputs =
171 static_cast<unsigned int>( this->GetNumberOfOutputs() );
175 for( j = 0; j < numberOfOutputs; j++ )
179 output->SetBufferedRegion( output->GetRequestedRegion() );
190 typename OutputImageType::RegionType region = this->GetOutput( 0 )->GetRequestedRegion();
191 OutputIterator outIter( this->GetOutput( 0 ), region );
195 while( !outIter.IsAtEnd() )
197 outIter.Set( static_cast<typename OutputImageType::PixelType>(m_Means[i]));
203 unsigned int kthLargestPrincipalComp = m_NumberOfTrainingImages;
204 unsigned int numberOfValidOutputs =
205 vnl_math_min( numberOfOutputs, m_NumberOfTrainingImages + 1 );
207 for( j = 1; j < numberOfValidOutputs; j++ )
211 m_OneEigenVector = m_EigenVectors.get_column(kthLargestPrincipalComp-1);
213 region = this->GetOutput( j )->GetRequestedRegion();
214 OutputIterator outIterJ( this->GetOutput( j ), region );
216 unsigned int idx = 0;
217 outIterJ.GoToBegin();
218 while( !outIterJ.IsAtEnd() )
220 outIterJ.Set( static_cast<typename OutputImageType::PixelType>(
221 m_OneEigenVector[ idx ] ) );
227 --kthLargestPrincipalComp;
231 for(; j < numberOfOutputs; j++ )
233 region = this->GetOutput( j )->GetRequestedRegion();
234 OutputIterator outIterJ( this->GetOutput( j ), region );
236 outIterJ.GoToBegin();
237 while( !outIterJ.IsAtEnd() )
251 template<
class TInputImage,
class TOutputImage>
256 if ( m_NumberOfPrincipalComponentsRequired != n )
258 m_NumberOfPrincipalComponentsRequired = n;
263 this->SetNumberOfRequiredOutputs( m_NumberOfPrincipalComponentsRequired + 1 );
265 unsigned int numberOfOutputs =
static_cast<unsigned int>( this->GetNumberOfOutputs() );
268 if( numberOfOutputs < m_NumberOfPrincipalComponentsRequired + 1 )
271 for( idx = numberOfOutputs; idx <= m_NumberOfPrincipalComponentsRequired; idx++ )
274 this->SetNthOutput( idx, output.
GetPointer() );
277 else if ( numberOfOutputs > m_NumberOfPrincipalComponentsRequired + 1 )
280 for ( idx = numberOfOutputs - 1; idx >= m_NumberOfPrincipalComponentsRequired + 1; idx-- )
283 this->RemoveOutput( output );
293 template<
class TInputImage,
class TOutputImage>
298 if ( m_NumberOfTrainingImages != n )
300 m_NumberOfTrainingImages = n;
305 this->SetNumberOfRequiredInputs( m_NumberOfTrainingImages );
314 template<
class TInputImage,
class TOutputImage>
320 this->CalculateInnerProduct();
322 this->EstimatePCAShapeModelParameters();
330 template<
class TInputImage,
class TOutputImage>
341 m_InputImageIteratorArray.resize( m_NumberOfTrainingImages );
344 for(
unsigned int i=0; i< m_NumberOfTrainingImages; i++ )
350 inputImagePointerArray[i] = inputImagePtr;
354 m_InputImageIteratorArray[i] = inputImageIt;
356 m_InputImageIteratorArray[i].
GoToBegin();
364 m_InputImageSize = (inputImagePointerArray[0])->GetBufferedRegion().GetSize();
366 m_NumberOfPixels = 1;
367 for(
unsigned int i = 0; i < InputImageDimension; i++ )
369 m_NumberOfPixels *= m_InputImageSize[i];
375 m_Means.set_size(m_NumberOfPixels);
380 for(
unsigned int img_number = 0; img_number < m_NumberOfTrainingImages; img_number++)
382 tempImageItA = m_InputImageIteratorArray[img_number];
384 for(
unsigned int band_x = 0; band_x < m_NumberOfPixels; band_x++)
386 m_Means[band_x] += tempImageItA.
Get();
392 m_Means /= m_NumberOfTrainingImages;
397 m_InnerProduct.set_size( m_NumberOfTrainingImages, m_NumberOfTrainingImages );
398 m_InnerProduct.fill( 0 );
403 for(
unsigned int band_x = 0; band_x < m_NumberOfTrainingImages; band_x++)
405 for(
unsigned int band_y = 0; band_y <= band_x; band_y++ )
408 tempImageItA = m_InputImageIteratorArray[band_x];
411 tempImageItB = m_InputImageIteratorArray[band_y];
413 for(
unsigned int pix_number = 0; pix_number < m_NumberOfPixels; pix_number++)
415 m_InnerProduct[band_x][band_y] +=
416 (tempImageItA.
Get() - m_Means[pix_number]) *
417 (tempImageItB.
Get() - m_Means[pix_number]);
429 for(
unsigned int band_x = 0; band_x < (m_NumberOfTrainingImages - 1); band_x++)
431 for(
unsigned int band_y = band_x+1; band_y < m_NumberOfTrainingImages; band_y++)
433 m_InnerProduct[band_x][band_y] = m_InnerProduct[band_y][band_x];
437 if( ( m_NumberOfTrainingImages - 1 ) != 0 )
439 m_InnerProduct /= ( m_NumberOfTrainingImages - 1 );
443 m_InnerProduct.fill(0);
453 template<
class TInputImage,
class TOutputImage>
459 MatrixOfDoubleType identityMatrix( m_NumberOfTrainingImages, m_NumberOfTrainingImages );
460 identityMatrix.set_identity();
462 vnl_generalized_eigensystem eigenVectors_eigenValues(m_InnerProduct, identityMatrix);
475 m_EigenVectors.set_size(m_NumberOfPixels, m_NumberOfTrainingImages);
476 m_EigenVectors.fill(0);
481 for(
unsigned int img_number =0; img_number < m_NumberOfTrainingImages; img_number++ )
483 tempImageItA = m_InputImageIteratorArray[img_number];
484 for(
unsigned int pix_number =0; pix_number < m_NumberOfPixels; pix_number++ )
486 pix_value = tempImageItA.
Get();
487 for(
unsigned int vec_number = 0; vec_number < m_NumberOfTrainingImages; vec_number++ )
489 m_EigenVectors[pix_number][vec_number] +=
490 (pix_value * eigenVectorsOfInnerProductMatrix[img_number][vec_number]);
496 m_EigenVectors.normalize_columns();
498 m_EigenValues.set_size(m_NumberOfTrainingImages);
501 m_EigenValues = (eigenVectors_eigenValues.D).diagonal();
505 m_EigenValues.flip();
511 m_EigenVectorNormalizedEnergy = m_EigenValues;
512 m_EigenVectorNormalizedEnergy.normalize();