色彩差值算法
考虑到本文设计的系统主要用于视频监控,因此采用最简单的插值算法,即双线性正交法。该算法的原理是在每个像素的领域取8个像素构成3×3阵列,该阵列中心的像素为待插值像素,其中一个色彩通道直接使用该像素的数据,另外两个色彩通道通过计算领域的2个或4个像素的平均值获得。不同位置的像素四周情况不同,根据待插值像素所处位置总结出4种情况(设待插值像素坐标为(X,Y))。
(a)R(X,Y)=[R(X,Y-1)+R(X,Y+1)]/2;
G(X,Y)=G(X,Y);
B(X,Y)=[B(X-1,Y)+B(X+1,Y)]/2;
(b)R(X,Y)=[R(X-1,Y-1)+R(X+1,Y-1)+R(X-1,
Y+1)+R(X+1,Y+1)]/4;
G(X,Y)=[G(X-1,Y)+G(X,Y-1)+G(X+1,Y)+
G(X,Y+1)]/4;
B(X,Y)=B(X,Y);
(c)R(X,Y)=R(X,Y);
G(X,Y)=[G(X-1,Y)+G(X,Y-1)+G(X+1,Y)+
G(X,Y+1)]/4;
B(X,Y)=[B(X-1,Y-1)+B(X+1,Y-1)+
B(X-1,Y+1)+B(X+1,Y+1)]/4;
(d)R(X,Y)=[R(X-1,Y)+R(X+1,Y)]/2;
G(X,Y)=G(X,Y);
B(X,Y)=[B(X,Y-1)+B(X,Y+1)]/2
由于要形成3×3阵列,因此FPGA硬件实现时,为色彩插值模块,采用3个双口RAM分别保存3行数据,其中A、B、C、D、E、F表示寄存器,CCD的数据是在行场同步控制下从左到右、从上到下输出,在行场同步下先把第一行数据写到RAM1,写完第一行再切换到第二行,写完第二行再写第三行,第三行写完第3个数据即可读出RAM和各寄存器的数据做色彩插值,当第三行写完以后,第四行数据再写到RAM1,以此类推,一直循环直到一帧数据处理结束。值得注意的是:3×3阵列各行的数据是循环切换的,当RAM1保存的是3×3阵列的第一行数据时,3×3阵列第一行数据从左到右依次为B、A、RAM1,第二行数据从左到右依次D、C、RAM2,第三行数据从左到右依次为F、E、RAM3;当RAM2保存第一行数据时,第一行是D、C、RAM2,以后各行循环切换,不再赘述。
3×3阵列的数据进入多路选择器,根据当前的位置以及所需的颜色通道选出4个像素进行相加求和运算。4个像素的获得方法是:当是1个像素时,复制3次;得到4个像素,当是2个像素求平均时,每个像素各复制1次;当是4个像素求平均时,不用复制。
本文采用的CCD为SONY的ICX274,其有效分辨率为1600×1200,而用于显示的分辨率为1280×720(720P),因此需要截取1600×1200为1282×722进行插值,增加两行两列是为了做边界处理。
色彩空间转换
本文采用的转换关系如下:
Y=0.257×R+0.504×G+0.098×B+16
Cb=-0.148×R-0.291×G+0.439×B+128
Cr=0.439×R-0.368×G-0.071×B+128
在FPGA实现时,以上转换关系要调用乘加单元。其中为了保持数据的稳定,增加处理速度,增加了三级流水线,由于系数为小数,因此先左移8位,取整数后分别与R、G、B相乘,再右移8位输出,最后与整数相加输出YCbCr格式数据。
突发传输模块
经过上述两步处理以后的视频数据即可用于显示,本文采用突发传输方案。视频数据首先经过FIFO缓冲,然后经过突发传输写到SDRAM,数据从SDRAM读出也是采用突发传输,读出的数据再经过另外的FIFO缓冲以后即可用于显示。突发(BURST)传输一次进行多个数据单元的传输,而不仅仅是把每个数据单元作为一次单独的传输。这样便提高了从端口的数据吞吐量,在主端口一次处理多个数据单元时,可以达到极高的效率。要使用突发传输就必须严格按照突发传输的规范设计AVALON总线接口。限于篇幅,本文不再详述AVALON总线接口。
测试结果
本系统使用了48%的逻辑单元和40%的存储器,还有剩余的资源可以给系统增加更多的功能。该系统运行良好。本文设计的基于FPGA的高清视频处理系统,能在FPGA硬件设备中高速、高质量地对CCD传感器采集的Bayer图像进行色彩插值和色彩空间转换,经过SDI编码后能够实时显示。在本设计的基础上可以增加更多的功能以改变图像质量,例如3A算法(自动曝光,自动白平衡,自动聚焦)。