docs: @Override
  	protected void computeStatistics(T input, int innerWidth, int innerHeight) {
  		final int statPixelStride = stats.getImageType().getNumBands();
  		final int statStride = stats.stride;
  
  		int vblocks = innerHeight/blockHeight;
  		if( vblocks*blockHeight < innerHeight )
  			vblocks++;
  
  		//		for (int y = 0; y < innerHeight; y += blockHeight) {
  		BoofConcurrency.loopFor(0, vblocks, vblock -> {
  			BlockProcessor<T,S> processor = processors.pop();
  			processor.init(blockWidth,blockHeight,thresholdFromLocalBlocks);
  			int y = vblock*blockHeight;
  
  			int indexStats = (y/blockHeight)*statStride;
  			for (int x = 0; x < innerWidth; x += blockWidth, indexStats += statPixelStride) {
  				processor.computeBlockStatistics(x,y,blockWidth,blockHeight,indexStats,input,stats);
  			}
  			// handle the case where the image's width isn't evenly divisible by the block's width
  			if( innerWidth != input.width ) {
  				processor.computeBlockStatistics(innerWidth,y,input.width-innerWidth,blockHeight,indexStats,input,stats);
  			}
  			processors.recycle(processor);
  		});
  
  		// NOTE: below could be thrown into its own thread before the code above. Not easy with current thread design
  		// handle the case where the image's height isn't evenly divisible by the block's height
  		if( innerHeight != input.height ) {
  			BlockProcessor<T,S> processor = processors.pop();
  			processor.init(blockWidth,blockHeight,thresholdFromLocalBlocks);
  
  			int indexStats = (innerHeight/blockHeight)*statStride;
  			int y = innerHeight;
  			int blockHeight = input.height-innerHeight;
  			for (int x = 0; x < innerWidth; x += blockWidth, indexStats += statPixelStride) {
  				processor.computeBlockStatistics(x,y,blockWidth,blockHeight,indexStats,input,stats);
  			}
  			if( innerWidth != input.width ) {
  				processor.computeBlockStatistics(innerWidth,y,input.width-innerWidth,blockHeight,indexStats,input,stats);
  			}
  		}
  	}