RapidEye235RGBIHSDetetaMin7Cla.alg
// COnverte RGB para IHS
// Adapted from Foley, VanDam 2nd.Ed.(p.592)
	// given r,g,b on [0 ... 1],
	// return (s,l) on [0 ... 1] h [0...360, -1= UNDEFINED]
{
Imagem i1, i2, i3, i4, i5 ("CAT_Imagem");
MNT m1, m2, m3, m4, m5 ("CAT_MNT");
 
MNT hue ("CAT_MNT");
MNT maxv ("CAT_MNT");
 
MNT red, green, blue ("CAT_MNT");
MNT iszero, minvl ("CAT_MNT");
MNT dltvl ("CAT_MNT");
MNT hue6 ("CAT_MNT");
MNT sat ("CAT_MNT");
 
 hue = Novo( Nome = "H_235" , ResX = 5 , ResY = 5 , Escala = 10000 );
 maxv = Novo( Nome = "V_235" , ResX = 5 , ResY = 5 , Escala = 10000 );
 
 red   = New(Name="TMP_HSV_R",ResX=5,ResY=5,Escala=10000); 
 green = New(Name="TMP_HSV_G",ResX=5,ResY=5,Escala=10000); 
 blue  = New(Name="TMP_HSV_B",ResX=5,ResY=5,Escala=10000); 
 
 minvl  = New(Name="TMP_MIN",ResX=5,ResY=5,Escala=10000); 
 dltvl  = New(Name="TMP_DLT",ResX=5,ResY=5,Escala=10000); 
 sat  = New(Name="TMP_SAT",ResX=5,ResY=5,Escala=10000); 
 hue6  = New(Name="TMP_H6",ResX=5,ResY=5,Escala=10000); 
 
 i1 = Recupere( Nome = "RapidEye2014_1" );
 i2 = Recupere( Nome = "RapidEye2014_2" );
 i3 = Recupere( Nome = "RapidEye2014_3" );
 i4 = Recupere( Nome = "RapidEye2014_4" );
 i5 = Recupere( Nome = "RapidEye2014_5" );
 
 m1 = New(Name="TMP_M1",ResX=5,ResY=5,Escala=10000); 
 m2 = New(Name="TMP_M2",ResX=5,ResY=5,Escala=10000); 
 m3 = New(Name="TMP_M3",ResX=5,ResY=5,Escala=10000); 
 m4 = New(Name="TMP_M4",ResX=5,ResY=5,Escala=10000); 
 m5 = New(Name="TMP_M5",ResX=5,ResY=5,Escala=10000); 
 
//Assume input image range 0-65535, output range 0-1
//  m1   = Digital(i1)/65535.;
//  m2   = Digital(i2)/65535.;
//  m3   = Digital(i3)/65535.;
//  m4   = Digital(i4)/65535.;
//  m5   = Digital(i5)/65535.;
 
  m1   = Digital(i1)/19978.;
  m2   = Digital(i2)/18635.;
  m3   = Digital(i3)/15604.;
  m4   = Digital(i4)/13950.;
  m5   = Digital(i5)/11244.;
 
  m1 = m1 > 1. ? 1. : m1 ;
  m2 = m2 > 1. ? 1. : m2 ;
  m3 = m3 > 1. ? 1. : m3 ;
  m4 = m4 > 1. ? 1. : m4 ;
  m5 = m5 > 1. ? 1. : m5 ;
 
red   = m2;
green = m3;
blue  = m5;
 
 
  //    max := Maximum(r,g,b)
  maxv = (red >= green ) && (red >= blue  ) ? red :
          (blue >= green) ? blue : green;
 
//    min := Minimum(r,g,b)
  minvl = (red <= green ) && (red <= blue) ? red :
          (blue <= green ) ? blue : green;
 
//    if max <> 0 then
//	s := (max-min)/max
//    else s := 0
  dltvl = maxv - minvl;
  sat = (maxv == 0.0) ? 0.0 : dltvl/maxv;
 
//    if s = 0 then
//	h := UNDEFINED
  hue6 = (sat == 0.0) ? 0.0 : (
//    else
//    	begin
//    	   delta := max-min
//	   if r = max then
//	      h := (g-b)/delta
         (red  == maxv) ? 60.0 * ((green - blue) / dltvl) : (
//	   else if g = max then
//	      h := 2 + (b-r)/delta
         (green  == maxv) ? 60.0 * (2.0 + ((blue - red) / dltvl)) : (
//	   else if b = max then
//	      h := 4 + (r-g)/delta
                             60.0 * (4.0 + ((red - green) / dltvl)) )));
//    h := h*60
//    if h < 0 then
//	h := h + 360
  hue = (sat == 0.0) ? -1.0 : ((hue6 < 0.0) ? hue6 + 360. : hue6);
 
//DetetaH235
 
Tematico slc ("Aguas");
 
// hue = Recupere( Nome = "H_235" );
 slc =Novo(Nome = "H_235_95_98N", ResX = 5, ResY = 5, Escala = 10000);
 
 slc =  Atribua ( CategoriaFim = "Aguas" ) 
	{
	 "1-WATER" :   (hue >=  16 && hue <   35), //W90% 16-35
	 "2-WATER95" : (hue >=  35 && hue <   36) || //W95% 324-36
                        (hue >=   0 && hue <   16) ||
                        (hue >= 324 && hue <= 360),
	 "3-WATER90" : (hue >=  36 && hue <   37) || //W98% 308-37
                        (hue >= 308 && hue <  324),
	 "4-WATER80" : (hue >=  37 && hue <  160) //NW98% 37-160
	};
 
//Min
MNT minv ("CAT_MNT");
 
 minv = New(Name="Min_12345",ResX=5,ResY=5,Escala=10000); 
 
  //  min := Minimum(r,g,b)
  minv = (m1 <= m2) && (m1 <= m3) && (m1 <= m4) && (m1 <= m5) ? m1 :
         (m2 <= m3) && (m2 <= m4) && (m2 <= m5) ? m2 :
         (m3 <= m4) && (m3 <= m5) ? m3 :
         (m4 <= m5) ? m4 : m5;
 
 
Tematico slc2 ("Aguas");
 
 slc2 =Novo(Nome = "H_235_95_98N_Min4Cla", ResX = 5, ResY = 5, Escala = 10000);
 
 slc2 =  Atribua ( CategoriaFim = "Aguas" ) 
	{
	 "1-WATER"   : (slc.Class == "1-WATER"  ) && //W90% 16-35
                        (minv < 0.425),              //Min %99.5
	 "2-WATER95" : (slc.Class == "2-WATER95") && //W95% 324-36
                        (minv < 0.425),              //Min %99.5
	 "3-WATER90" : (slc.Class == "3-WATER90") && //W98% 308-37
                        (minv < 0.425),              //Min %99.5
	 "4-WATER80" : (slc.Class == "4-WATER80") && //NW98% 37-160
                        (minv < 0.32),               //Min %90
	 "5-WATER70" : (slc.Class == "4-WATER80") && //NW98% 37-160
                        (minv < 0.335),              //Min %95
	 "6-WATER60" : (slc.Class == "4-WATER80") && //NW98% 37-160
                        (minv < 0.375),              //Min %99
	 "7-WATER50" : (slc.Class == "4-WATER80") && //NW98% 37-160
                        (minv < 0.425)               //Min %99.5
	};
}