docs: public void process(GrayU8 input , GrayS32 seeds ) {
  		InputSanityCheck.checkSameShape(input,seeds);
  
  		removedWatersheds = false;
  		output.reshape(input.width+2,input.height+2);
  		distance.reshape(input.width+2,input.height+2);
  
  		ImageMiscOps.fill(output, INIT);
  		ImageMiscOps.fill(distance, 0);
  		fifo.reset();
  
  		// copy the seeds into the output directory
  		for( int y = 0; y < seeds.height; y++ ) {
  			int indexSeeds = seeds.startIndex + y*seeds.stride;
  			int indexOut = (y+1)*output.stride + 1;
  			for( int x = 0; x < seeds.width; x++ , indexSeeds++, indexOut++ ) {
  				int v = seeds.data[indexSeeds];
  				if( v > 0 ) {
  					output.data[indexOut] = v;
  				}
  			}
  		}
  
  		// sort pixels
  		sortPixels(input);
  
  		// perform watershed
  		for( int i = 0; i < histogram.length; i++ ) {
  			GrowQueue_I32 level = histogram[i];
  			if( level.size == 0 )
  				continue;
  
  			// Go through each pixel at this level and mark them according to their neighbors
  			for( int j = 0; j < level.size; j++ ) {
  				int index = level.data[j];
  
  				// If not has not already been labeled by a seed then try assigning it values
  				// from its neighbors
  				if( output.data[index] == INIT ) {
  					output.data[index] = MASK;
  					assignNewToNeighbors(index);
  				}
  			}
  
  			currentDistance = 1;
  			fifo.add(MARKER_PIXEL);
  
  			while( true ) {
  				int p = fifo.popHead();
  
  				// end of a cycle.  Exit the loop if it is done or increase the distance and continue processing
  				if( p == MARKER_PIXEL) {
  					if( fifo.isEmpty() )
  						break;
  					else {
  						fifo.add(MARKER_PIXEL);
  						currentDistance++;
  						p = fifo.popHead();
  					}
  				}
  
  				// look at its neighbors and see if they have been labeled or belong to a watershed
  				// and update its distance
  				checkNeighborsAssign(p);
  			}
  
  			// Ensure that all pixels have a distance of zero
  			// Could probably do this a bit more intelligently...
  			ImageMiscOps.fill(distance, 0);
  		}
  	}