Bayer转换算法_第1页
Bayer转换算法_第2页
Bayer转换算法_第3页
Bayer转换算法_第4页
Bayer转换算法_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Bayer转换算法转/* raw.h */#ifndef _RAW_H_ #define _RAW_H_ #define GP_OK 1 typedef enum BAYER_TILE_RGGB = 0, BAYER_TILE_GRBG = 1, BAYER_TILE_BGGR = 2, BAYER_TILE_GBRG = 3, BAYER_TILE_RGGB_INTERLACED = 4, BAYER_TILE_GRBG_INTERLACED = 5, BAYER_TILE_BGGR_INTERLACED = 6, BAYER_TILE_GBRG_INTERLACED = 7, BayerT

2、ile; int gp_bayer_expand (unsigned char *input, int w, int h, unsigned char *output, BayerTile tile); int gp_bayer_decode (unsigned char *input, int w, int h, unsigned char *output, BayerTile tile); int gp_bayer_interpolate (unsigned char *image, int w, int h, BayerTile tile); #endif /* raw.c */#inc

3、lude raw.h static const int tile_colours84 = 0, 1, 1, 2, 1, 0, 2, 1, 2, 1, 1, 0, 1, 2, 0, 1, 0, 1, 1, 2, 1, 0, 2, 1, 2, 1, 1, 0, 1, 2, 0, 1; #define RED 0 #define GREEN 1 #define BLUE 2 static int gp_bayer_accrue (unsigned char *image, int w, int h, int x0, int y0, int x1, int y1, int x2, int y2, in

4、t x3, int y3, int colour); int gp_bayer_expand (unsigned char *input, int w, int h, unsigned char *output, BayerTile tile) int x, y, i; int colour, bayer; unsigned char *ptr = input; switch (tile) case BAYER_TILE_RGGB: case BAYER_TILE_GRBG: case BAYER_TILE_BGGR: case BAYER_TILE_GBRG: for (y = 0; y h

5、; +y) for (x = 0; x w; +x, +ptr) bayer = (x&1?0:1) + (y&1?0:2); colour = tile_colourstilebayer; i = (y * w + x) * 3; outputi+RED = 0; outputi+GREEN = 0; outputi+BLUE = 0; outputi+colour = *ptr; break; case BAYER_TILE_RGGB_INTERLACED: case BAYER_TILE_GRBG_INTERLACED: case BAYER_TILE_BGGR_INTERLACED:

6、case BAYER_TILE_GBRG_INTERLACED: for (y = 0; y h; +y, ptr+=w) for (x = 0; x 1:ptr(w1)+(x1); break; return (GP_OK); #define AD(x, y, w) (y)*(w)*3+3*(x) int gp_bayer_interpolate (unsigned char *image, int w, int h, BayerTile tile) int x, y, bayer; int p0, p1, p2, p3; int value, div ; switch (tile) def

7、ault: case BAYER_TILE_RGGB: case BAYER_TILE_RGGB_INTERLACED: p0 = 0; p1 = 1; p2 = 2; p3 = 3; break; case BAYER_TILE_GRBG: case BAYER_TILE_GRBG_INTERLACED: p0 = 1; p1 = 0; p2 = 3; p3 = 2; break; case BAYER_TILE_BGGR: case BAYER_TILE_BGGR_INTERLACED: p0 = 3; p1 = 2; p2 = 1; p3 = 0; break; case BAYER_T

8、ILE_GBRG: case BAYER_TILE_GBRG_INTERLACED: p0 = 2; p1 = 3; p2 = 0; p3 = 1; break; for (y = 0; y h; y+) for (x = 0; x w; x+) bayer = (x&1?0:1) + (y&1?0:2); if ( bayer = p0 ) /* red. green lrtb, blue diagonals */ imageAD(x,y,w)+GREEN = gp_bayer_accrue(image, w, h, x-1, y, x+1, y, x, y-1, x, y+1, GREEN

9、) ; imageAD(x,y,w)+BLUE = gp_bayer_accrue(image, w, h, x+1, y+1, x-1, y-1, x-1, y+1, x+1, y-1, BLUE) ; else if (bayer = p1) /* green. red lr, blue tb */ div = value = 0; if (x (w - 1) value += imageAD(x+1,y,w)+RED; div+; if (x) value += imageAD(x-1,y,w)+RED; div+; imageAD(x,y,w)+RED = value / div; d

10、iv = value = 0; if (y (h - 1) value += imageAD(x,y+1,w)+BLUE; div+; if (y) value += imageAD(x,y-1,w)+BLUE; div+; imageAD(x,y,w)+BLUE = value / div; else if ( bayer = p2 ) /* green. blue lr, red tb */ div = value = 0; if (x (w - 1) value += imageAD(x+1,y,w)+BLUE; div+; if (x) value += imageAD(x-1,y,w

11、)+BLUE; div+; imageAD(x,y,w)+BLUE = value / div; div = value = 0; if (y (h - 1) value += imageAD(x,y+1,w)+RED; div+; if (y) value += imageAD(x,y-1,w)+RED; div+; imageAD(x,y,w)+RED = value / div; else /* blue. green lrtb, red diagonals */ imageAD(x,y,w)+GREEN = gp_bayer_accrue (image, w, h, x-1, y, x

12、+1, y, x, y-1, x, y+1, GREEN) ; imageAD(x,y,w)+RED = gp_bayer_accrue (image, w, h, x+1, y+1, x-1, y-1, x-1, y+1, x+1, y-1, RED) ; return (GP_OK); static int gp_bayer_accrue (unsigned char *image, int w, int h, int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3, int colour) int x 4 ; int

13、y 4 ; int value 4 ; int above 4 ; int counter ; int sum_of_values; int average ; int i ; x0 = x0 ; x1 = x1 ; x2 = x2 ; x3 = x3 ; y0 = y0 ; y1 = y1 ; y2 = y2 ; y3 = y3 ; counter = sum_of_values = 0 ; if(colour = GREEN) for (i = 0 ; i = 0) & (xi = 0) & (yi 2*vdiff) return (value 3 + value 2)/2 ; if(vd

14、iff 2*hdiff) return (value 1 + value 0)/2 ; /* for blue and red */ counter = sum_of_values = 0 ; for (i = 0 ; i = 0) & (xi = 0) & (yi h) value i = imageAD(xi,yi,w) + colour ; sum_of_values += value i ; counter+ ; average = sum_of_values / counter ; if (counter 4) return average ; /* Less than four s

15、urrounding - just take average */ counter = 0 ; for (i = 0 ; i average ; if (abovei) counter+ ; /* Note: counter = 0 indicates all values the same */ if (counter = 2) | (counter = 0) return average ; sum_of_values = 0 ; for (i = 0 ; i 4 ; i+) if (counter = 3) = abovei) sum_of_values += valuei ; retu

16、rn sum_of_values / 3 ; int gp_bayer_decode (unsigned char *input, int w, int h, unsigned char *output, BayerTile tile) gp_bayer_expand (input, w, h, output, tile); gp_bayer_interpolate (output, w, h, tile); return (GP_OK); Bayer图像处理Bayer是相机内部的原始图片, 一般后缀名为.raw. 很多软件都可以查看, 比如PS.我们相机拍照下来存储在存储卡上的.jpeg或其

17、它格式的图片, 都是从.raw格式转化过来的. .raw格式内部的存储方式有多种, 但不管如何, 都是前两行的排列不同. 其格式可能如下:G R G R G R G RB G B G B G B GG R G R G R G RB G B G B G B G横为2的倍数, 竖为4的倍数, 它们构成了分辨率. 如, 上面则代表了 8 * 4 分辨率的Bayer图.我们要知道的是, G = 2 * R 及 G = 2 * B, 即绿色值为红色值或蓝色值的两倍, 因为人眼对绿色更敏感, 所以绿色的分量更重.下面说一下从bayer转换成rgb图的算法, RGB图, 即为三色图, 一个像素点就由RGB三

18、种颜色构成的混合色, 而bayer图一个像素就只有一个颜色, 或R或G或B. 因为bayer一个像素点只有一种颜色, 需要借助这个像素点周围的颜色对它进行插值(填充)另外的两种颜色, 它本身的颜色就不用插了. 一般的算法是:对于插入R和B, Rx = ( R1 + R2 ) / 2; 或-取上边和下边的平均值, 或是左边和右边的平均值Rx = ( R1 + R2 + R3 + R4 ) / 4;-取四个边的平均值B同理. 如:G B GR G RG B G对于中间的G, 它缺少 R和B, 用上下和左右的平均值进行求值.对于B G BG R GB G B这个图呢, 中间点R, 缺少G和B, G暂时没讨论, 那么 B, 就是从R的四个B角进行求平均值.=如果插入G, 稍有些复杂.不过一般的算法与R和B一样, 复杂的算法, 其复杂程度也提升一倍, 不过精度更高, 如果对于视频监测系统来说, 精度相对来说不必要求太高, 用R或B的解法即可. 下面说复杂的:对于图:R1G1R4 G4 R G2 R2G3R3对于中间点R, 它需要插

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论