RGB Bayer转为RGB
Raw RGB 每个像素只有一种颜色(R、G、B中的一种);
RGB 每个像素都有三种颜色,每一个的值在0~255之间;
在手机摄像头的测试过程中,由sensor输出的数据就是Raw data(Raw RGB),经过彩色插值就变成RGB。
也不一定就是测试过程,想要获得真正的图像,都必须有的一个过程;
sensor输出的数据格式,主要分两种:YUV(比较流行),RGB,这就是sonsor的数据输出;这其中的GRB就是Raw RGB,是sensor的bayer阵列获取的数据(每种传感器获得对应的颜色亮度);
但是输出的数据不等于就是图像的实际数据,模组测试时,就要写一个软件,完成数据采集(获得Raw data)->彩色插值(目的是获得RGB格式,便于图像显示)->图像显示;
这样就可以发现整个模组是否正常,有无坏点,脏点的等,检测出不良品;(软件的处理过程当中,为了获得更好的图像质量,还需要白平衡,gamma校正,彩色校正)
而在手机的应用中,手机根据相机模组的数据格式,提供一个ISP(主要用于RGB格式的),配合软件,使照相功能得到应用;
-----------------------------------------------------------------------------------------------------
RGB Bayer(CMOS sensor直接输出的数据)
可以看出, Bayer 模式每一个像素只取RGB颜色空间中一种颜色分量, 奇数行包含G, B分量, 偶数行包含R, G分量, 奇数列包含G, R分量, 偶数列包含B, G分量。采用线性插值。
插值算法:所有像素点插值时都以包含其右下角四个像素点插值,用寄存器存储两行值。data_control={行(奇偶),列(奇偶)}
算法如图所示:
(行计数从上到下,列计数从左到右)
移位寄存器Line_Buffer
代码如下:
reg [11:0] rRed;
reg [12:0] rGreen;
reg [11:0] rBlue;
reg [11:0] wData0_d1;
reg [11:0] wData1_d1;
Line_Buffer L1 ( .clken(iDval), .clock(iCLK), .shiftin(iData), .shiftout(), // .taps1x(wData0), // .taps0x(wData1), .taps({wData0,wData1}) ); assign data_control = {iMIRROR?~iY_Cont[0]:iY_Cont[0],iMIRROR?iX_Cont[0]:~iX_Cont[0]}; always@(posedge iCLK or negedge iRST_n) begin if (!iRST_n) begin wData0_d1<=0; wData1_d1<=0; rDval <=0; end else begin wData0_d1<=wData0; wData1_d1<=wData1; rDval <=iDval; end end always@(posedge iCLK or negedge iRST_n) begin if (!iRST_n) begin rRed <= 0; rGreen<= 0; rBlue <= 0; end else if ( data_control== 2'b10) begin rRed <= wData0; rGreen <= wData0_d1+wData1; rBlue <= wData1_d1; end else if ( data_control== 2'b11) begin rRed <= wData0_d1; rGreen <= wData0+wData1_d1; rBlue <= wData1; end else if ( data_control== 2'b00) begin rRed <= wData1; rGreen <= wData0+wData1_d1; rBlue <= wData0_d1; end else if ( data_control== 2'b01) begin rRed <= wData1_d1; rGreen <= wData0_d1+wData1; rBlue <= wData0; end end