public SurfMultiSpectral_to_DescribeRegionPoint(
      DescribePointSurfMultiSpectral<II> alg, Class<T> imageType, Class<II> integralType) {
    this.alg = alg;

    gray = GeneralizedImageOps.createSingleBand(imageType, 1, 1);
    grayII = GeneralizedImageOps.createSingleBand(integralType, 1, 1);
    bandII = new MultiSpectral<II>(integralType, 1, 1, alg.getNumBands());

    this.imageType = ImageType.ms(alg.getNumBands(), imageType);
  }
  @Override
  public boolean process(
      double x, double y, double orientation, double radius, BrightFeature description) {

    alg.describe(x, y, orientation, radius / BoofDefaults.SURF_SCALE_TO_RADIUS, description);

    return true;
  }
  @Override
  public void setImage(MultiSpectral<T> image) {
    gray.reshape(image.width, image.height);
    grayII.reshape(image.width, image.height);
    bandII.reshape(image.width, image.height);

    GConvertImage.average(image, gray);
    GIntegralImageOps.transform(gray, grayII);
    for (int i = 0; i < image.getNumBands(); i++)
      GIntegralImageOps.transform(image.getBand(i), bandII.getBand(i));

    alg.setImage(grayII, bandII);
  }
 @Override
 public double getCanonicalWidth() {
   return alg.getDescribe().getCanonicalWidth();
 }
 @Override
 public BrightFeature createDescription() {
   return alg.createDescription();
 }