Bayer2RGB的Matlab实现 (以及FPGA的移植)
0赞由于FPGA强大的并行高速运行能力,来替换相机内部的Bayer恢复,或者捕获Bayer(有些相机只能输出Bayer,比如Mt9v034),采用FPGA能实现实时处理,其他处理器不能匹及!!!这部分我仅仅是模拟CMOS等相机的Bayer处理,通过2行插值来实现,实际上要达到好的效果,至少需要3行插值,而且需要考虑梯度等信息,才能达到比较完美的状态!!!总是,完美是没有极限的吧!!!
由于篇幅的限制,此处仅仅详细介绍双线插值Bayer,3*3插值Bayer恢复实现你们自己研究去吧。。
1. Bayer2RGB的Matlab实现
以上是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图片如下:
通过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
1.1. 转换方案1
1.1.1. 方案论证
如上为一个单元,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. 效果图
如上图所示,缺失了太多边缘信息!哎。。。实际上这样像素缩小了一半,变成了这样:
这就是为什么摄像头1/2分辨率输出的时候清晰度高的原因,因为那是Bayer均值后的图像。