This is the function that builds the grayscale LUT for Scuba.

void
ScubaLayer2DMRI::BuildGrayscaleLUT () {

  // Calculate the window so that it is centered on the level and
  // extends window/2 in either direction.
  float window[2];
  window[0] = mLevel - mWindow*0.5;
  window[1] = mLevel + mWindow*0.5;

  if( mMinVisibleValue == mMaxVisibleValue ||
      (mLevel == 0 && mWindow == 0) ) {
    
    // If same min and max visible values, all values should be 0.
    memset( mGrayscaleLUT, 0, sizeof(mGrayscaleLUT) );
    
  } else {
    
    for( float nEntry = 0; nEntry < cGrayscaleLUTEntries; nEntry+=1 ) {
      
      // Get the value using the visible min/max to get highest
      // granularity within the 0 - cGrayscaleLUTEntries range.
      float value = ((nEntry * (mMaxVisibleValue-mMinVisibleValue)) / 
                     (cGrayscaleLUTEntries-1)) + mMinVisibleValue;
      
      // Get an intensity from 0-1 based on our window.
      float intensity = (value - window[0]) / (window[1] - window[0]); 
      
      // Cap the intensity.
      if( intensity < 0.0 ) intensity = 0.0;
      if( intensity > 1.0 ) intensity = 1.0;
      
      // Now apply a sigmoid function with the brightness and contrast
      // values, with the brightness adjusting the x shift and the
      // contrast adjusting the sharpness of the curve.
      float bcdValue =
        1.0 / (1.0 + exp( (intensity-mBrightness) * -mContrast) );
      
      // Set the value.
      mGrayscaleLUT[(int)nEntry] = 
        (int) floor( bcdValue * kMaxPixelComponentValueFloat );
    }
  }
}

ScubaGrayscaleCode (last edited 2008-04-29 11:45:40 by localhost)