¿Cómo convertir una imagen de 12 bits a 8 bits en C / C ++?

Muy bien, entonces me he sentido muy frustrado tratando de convertir un búfer de 12 bits en uno de 8 bits. La fuente de la imagen es un GrayScale de 12 bits (descomprimido de JPEG2000) cuyo rango de color va de 0 a 4095. Ahora tengo que reducir eso a 0-255. El sentido común me dice que simplemente debería dividir cada valor de píxel de esta manera. Pero cuando intento esto, la imagen sale demasiado clara.

void 
TwelveToEightBit(
    unsigned char * charArray,
    unsigned char * shortArray,
    const int num )
{

    short shortValue  = 0; //Will contain the two bytes in the shortArray.
    double doubleValue  = 0; //Will contain intermediary calculations.

    for( int i = 0, j =0; i < num; i++, j +=2 )
    {
        // Bitwise manipulations to fit two chars onto one short.
        shortValue = (shortArray[j]<<8);
        shortValue += (shortArray[j+1]);

        charArray[i] = (( unsigned char)(shortValue/16));
    }
}

Ahora puedo decir que debe haber algunos ajustes de contraste. ¿Alguna idea de alguien?

Muchas gracias de antemano

Respuestas a la pregunta(5)

Su respuesta a la pregunta