docs: public static NonMaxSuppression nonmax( @Nullable ConfigExtract config ) {
  
  		if( config == null )
  			config = new ConfigExtract();
  		config.checkValidity();
  
  		if( BOverrideFactoryFeatureExtractor.nonmax != null ) {
  			return BOverrideFactoryFeatureExtractor.nonmax.process(config);
  		}
  
  		NonMaxBlock.Search search;
  		if (config.useStrictRule) {
  			if( config.detectMaximums)
  				if( config.detectMinimums )
  					search = new NonMaxBlockSearchStrict.MinMax();
  				else
  					search = new NonMaxBlockSearchStrict.Max();
  			else
  				search = new NonMaxBlockSearchStrict.Min();
  		} else {
  			if( config.detectMaximums)
  				if( config.detectMinimums )
  					search = new NonMaxBlockSearchRelaxed.MinMax();
  				else
  					search = new NonMaxBlockSearchRelaxed.Max();
  			else
  				search = new NonMaxBlockSearchRelaxed.Min();
  		}
  
  		// See if the user wants to use threaded code or not
  		NonMaxBlock alg = BoofConcurrency.USE_CONCURRENT ?
  				new NonMaxBlock_MT(search) : new NonMaxBlock(search);
  
  		alg.setSearchRadius(config.radius);
  		alg.setThresholdMax(config.threshold);
  		alg.setThresholdMin(-config.threshold);
  		alg.setBorder(config.ignoreBorder);
  
  		return new WrapperNonMaximumBlock(alg);
  	}