docs: public static <I extends ImageGray<I>, D extends ImageGray<D>>
  	void hessian( DerivativeType type , I input , D derivXX , D derivYY , D derivXY , BorderType borderType ) {
  		ImageBorder<I> border = BorderType.SKIP == borderType ? null : FactoryImageBorder.wrap(borderType, input);
  
  		switch( type ) {
  			case SOBEL:
  				if( input instanceof GrayF32) {
  					HessianSobel.process((GrayF32) input, (GrayF32) derivXX, (GrayF32) derivYY, (GrayF32) derivXY, (ImageBorder_F32) border);
  				} else if( input instanceof GrayU8) {
  					HessianSobel.process((GrayU8) input, (GrayS16) derivXX, (GrayS16) derivYY, (GrayS16) derivXY, (ImageBorder_S32) border);
  				} else {
  					throw new IllegalArgumentException("Unknown input image type: "+input.getClass().getSimpleName());
  				}
  				break;
  
  			case THREE:
  				if( input instanceof GrayF32) {
  					HessianThree.process((GrayF32) input, (GrayF32) derivXX, (GrayF32) derivYY, (GrayF32) derivXY, (ImageBorder_F32) border);
  				} else if( input instanceof GrayU8) {
  					HessianThree.process((GrayU8) input, (GrayS16) derivXX, (GrayS16) derivYY, (GrayS16) derivXY, (ImageBorder_S32) border);
  				} else {
  					throw new IllegalArgumentException("Unknown input image type: "+input.getClass().getSimpleName());
  				}
  				break;
  
  			default:
  				throw new IllegalArgumentException("Unsupported derivative type "+type);
  		}
  	}