Como converter uma imagem de 12 bits para 8 bits em C / C ++?

Tudo bem, então eu fiquei muito frustrado tentando converter um buffer de 12 bits em um de 8 bits. A origem da imagem é um GrayScale de 12 bits (descompactado do JPEG2000) cujo intervalo de cores varia de 0 a 4095. Agora eu tenho que reduzir isso para 0-255. O senso comum me diz que eu deveria simplesmente dividir cada valor de pixel assim. Mas quando eu tento isso, a imagem sai muito 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));
    }
}

Agora posso dizer que é preciso fazer alguns ajustes de contraste. Alguma idéia para alguém?

Muito obrigado antecipadamente