19 #ifndef __ReciprocalHAlphaImageFilter_h
20 #define __ReciprocalHAlphaImageFilter_h
24 #include "vnl/algo/vnl_complex_eigensystem.h"
56 template<
class TInput,
class TOutput>
68 inline TOutput
operator()(
const TInput & Coherency )
const
73 const double T0 =
static_cast<double>(Coherency[0].real());
74 const double T1 =
static_cast<double>(Coherency[3].real());
75 const double T2 =
static_cast<double>(Coherency[5].real());
79 vnlMat[0][1] = std::conj(
ComplexType(Coherency[1]));
80 vnlMat[0][2] = std::conj(
ComplexType(Coherency[2]));
83 vnlMat[1][2] = std::conj(
ComplexType(Coherency[4]));
89 vnl_complex_eigensystem syst(vnlMat,
false,
true);
94 double totalEigenValues(0.0);
101 VectorType sortedRealEigenValues(3, eigenValues[0].real());
102 sortedRealEigenValues[1] = eigenValues[1].real();
103 sortedRealEigenValues[2] = eigenValues[2].real();
104 std::sort( sortedRealEigenValues.begin(), sortedRealEigenValues.end() );
105 std::reverse( sortedRealEigenValues.begin(), sortedRealEigenValues.end() );
108 VNLVectorType sortedGreaterEigenVector(3, eigenVectors[0][0]);
109 for(
unsigned int i=0; i<3; ++i)
111 if( vcl_abs( eigenValues[1].real()-sortedRealEigenValues[i] ) <
m_Epsilon )
113 sortedGreaterEigenVector[i] = eigenVectors[1][0];
115 else if( vcl_abs( eigenValues[2].real()-sortedRealEigenValues[i] ) <
m_Epsilon )
117 sortedGreaterEigenVector[i] = eigenVectors[2][0];
121 totalEigenValues = sortedRealEigenValues[0] + sortedRealEigenValues[1] + sortedRealEigenValues[2];
127 for (
unsigned int k = 0; k < 3; ++k)
129 p[k] = std::max(sortedRealEigenValues[k], 0.) / totalEigenValues;
138 entropy = p[0]*log(p[0]) + p[1]*log(p[1]) + p[2]*log(p[2]);
143 double val0, val1, val2;
146 for(
unsigned int k = 0; k < 3; ++k)
148 p[k] = sortedRealEigenValues[k] / totalEigenValues;
161 val0 = std::abs(sortedGreaterEigenVector[0]);
164 val1 = std::abs(sortedGreaterEigenVector[1]);
167 val2= std::abs(sortedGreaterEigenVector[2]);
170 alpha=p[0]*a0 + p[1]*a1 + p[2]*a2;
178 anisotropy=(sortedRealEigenValues[1] - sortedRealEigenValues[2])/(sortedRealEigenValues[1] + sortedRealEigenValues[2] +
m_Epsilon);
214 template <
class TInputImage,
class TOutputImage>
217 typename TInputImage::PixelType, typename TOutputImage::PixelType> >
223 typename TInputImage::PixelType,
typename TOutputImage::PixelType>
FunctionType;
240 void operator=(
const Self&);