将16位灰度图像复制到48位rgb图像

时间:2014-09-09 19:01:12

标签: image grayscale 16-bit

我有16位灰度图像的原始数据。我想通过将相同的值复制到所有3个通道来制作48位RGB图像。 现在我在做:

BYTE *bit=new BYTE[512*512*6];
int j=-1;
int i=0;
for(int k=0;k<512*512;k++)
{
    bit[i]=ptr[++j];
    bit[++i]=ptr[j];
    bit[++i]=ptr[j];
    bit[++i]=ptr[++j];
    bit[++i]=ptr[j];
    bit[++i]=ptr[j];
    i++;
}

此代码会产生淡黄色调。是否需要换位?

1 个答案:

答案 0 :(得分:2)

试试这个:

BYTE *bit=new BYTE[512*512*6];
int j=-2;
int i=-1;
for(int k=0;k<512*512;k++)
{
    bit[++i]=ptr[++++j];
    bit[++i]=ptr[j+1];
    bit[++i]=ptr[j];
    bit[++i]=ptr[j+1];
    bit[++i]=ptr[j];
    bit[++i]=ptr[j+1];
}

这将执行以下操作。

第一轮:

    bit[0]=ptr[0];
    bit[1]=ptr[1];
    bit[2]=ptr[0];
    bit[3]=ptr[1];
    bit[4]=ptr[0];
    bit[5]=ptr[1];

第二轮:

    bit[6]=ptr[2];
    bit[7]=ptr[3];
    bit[8]=ptr[2];
    bit[9]=ptr[3];
    bit[10]=ptr[2];
    bit[11]=ptr[3];

...等

实际上您不需要ij

BYTE *bit=new BYTE[512*512*6];
for(int k=0;k<512*512;k++)
{
    bit[6*k]=ptr[2*k];
    bit[6*k+1]=ptr[2*k+1];
    bit[6*k+2]=ptr[2*k];
    bit[6*k+3]=ptr[2*k+1];
    bit[6*k+4]=ptr[2*k];
    bit[6*k+5]=ptr[2*k+1];
}

反向操作(48位到16位):

BYTE *bit=new BYTE[512*512*6];
for(int k=0;k<512*512;k++)
{
    ptr[2*k]=bit[6*k];
    ptr[2*k+1]=bit[6*k+1];
}

如果RGB图像不是灰度,那么您必须calculate the luminance每个像素并将亮度复制到16位灰度图像中:

BYTE *bit=new BYTE[512*512*6];
for(int k=0;k<512*512;k++)
{
    unsigned int R=(bit[6*k]<<8)+bit[6*k+1];
    unsigned int G=(bit[6*k+2]<<8)+bit[6*k+3];
    unsigned int B=(bit[6*k+4]<<8)+bit[6*k+5];
    unsigned int Y=(unsigned int)round(0.2126*R+0.7152*G+0.0722*B); 
    ptr[2*k]=Y>>8;
    ptr[2*k+1]=Y&0xFF;
}

此代码假定首先存储最重要的字节(big-endian)。如果您使用little-endian存储:

BYTE *bit=new BYTE[512*512*6];
for(int k=0;k<512*512;k++)
{
    unsigned int R=(bit[6*k+1]<<8)+bit[6*k];
    unsigned int G=(bit[6*k+3]<<8)+bit[6*k+2];
    unsigned int B=(bit[6*k+5]<<8)+bit[6*k+4];
    unsigned int Y=(unsigned int)round(0.2126*R+0.7152*G+0.0722*B); 
    ptr[2*k+1]=Y>>8;
    ptr[2*k]=Y&0xFF;
}