【发布时间】:2011-04-24 15:44:51
【问题描述】:
好吧,所以我一直非常沮丧尝试将 12 位缓冲区转换为 8 位缓冲区。 图像源是 12 位灰度(从 JPEG2000 解压缩),其颜色范围为 0-4095。现在我必须将其减少到 0-255。常识告诉我,我应该像这样简单地划分每个像素值。但是当我尝试这个时,图像太亮了。
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));
}
}
现在我可以看出需要进行一些对比度调整。有什么想法吗?
提前致谢
【问题讨论】:
-
为什么 shortArray 被声明为 unsigned char * 而不是更方便的 unsigned* 类型?
-
您可能会尝试使用伽马校正:类似 pow(double(pixel)/16, gamma)/pow(255,gamma) - 伽马为 1.1 且因口味而异。
-
@DarenW :因为我使用的任何阅读器一次读取一个字节,就像大多数阅读器一样。但是,它包含的空间是 charBuffer 的两倍,因为它必须容纳两倍的字节数。
-
@Tony:是的,我认为这与我最终所做的非常相似。我一定会试一试,看看它会把我带到哪里。