docs: public void process(T gray) {
  		if( verbose) System.out.println("ENTER DetectCircleGrid.process()");
  
  		configureContourDetector(gray);
  		this.binary.reshape(gray.width,gray.height);
  
  		inputToBinary.process(gray, binary);
  
  		ellipseDetector.process(gray, binary);
  		List<BinaryEllipseDetector.EllipseInfo> found = ellipseDetector.getFound().toList();
  
  		if( verbose) System.out.println("  Found "+found.size()+" ellpises");
  
  		clusters.clear();
  		clustering.process(found, clusters);
  		clustersPruned.clear();
  		clustersPruned.addAll(clusters);
  
  		if( verbose) System.out.println("  Found "+clusters.size()+" clusters");
  		pruneIncorrectSize(clustersPruned, totalEllipses(numRows,numCols) );
  		if( verbose) System.out.println("  Remaining clusters after pruning by size "+clustersPruned.size());
  
  		List<EllipseRotated_F64> foundEllipses = new ArrayList<>();
  		for (int i = 0; i < found.size(); i++) {
  			foundEllipses.add( found.get(i).ellipse );
  		}
  
  		grider.process(foundEllipses, clustersPruned);
  
  		FastQueue<Grid> grids = grider.getGrids();
  
  		if( verbose) System.out.println("  Found "+grids.size()+" grids");
  		pruneIncorrectShape(grids,numRows,numCols);
  		if( verbose) System.out.println("  Remaining grids after pruning by shape "+grids.size());
  
  		validGrids.clear();
  		for (int i = 0; i < grids.size(); i++) {
  			Grid g = grids.get(i);
  			putGridIntoCanonical(g);
  			validGrids.add( g );
  		}
  
  		if( verbose) System.out.println("EXIT DetectCircleGrid.process()");
  	}