18 #ifndef __otbVegetationIndicesFunctor_h
19 #define __otbVegetationIndicesFunctor_h
43 template<
class TInput1,
class TInput2,
class TOutput>
59 return !(*
this != other);
69 inline TOutput
operator ()(
const TInput1& r,
const TInput2& nir)
const
125 virtual std::string
GetName()
const = 0;
130 virtual TOutput
Evaluate(
const TInput1& r,
const TInput2& nir)
const = 0;
148 template<
class TInput1,
class TInput2,
class TInput3,
class TOutput>
165 return !(*
this != other);
172 static_cast<TInput2>(inputVector[
m_BlueIndex - 1]),
173 static_cast<TInput3>(inputVector[
m_NIRIndex - 1]));
176 inline TOutput
operator ()(
const TInput1& r,
const TInput2& b,
const TInput2& nir)
251 virtual std::string
GetName()
const = 0;
256 virtual TOutput
Evaluate(
const TInput1& r,
const TInput2& b,
const TInput3& nir)
const = 0;
275 template<
class TInput1,
class TInput2,
class TInput3,
class TOutput>
291 return !(*
this != other);
299 static_cast<TInput3>(inputVector[
m_NIRIndex - 1]));
303 inline TOutput
operator ()(
const TInput1& r,
const TInput2& g,
const TInput2& nir)
378 virtual std::string
GetName()
const = 0;
383 virtual TOutput
Evaluate(
const TInput1& r,
const TInput2& g,
const TInput3& nir)
const = 0;
400 template <
class TInput1,
class TInput2,
class TOutput>
417 inline TOutput
Evaluate(
const TInput1& r,
const TInput2& nir)
const
419 double dr =
static_cast<double>(r);
420 double dnir =
static_cast<double>(nir);
423 return static_cast<TOutput
>(0.);
426 return (static_cast<TOutput>((dnir - dr) / (dnir + dr)));
438 template <
class TInput1,
class TInput2,
class TOutput>
452 inline TOutput
Evaluate(
const TInput1& r,
const TInput2& nir)
const
454 double dr =
static_cast<double>(r);
455 double dnir =
static_cast<double>(nir);
458 return static_cast<TOutput
>(0.);
460 return (static_cast<TOutput>(dnir / dr));
476 template <
class TInput1,
class TInput2,
class TOutput>
507 inline TOutput
Evaluate(
const TInput1& r,
const TInput2& nir)
const
509 double dnir =
static_cast<double>(nir);
510 double dr =
static_cast<double>(r);
511 return (static_cast<TOutput>((dnir -
m_A * dr -
m_B) *
m_Coeff));
532 template <
class TInput1,
class TInput2,
class TOutput>
557 inline TOutput
Evaluate(
const TInput1& r,
const TInput2& nir)
const
559 double dnir =
static_cast<double>(nir);
560 double dr =
static_cast<double>(r);
561 double denominator = dnir + dr +
m_L;
564 return static_cast<TOutput
>(0.);
566 return (static_cast<TOutput>(((dnir - dr) * (1 +
m_L)) / denominator));
584 template <
class TInput1,
class TInput2,
class TOutput>
626 inline TOutput
Evaluate(
const TInput1& r,
const TInput2& nir)
const
628 double dnir =
static_cast<double>(nir);
629 double dr =
static_cast<double>(r);
630 double denominator =
m_A * dnir + dr +
m_X * (1. +
m_A *
m_A);
633 return static_cast<TOutput
>(0.);
635 return (static_cast<TOutput>((
m_A * (dnir -
m_A * dr -
m_S)) / denominator));
656 template <
class TInput1,
class TInput2,
class TOutput>
681 inline TOutput
Evaluate(
const TInput1& r,
const TInput2& nir)
const
683 double dr =
static_cast<double>(r);
684 double dnir =
static_cast<double>(nir);
686 return (dnir -
m_S * dr);
702 template <
class TInput1,
class TInput2,
class TOutput>
740 inline TOutput
Evaluate(
const TInput1& r,
const TInput2& nir)
const
742 double dnir =
static_cast<double>(nir);
743 double dr =
static_cast<double>(r);
745 double dNDVI = this->
GetNDVI() (r, nir);
746 double dWDVI = this->
GetWDVI() (r, nir);
747 double dL = 1 - 2 *
m_S * dNDVI * dWDVI;
749 double denominator = dnir + dr + dL;
753 return static_cast<TOutput
>(0.);
756 return (static_cast<TOutput>(((dnir - dr) * (1 + dL)) / denominator));
775 template <
class TInput1,
class TInput2,
class TOutput>
789 inline TOutput
Evaluate(
const TInput1& r,
const TInput2& nir)
const
791 double dnir =
static_cast<double>(nir);
792 double dr =
static_cast<double>(r);
793 double sqrt_value = (2 * dnir + 1) * (2 * dnir + 1) - 8 * (dnir - dr);
796 return static_cast<TOutput
>(0.);
798 return (static_cast<TOutput>((2 * dnir + 1 - vcl_sqrt(sqrt_value)) / 2.));
811 template <
class TInput1,
class TInput2,
class TOutput>
825 inline TOutput
Evaluate(
const TInput1& r,
const TInput2& nir)
const
827 double dnir =
static_cast<double>(nir);
828 double dr =
static_cast<double>(r);
831 double dnumerateur_nu;
832 double ddenominateur_nu = dnir + dr + 0.5;
839 dnumerateur_nu = 2 * (dnir * dnir - dr * dr) + 1.5 * dnir + 0.5 * dr;
840 dnu = dnumerateur_nu / ddenominateur_nu;
843 double ddenominateur_GEMI = 1 - dr;
846 return static_cast<TOutput
>(0.);
848 return (static_cast<TOutput>((dnu * (1 - 0.25 * dnu) - (dr - 0.125)) / ddenominateur_GEMI));
863 template <
class TInput1,
class TInput2,
class TInput3,
class TOutput>
903 inline TOutput
Evaluate(
const TInput1& r,
const TInput2& g,
const TInput3& nir)
const
905 double dr =
static_cast<double>(r);
906 double dg =
static_cast<double>(g);
907 double dnir =
static_cast<double>(nir);
919 dterm1 = vcl_atan(dfact1 / (dnir - dr));
928 dterm2 = vcl_atan(dfact2 / (dg - dr));
931 return static_cast<TOutput
>(dterm1 + dterm2);
956 template <
class TInput1,
class TInput2,
class TInput3,
class TOutput>
980 inline TOutput
Evaluate(
const TInput1& r,
const TInput2& b,
const TInput3& nir)
const
982 double dr =
static_cast<double>(r);
983 double db =
static_cast<double>(b);
984 double dnir =
static_cast<double>(nir);
985 double RHOrb = dr -
m_Gamma * (db - dr);
986 double denominator = dnir + RHOrb;
989 return static_cast<TOutput
>(0.);
991 return (static_cast<TOutput>((dnir - RHOrb) / denominator));
1008 template <
class TInput1,
class TInput2,
class TInput3,
class TOutput>
1058 inline TOutput
Evaluate(
const TInput1& r,
const TInput2& b,
const TInput3& nir)
const
1060 double dr =
static_cast<double>(r);
1061 double db =
static_cast<double>(b);
1062 double dnir =
static_cast<double>(nir);
1063 double dRB = dr -
m_Gamma * (db - dr);
1067 return static_cast<TOutput
>(0.);
1069 return (static_cast<TOutput>((
m_A * (dnir -
m_A * dRB -
m_B)) / denominator));
1094 template <
class TInput1,
class TInput2,
class TInput3,
class TOutput>
1143 inline TOutput
Evaluate(
const TInput1& r,
const TInput2& b,
const TInput3& nir)
const
1145 double dr =
static_cast<double>(r);
1146 double db =
static_cast<double>(b);
1147 double dnir =
static_cast<double>(nir);
1148 double denominator = dnir +
m_C1 * dr -
m_C2 * db +
m_L;
1151 return (static_cast<TOutput>(0.));
1153 return (static_cast<TOutput>(
m_G * (dnir - dr) / denominator));
1179 template <
class TInput1,
class TInput2,
class TOutput>
1193 inline TOutput
Evaluate(
const TInput1& r,
const TInput2& nir)
const
1195 double dr =
static_cast<double>(r);
1196 double dnir =
static_cast<double>(nir);
1199 return static_cast<TOutput
>(0.);
1203 return (static_cast<TOutput>(dnir / (dnir + dr)));
1216 template <
class TInput1,
class TInput2,
class TOutput>
1236 inline TOutput
Evaluate(
const TInput1& r,
const TInput2& nir)
const
1238 double dval = this->
GetNDVI() (r, nir) + 0.5;
1241 return (static_cast<TOutput>(0));
1245 return (static_cast<TOutput>(vcl_sqrt(dval)));
1266 template <
class TInput1,
class TInput2,
class TOutput>
1273 return "LAIFromNDVILogarithmic";
1313 inline TOutput
Evaluate(
const TInput1& r,
const TInput2& nir)
const
1315 double dval = this->
GetNDVI() (r, nir);
1318 return (static_cast<TOutput>(0));
1322 return (static_cast<TOutput>(
1350 template <
class TInput1,
class TInput2,
class TOutput>
1357 return "LAIFromReflectancesLinear";
1388 inline TOutput
Evaluate(
const TInput1& r,
const TInput2& nir)
const
1416 template <
class TInput1,
class TInput2,
class TOutput>
1424 return "LAIFromNDVIFormosat2Functor";
1433 inline TOutput
Evaluate(
const TInput1& r,
const TInput2& nir)
const
1439 double dr =
static_cast<double>(r);
1440 double dnir =
static_cast<double>(nir);
1443 return static_cast<TOutput
>(0.);
1446 return static_cast<TOutput
>(a*(vcl_exp(static_cast<double>(dnir-dr)/static_cast<double>(dr+dnir)*b)-vcl_exp(c*b)));