RAW10 pixel 相叠加

目前在手持设备上,Raw Sensor吐出的数据一般都是RAW10,即一个像素用10 bit来存储,下面通过用位域的方式来简单的对两块RAW10数据进行相加运算,以此来达到像素叠加的效果。

typedef unsigned long long MUINT64;
typedef unsigned int MUINT32;
typedef unsigned char MUINT8;

struct pixel16 {
    MUINT64 p1 : 10;
    MUINT64 p2 : 10;
    MUINT64 p3 : 10;
    MUINT64 p4 : 10;
    MUINT64 p5 : 10;
    MUINT64 p6 : 10;
};

struct pixel78 {
    MUINT32 pad : 4;
    MUINT32 p7 : 10;
    MUINT32 p8 : 10;
};

void composePixel(MUINT8 *buf1, MUINT8 buf2)
{
    MUINT8 pixel[8] = { 0 };
    ...
    pixel[0] = ((struct pixel16 *) buf1)->p1 +  ((struct pixel16 *) buf2)->p1;
    pixel[1] = ((struct pixel16 *) buf1)->p2 +  ((struct pixel16 *) buf2)->p2;
    pixel[2] = ((struct pixel16 *) buf1)->p3 +  ((struct pixel16 *) buf2)->p3;
    pixel[3] = ((struct pixel16 *) buf1)->p4 +  ((struct pixel16 *) buf2)->p4;
    pixel[4] = ((struct pixel16 *) buf1)->p5 +  ((struct pixel16 *) buf2)->p5;
    pixel[5] = ((struct pixel16 *) buf1)->p6 +  ((struct pixel16 *) buf2)->p6;
    pixel[6] = ((struct pixel78 *) (buf1 + 7))->p7 +  ((struct pixel78 *) (buf2 + 7))->p7;
    pixel[7] = ((struct pixel78 *) (buf1 + 7))->p8 +  ((struct pixel78 *) (buf2 + 7))->p8;
    ...
}


仅仅选取了 0 号字节单元到7 号字节单元部分运算。

数据在内存中是连续存放的,所以定义两个pixel16和pixel78结构体,方便从内存中取出数据,然后解析为对应的像素。


通过上述代码可知,

[0... 59]  --- pixel1~pixel6
[60...80] --- pixel7~pixel7, [56...59]  --- pad


即 第0号字节单元的 bit0 到第7号字节单元的bit59,就是pixel 1 ~pixel 6,一共60 bit(6个像素)

然后从第7号字节单元开始取数据,但第7号字节单元的bit56... bit59 一个四位数据是pixel 6的后四位数据,因此用pad来占位。从 第7号单元的bit60...bit 80为pixel 7 和pixel 8的数据。


则可以很方便的将数据从buf中取出,然后对单个像素进行处理运算。

你可能感兴趣的:(RAW10 pixel 相叠加)