docs: public static void rgbToHsv_F32(Planar<GrayF32> rgb , Planar<GrayF32> hsv ) {
  		GrayF32 R = rgb.getBand(0);
  		GrayF32 G = rgb.getBand(1);
  		GrayF32 B = rgb.getBand(2);
  
  		GrayF32 H = hsv.getBand(0);
  		GrayF32 S = hsv.getBand(1);
  		GrayF32 V = hsv.getBand(2);
  
  		//CONCURRENT_BELOW BoofConcurrency.loopFor(0,hsv.height,row->{
  		for( int row = 0; row < hsv.height; row++ ) {
  			int indexRgb = rgb.startIndex + row*rgb.stride;
  			int indexHsv = hsv.startIndex + row*hsv.stride;
  			int endRgb = indexRgb+hsv.width;
  
  			for( ; indexRgb < endRgb; indexHsv++ , indexRgb++) {
  
  				float r = R.data[indexRgb];
  				float g = G.data[indexRgb];
  				float b = B.data[indexRgb];
  
  				float max = r > g ? ( r > b ? r : b) : ( g > b ? g : b );
  				float min = r < g ? ( r < b ? r : b) : ( g < b ? g : b );
  
  				float delta = max - min;
  
  				V.data[indexHsv] = max;
  
  				if( max != 0 )
  					S.data[indexHsv] = delta / max;
  				else {
  					H.data[indexHsv] = Float.NaN;
  					S.data[indexHsv] = 0;
  					continue;
  				}
  
  				float h;
  				if( r == max )
  					h = ( g - b ) / delta;
  				else if( g == max )
  					h = 2 + ( b - r ) / delta;
  				else
  					h = 4 + ( r - g ) / delta;
  
  				h *= d60_F32;
  				if( h < 0 )
  					h += PI2_F32;
  
  				H.data[indexHsv] = h;
  			}
  		}
  		//CONCURRENT_ABOVE });
  	}