17 #ifndef __itkEigenAnalysis2DImageFilter_txx
18 #define __itkEigenAnalysis2DImageFilter_txx
33 template <
class TInputImage,
class TEigenValueImage,
class TEigenVectorImage>
37 this->SetNumberOfRequiredInputs( 3 );
38 this->SetNumberOfRequiredOutputs( 3 );
39 this->SetNthOutput( 0, this->MakeOutput( 0 ) );
40 this->SetNthOutput( 1, this->MakeOutput( 1 ) );
41 this->SetNthOutput( 2, this->MakeOutput( 2 ) );
48 template <
class TInputImage,
class TEigenValueImage,
class TEigenVectorImage>
53 this->SetNthInput(0, image);
62 template <
class TInputImage,
class TEigenValueImage,
class TEigenVectorImage>
67 this->SetNthInput(1, image);
74 template <
class TInputImage,
class TEigenValueImage,
class TEigenVectorImage>
79 this->SetNthInput(2, image);
86 template <
class TInputImage,
class TEigenValueImage,
class TEigenVectorImage>
99 template <
class TInputImage,
class TEigenValueImage,
class TEigenVectorImage>
112 template <
class TInputImage,
class TEigenValueImage,
class TEigenVectorImage>
126 itkWarningMacro(<<
"EigenAnalysis2DImageFilter::GetMaxEigenVector(): dynamic_cast has failed. A reinterpret_cast is being attempted."
127 << std::endl <<
"Type name is: "
128 <<
typeid( *this->GetOutput( 2 )).name());
140 template <
class TInputImage,
class TEigenValueImage,
class TEigenVectorImage>
149 output = (EigenValueImageType::New()).GetPointer();
152 output = (EigenValueImageType::New()).GetPointer();
155 output = (EigenVectorImageType::New()).GetPointer();
162 template <
class TInputImage,
class TEigenValueImage,
class TEigenVectorImage>
168 typename TInputImage::ConstPointer inputPtr1(
169 dynamic_cast<const TInputImage *>(
172 typename TInputImage::ConstPointer inputPtr2(
173 dynamic_cast<const TInputImage *>(
176 typename TInputImage::ConstPointer inputPtr3(
177 dynamic_cast<const TInputImage *>(
184 outputPtr1->SetBufferedRegion( inputPtr1->GetBufferedRegion() );
185 outputPtr2->SetBufferedRegion( inputPtr1->GetBufferedRegion() );
186 outputPtr3->SetBufferedRegion( inputPtr1->GetBufferedRegion() );
188 outputPtr1->Allocate();
189 outputPtr2->Allocate();
190 outputPtr3->Allocate();
203 nullVector.Fill( 0.0 );
220 const double xx =
static_cast<double>( inputIt1.
Get() );
221 const double xy =
static_cast<double>( inputIt2.
Get() );
222 const double yy =
static_cast<double>( inputIt3.
Get() );
224 const double dxy = xx - yy;
225 const double sxy = xx + yy;
227 const double S = vcl_sqrt(dxy * dxy + 4.0 * xy * xy);
229 const double pp = ( sxy + S ) / 2.0;
230 const double qq = ( sxy - S ) / 2.0;
241 outputIt3.
Set( eigenVector / norm );
245 outputIt3.
Set( nullVector );
256 progress.CompletedPixel();