From 7572e787c31e281f1e687220fac3ed8fb4ab5047 Mon Sep 17 00:00:00 2001 From: Christophe Palmann <christophe.palmann@c-s.fr> Date: Tue, 29 Sep 2015 15:52:12 +0200 Subject: [PATCH] ENH: otbReciprocalHAlphaImageFilter.h (SAR) --- .../include/otbReciprocalHAlphaImageFilter.h | 49 ++++++------------- 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/Modules/Filtering/Polarimetry/include/otbReciprocalHAlphaImageFilter.h b/Modules/Filtering/Polarimetry/include/otbReciprocalHAlphaImageFilter.h index 8fd7936af6..00ec3ff810 100644 --- a/Modules/Filtering/Polarimetry/include/otbReciprocalHAlphaImageFilter.h +++ b/Modules/Filtering/Polarimetry/include/otbReciprocalHAlphaImageFilter.h @@ -95,6 +95,7 @@ public: // Entropy estimation double totalEigenValues(0.0); double p[3]; + double plog[3]; double entropy; double alpha; double anisotropy; @@ -120,46 +121,32 @@ public: } } - totalEigenValues = sortedRealEigenValues[0] + sortedRealEigenValues[1] + sortedRealEigenValues[2]; - if (totalEigenValues <m_Epsilon) + totalEigenValues = 0.0; + for (unsigned int k = 0; k < 3; ++k) { - totalEigenValues = m_Epsilon; + sortedRealEigenValues[k] = std::max(sortedRealEigenValues[k], 0.); + totalEigenValues += sortedRealEigenValues[k]; } + for (unsigned int k = 0; k < 3; ++k) { - p[k] = std::max(sortedRealEigenValues[k], 0.) / totalEigenValues; + p[k] = sortedRealEigenValues[k] / totalEigenValues; + + if (p[k]<m_Epsilon) //n=log(n)-->0 when n-->0 + plog[k]=0.0; + else + plog[k]=-p[k]*log(p[k])/log(3); } - if ( (p[0] < m_Epsilon) || (p[1] < m_Epsilon) || (p[2] < m_Epsilon) ) - { - entropy =0.0; - } - else - { - entropy = p[0]*log(p[0]) + p[1]*log(p[1]) + p[2]*log(p[2]); - entropy /= -log(3.); - } + entropy = 0.0; + for (unsigned int k = 0; k < 3; ++k) + entropy += plog[k]; // alpha estimation double val0, val1, val2; double a0, a1, a2; - for(unsigned int k = 0; k < 3; ++k) - { - p[k] = sortedRealEigenValues[k] / totalEigenValues; - - if (p[k] < 0.) - { - p[k] = 0.; - } - - if (p[k] > 1.) - { - p[k] = 1.; - } - } - val0 = std::abs(sortedGreaterEigenVector[0]); a0=acos(vcl_abs(val0)) * CONST_180_PI; @@ -171,14 +158,10 @@ public: alpha=p[0]*a0 + p[1]*a1 + p[2]*a2; - if (alpha>90) - { - alpha=0.; - } - // Anisotropy estimation anisotropy=(sortedRealEigenValues[1] - sortedRealEigenValues[2])/(sortedRealEigenValues[1] + sortedRealEigenValues[2] + m_Epsilon); + result[0] = static_cast<OutputValueType>(entropy); result[1] = static_cast<OutputValueType>(alpha); result[2] = static_cast<OutputValueType>(anisotropy); -- GitLab