docs: public static <T extends ImageBase<T>>
  	void down( T input , T output ) {
  		if( ImageGray.class.isAssignableFrom(input.getClass())  ) {
  			if(BoofConcurrency.USE_CONCURRENT ) {
  				if (input instanceof GrayU8) {
  					GrayF32 middle = new GrayF32(output.width, input.height);
  					ImplAverageDownSample_MT.horizontal((GrayU8) input, middle);
  					ImplAverageDownSample_MT.vertical(middle, (GrayI8) output);
  				} else if (input instanceof GrayU16) {
  					GrayF32 middle = new GrayF32(output.width, input.height);
  					ImplAverageDownSample_MT.horizontal((GrayU16) input, middle);
  					ImplAverageDownSample_MT.vertical(middle, (GrayU16) output);
  				} else if (input instanceof GrayF32) {
  					GrayF32 middle = new GrayF32(output.width, input.height);
  					ImplAverageDownSample_MT.horizontal((GrayF32) input, middle);
  					ImplAverageDownSample_MT.vertical(middle, (GrayF32) output);
  				} else if (input instanceof GrayF64) {
  					GrayF64 middle = new GrayF64(output.width, input.height);
  					ImplAverageDownSample_MT.horizontal((GrayF64) input, middle);
  					ImplAverageDownSample_MT.vertical(middle, (GrayF64) output);
  				} else {
  					throw new IllegalArgumentException("Unknown image type");
  				}
  			} else {
  				if (input instanceof GrayU8) {
  					GrayF32 middle = new GrayF32(output.width, input.height);
  					ImplAverageDownSample.horizontal((GrayU8) input, middle);
  					ImplAverageDownSample.vertical(middle, (GrayI8) output);
  				} else if (input instanceof GrayU16) {
  					GrayF32 middle = new GrayF32(output.width, input.height);
  					ImplAverageDownSample.horizontal((GrayU16) input, middle);
  					ImplAverageDownSample.vertical(middle, (GrayU16) output);
  				} else if (input instanceof GrayF32) {
  					GrayF32 middle = new GrayF32(output.width, input.height);
  					ImplAverageDownSample.horizontal((GrayF32) input, middle);
  					ImplAverageDownSample.vertical(middle, (GrayF32) output);
  				} else if (input instanceof GrayF64) {
  					GrayF64 middle = new GrayF64(output.width, input.height);
  					ImplAverageDownSample.horizontal((GrayF64) input, middle);
  					ImplAverageDownSample.vertical(middle, (GrayF64) output);
  				} else {
  					throw new IllegalArgumentException("Unknown image type");
  				}
  			}
  		} else if( Planar.class.isAssignableFrom(input.getClass())  ) {
  			Planar in = (Planar)input;
  			Planar out = (Planar)output;
  
  			int N = in.getNumBands();
  
  			for (int i = 0; i < N; i++) {
  				down(in.getBand(i),out.getBand(i));
  			}
  		}
  	}