【问题标题】:Copying 16bit grascale image to 48 bit rgb image将 16 位灰度图像复制到 48 位 rgb 图像
【发布时间】:2014-11-03 07:11:35
【问题描述】:

我有 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++;
}

此代码会产生淡黄色调。需要移位之类的东西吗?

【问题讨论】:

    标签: image grayscale 16-bit


    【解决方案1】:

    试试这个:

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

    此代码假定首先存储最高有效字节(大端)。如果您使用 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;
    }
    

    【讨论】:

    • 那么反向操作,即 48 位到 16 位图像呢
    • 我在答案末尾添加了反向操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 2015-08-11
    • 2020-05-15
    • 1970-01-01
    • 2017-07-31
    • 2012-06-13
    相关资源
    最近更新 更多