CrazyBingo

彩色ccd拍出的视频为何是黑白的(Bayer)(转)

0
阅读(5359)

http://zhidao.baidu.com/question/450099243.html

这篇有些图实在太形象了。。。所以。。受不了了。。

 

彩色ccd拍出的视频为何是黑白的,上边好多格子,用matlab提取帧图片也是黑白的,但是其属性确实RGB 的。

wps_clip_image-11085

由于彩色的CCD,一般是BAYER格式的阵列。比如说RGRG/GBGB。这样的话,是3个相邻像素的值代表一个像素的彩色信息。所以BAYER格式的数据,要转成彩色图像的话,需要做色彩还原。就是bayer转RGB,做插值处理。而如果没有所色彩还原,直接将BAYER数据显示出来,每个像素值代表一个像素的形式显示,所以是黑白的,所以会有很多小方格。Bayer原理是,每个像素都配有一个单色的滤镜(CCD本身),这样的话,没相邻两个像素感光特性是不一样的。通过领域插值复原,这样减少了2/3的成本。

wps_clip_image-31369

首先matlab可以实现bayer转RGB,bayer转RGB是通过插值方法实现的,比较容易实现。我手里没有matlab程序,以前我做过VC的,只是简单的插值,没有太多的考虑,所以色彩还原的不是太完美。
buf[i][j]是接收到的bayer数据。
window_x,window_y是分辨率。
data_RGB是色彩还原后的像素数据。

wps_clip_image-11746
  for(i=0;i<WINDOW_Y;i++)
  {
for(j=0;j<WINDOW_X;j++)
{
if(0==i || 479==i || 0==j || 639==j ) //边界
{
if((i%2==0) && (j%2==1))  // 偶数行,奇数列,为蓝色像素
{
data_RGB[i][j][0]=buffer[i][j]; // B
data_RGB[i][j][1]=0;   // G
data_RGB[i][j][2]=0;   // R
}
else if((i%2==1) && (j%2==0)) // 奇数行,偶数列,为红色像素    
{
data_RGB[i][j][0]=0;   // R
data_RGB[i][j][1]=0;   // G
data_RGB[i][j][2]=buffer[i][j]; // B
}
else       // (偶数行,偶数列)、(奇数行,奇数列)都为绿色像素,
{
data_RGB[i][j][0]=0;   // R
data_RGB[i][j][1]=buffer[i][j]; // G
data_RGB[i][j][2]=0;   // B
}
}

}