这个没有转换没有严格的公式吧,就是颜色插补呗。
RGB Raw Data的格式是:
----------
R,G,R,G,R,G....
G,B,G,B,G,B....
R,G,R,G,R,G....
......
----------
即每个象素点只表示一种颜色值(要是是R,要么是G,要么是B)。而你说的RGB24的格式是每个点都用三种颜色表示。
----------
RGB,RGB,RGB,RGB,....
RGB,RGB,RGB,RGB,....
RGB,RGB,RGB,RGB,....
......
----------
CPU取得了RGB Raw数据之后首先就要把它转换到RGB888(RGB24),然后再进行RGB to YUV的转换或者直接存储RGB888/压缩存储JPEG。本来每个点只有单色信号值,另外两种颜色怎么来呢?这就需要进行颜色插补,也就是把相邻象素的其余两种颜色补充进来,作为自己的色彩值用。因为相邻象素(其实就是相邻几个um的距离))的颜色具有相关性,借用过来是完全可行的。
比如,第一行的第一列的像点,本来只有一个R,那么在转换时就把第一行第二列的G和第二行第一列的G相加再除以2的平均值借用过来,再把第二行第二列的B直接借用上来,于是就得到了一个完整的RGB三原色。
又如第二行第二列的这个像点,本来只有一个B,但是它的四周近邻不是有4个R、4个G吗?通过把4个R、G分别相加再除以4,得出的R、G平均值作为此点的R、G数值,这不也就是完整的RGB888吗?这就是3×3算法的颜色插补,也有2×2算法的,那就是只取上下左右的,左上左下右上右下四个点的值不取。
这样说,应该明白了吧,其实不是什么复杂的公式,而且因为位置的关系,在边缘的象素与中间的象素插补算法不一样,所以如果是软件来进行转换的话还需要做几个不同的算法分支。 |