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 );
}
}
}