docs: public static <T extends ImageGray<T>>
  	DetectDescribePoint<T,BrightFeature> sift( @Nullable ConfigCompleteSift config )
  	{
  		if( config == null )
  			config = new ConfigCompleteSift();
  
  		ConfigSiftScaleSpace configSS = config.scaleSpace;
  		ConfigSiftDetector configDetector = config.detector;
  		ConfigSiftOrientation configOri = config.orientation;
  		ConfigSiftDescribe configDesc = config.describe;
  
  		SiftScaleSpace scaleSpace = new SiftScaleSpace(
  				configSS.firstOctave,configSS.lastOctave,configSS.numScales,configSS.sigma0);
  		OrientationHistogramSift<GrayF32> orientation = new OrientationHistogramSift<>(
  				configOri.histogramSize,configOri.sigmaEnlarge,GrayF32.class);
  		DescribePointSift<GrayF32> describe = new DescribePointSift<>(
  				configDesc.widthSubregion,configDesc.widthGrid, configDesc.numHistogramBins,
  				configDesc.sigmaToPixels, configDesc.weightingSigmaFraction,
  				configDesc.maxDescriptorElementValue,GrayF32.class);
  
  		NonMaxSuppression nns = FactoryFeatureExtractor.nonmax(configDetector.extract);
  		NonMaxLimiter nonMax = new NonMaxLimiter(nns,configDetector.maxFeaturesPerScale);
  		CompleteSift dds = new CompleteSift(scaleSpace,configDetector.edgeR,nonMax,orientation,describe);
  		return new DetectDescribe_CompleteSift<>(dds);
  	}