code: public static List<double[]> independentHueSat( List<File> images  ) {
  		List<double[]> points = new ArrayList<>();
  
  		// The number of bins is an important parameter.  Try adjusting it
  		TupleDesc_F64 histogramHue = new TupleDesc_F64(30);
  		TupleDesc_F64 histogramValue = new TupleDesc_F64(30);
  
  		List<TupleDesc_F64> histogramList = new ArrayList<>();
  		histogramList.add(histogramHue); histogramList.add(histogramValue);
  
  		Planar<GrayF32> rgb = new Planar<>(GrayF32.class,1,1,3);
  		Planar<GrayF32> hsv = new Planar<>(GrayF32.class,1,1,3);
  
  		for( File f : images ) {
  			BufferedImage buffered = UtilImageIO.loadImage(f.getPath());
  			if( buffered == null ) throw new RuntimeException("Can't load image!");
  
  			rgb.reshape(buffered.getWidth(), buffered.getHeight());
  			hsv.reshape(buffered.getWidth(), buffered.getHeight());
  			ConvertBufferedImage.convertFrom(buffered, rgb, true);
  			ColorHsv.rgbToHsv(rgb, hsv);
  
  			GHistogramFeatureOps.histogram(hsv.getBand(0), 0, 2*Math.PI,histogramHue);
  			GHistogramFeatureOps.histogram(hsv.getBand(1), 0, 1, histogramValue);
  
  			// need to combine them into a single descriptor for processing later on
  			TupleDesc_F64 imageHist = UtilFeature.combine(histogramList,null);
  
  			UtilFeature.normalizeL2(imageHist); // normalize so that image size doesn't matter
  
  			points.add(imageHist.value);
  		}
  
  		return points;
  	}
docs: Computes two independent 1D histograms from hue and saturation.  Less affects by sparsity, but can produce
  worse results since the basic assumption that hue and saturation are decoupled is most of the time false.