code: @Override
  	public void denoise(GrayF32 transform , int numLevels ) {
  		int scale = UtilWavelet.computeScale(numLevels);
  
  		final int h = transform.height;
  		final int w = transform.width;
  
  		// width and height of scaling image
  		final int innerWidth = w/scale;
  		final int innerHeight = h/scale;
  
  		GrayF32 subbandHH = transform.subimage(w/2,h/2,w,h, null);
  		float sigma = UtilDenoiseWavelet.estimateNoiseStdDev(subbandHH,null);
  		float threshold = (float) UtilDenoiseWavelet.universalThreshold(subbandHH,sigma);
  
  		// apply same threshold to all wavelet coefficients
  		rule.process(transform.subimage(innerWidth,0,w,h, null),threshold);
  		rule.process(transform.subimage(0,innerHeight,innerWidth,h, null),threshold);
  	}
docs: Applies VisuShrink denoising to the provided multilevel wavelet transform using
  the provided threshold.
  
  @param transform Mult-level wavelet transform.  Modified.
  @param numLevels Number of levels in the transform.