CrazyBingo

Bayer2RGB的Matlab实现 (以及FPGA的移植)

0
阅读(13849)

由于FPGA强大的并行高速运行能力,来替换相机内部的Bayer恢复,或者捕获Bayer(有些相机只能输出Bayer,比如Mt9v034),采用FPGA能实现实时处理,其他处理器不能匹及!!!这部分我仅仅是模拟CMOS等相机的Bayer处理,通过2行插值来实现,实际上要达到好的效果,至少需要3行插值,而且需要考虑梯度等信息,才能达到比较完美的状态!!!总是,完美是没有极限的吧!!!

由于篇幅的限制,此处仅仅详细介绍双线插值Bayer,3*3插值Bayer恢复实现你们自己研究去吧。。

 

 

1. Bayer2RGB的Matlab实现

wps_clip_image-22353

以上是OmniVision摄像头的拜耳阵列,其他摄像头可能不同。其中Gb和Gr表示的是G = 2 * R 及 G = 2 * B, 即绿色值为红色值或蓝色值的两倍, 因为人眼对绿色更敏感, 所以绿色的分量更重。

Matlab中矩阵从1开始,所以i(行数),j(列数)从1开始,对于上面格式的Bayer阵列,有如下规律:

1) R:i,j均为偶数

2) G:i+j等于奇数

3) B:i,j均为奇数

原图以及Bayer图片如下:

wps_clip_image-2158

通过Matlab转换为Bayer图像,转换代码如下,IMG2为24BitBayer图像,只是为了显示对照,IMG_Bayer为8Bit Raw Bayer图像!

IMG2 = zeros(h,w,3);

IMG_Bayer = zeros(h,w);

for i = 1 : h

    for j = 1 : w

        if(mod(i,2) == 0 && mod(j,2) == 0)      %For R: x,y is even

            IMG2(i,j,1) = IMG1(i,j,1);

            IMG_Bayer(i,j) = IMG1(i,j,1);

        elseif(mod(i+j,2) == 1)                 %For G: x+y is even

            IMG2(i,j,2) = IMG1(i,j,2);

            IMG_Bayer(i,j) = IMG1(i,j,2);

        else%if(mod(i,2) == 1 && mod(j,2) == 1) %For B: x,y is odd

            IMG2(i,j,3) = IMG1(i,j,3);

            IMG_Bayer(i,j) = IMG1(i,j,3);

        end

    end

end

wps_clip_image-16427

1.1. 转换方案1

1.1.1. 方案论证

wps_clip_image-19366

如上为一个单元,2行2列线性插值求平均:

1) 奇数行:1,3,5,7...

a) 奇数列,B在中心

i. R = Bayer(i+1,j+1)

ii. G = (Bayer(i,j+1) + Bayer(i+1,j))/2

iii. B = Bayer(i,j)

b) 偶数列,G在中心

i. R = Bayer(i+1,j)

ii. G = Bayer(i,j)

iii. B = Bayer(i,j-1)

2) 偶数行:2,4,6,8...

a) 奇数列,G在中心

i. R = Bayer(i,j+1)

ii. G = Bayer(i,j)

iii. B = Bayer(i-1,j)

b) 偶数列,R在中心

i. R = Bayer(i,j)

ii. G = (Bayer(i-1,j) + Bayer(i,j-1))/2

iii. B = Bayer(i-1,j-1)

1.1.2. Matlab代码

IMG3 = zeros(i,j,3);

for i = 1 : 2 : h  

    for j = 1 : w

        if(mod(j,2) == 1)   %Blue

            IMG3(i,j,1) = Bayer(i+1,j+1);  

            IMG3(i,j,2) = (Bayer(i,j+1) + Bayer(i+1,j))/2;

            IMG3(i,j,3) = Bayer(i,j);

        else                 %Green

            IMG3(i,j,1) = Bayer(i+1,j);  

            IMG3(i,j,2) = Bayer(i,j);

            IMG3(i,j,3) = Bayer(i,j-1);

        end

    end

end

% For even rows Bayer 2 RGB Convert

for i = 2 : 2 : h

    for j = 1 : w

        if(mod(j,2) == 1)   %Green

            IMG3(i,j,1) = Bayer(i,j+1);  

            IMG3(i,j,2) = Bayer(i,j);

            IMG3(i,j,3) = Bayer(i-1,j);

        else                 %Red

            IMG3(i,j,1) = Bayer(i,j);  

            IMG3(i,j,2) = (Bayer(i-1,j) + Bayer(i,j-1))/2;

            IMG3(i,j,3) = Bayer(i-1,j-1);

        end

    end

end

1.1.3. 效果图

wps_clip_image-5453

如上图所示,缺失了太多边缘信息!哎。。。实际上这样像素缩小了一半,变成了这样:

wps_clip_image-10118

这就是为什么摄像头1/2分辨率输出的时候清晰度高的原因,因为那是Bayer均值后的图像。