摘 要:实现了基于FPGA 的双线性CFA 插值算法。该算法的处理对象是每个像素为8 bit的XGA @15 Hz 的Bayer 模板数据,目的是能得到每个像素是24 bit 的XGA @15 Hz 的彩色图像数据。输入的数据先进入缓存模块,缓存模块是由FPGA 内部的双口的RAM 构成,从缓存中输出的数据被分成奇行组和偶行组,然后奇行组的数据经选择器进入奇行奇列运算块和奇行偶列运算块,偶行组的数据经选择器进入偶行奇列运算块和偶行偶列运算块,最后在插值控制模块的作用下,各运算块处理的数据经输出选择器输出。
像数码相机这样的数字图像设备,考虑到成本和包装, 输出的一般是贝尔(Bayer ) 模板[1 ] CFA(Color Filter Array) 图像,需要通过CFA 插值算法来获得全彩图像。
在实现算法时,通常需要专用的DSP (digital signal processing) ,后然采用C 语言或者其他语言编程进行实现;随着半导体技术的发展, FPGA (field pro-gramming gate array) 作为可编程芯片,其集成度也已达上千万门, FPGA 的可编程特性使其在SOC( system on a chip) 中发挥着越来越重要的作用,这样就产生了用FPGA 直接实现算法,而不需要再用价格昂贵的DSP ,笔者就尝试基于FPGA 实现CFA插值算法。
1 双线性插值算法
双线性插值算法[2 ,3 ] 是非自适应算法的一种,输出的图像使用邻近像素中相同颜色成份做线性平均计算来补偿每个像素丢失的颜色。如图1 中,像素(2 , 3) 仅有蓝色成份。因此丢失的绿色部份可通过求其上、下、左、右像素的绿色成份的平均值得到。同样,丢失的红色可通过对相邻四个对角上的像素的红色成份求平均值。这种算法可以被视频所接受,因为人类的眼睛不容易在动态的两帧视频中查觉到模糊。
2 双线性插值的模块化设计
整个设计采取自顶向下的模块化设计[4 ] 方法,代码采用VHDL 语言进行编写,顶层模块定义为CFA 插值模块,定义输入输出接口信号、复位、时钟信号,并且描述了内部各子模块的逻辑连接关系。顶层的下层是由3 个模块构成,框图如图2 所示,设计内容如下:
1) 缓存控制模块。设计了两个控制器,其中一个是写控制器,另一个是读控制器。写控制器主要由一个12 位的计数器构成,用高两位对4 个存储体进行选择,低10 位用来产生相应的地址,配合输入的写信号对缓存的进行写操作。读控制器主要由一个10 位的计数器构成,产生对4 个存储体进行读操作的地址。
在此模块的设计中,考虑到实时处理的因素,在每一帧图像进来时先写满两个存储体,每个存储体的长度刚好等于每行有效像素的个数,也既是存储了两行有效像素,在写到第3 行的第3 个有效像素时,进行存储体的读操作。
缓存存放数据的顺序是这样的,最初的一帧图像的第1 行有效数据存放在1 号存储体,依次存放下去,第5 行数据再存放到1 号存储体,这样循环下去即可,存完一帧后,写控制器复位,下一帧来时按上述操作进行,如此往复。
缓存控制器对缓存的写操作是同一时刻只对一个存储体进行操作,而读操作是对4 个存储体同时进行。
2) 缓存模块。该模块由4 个相同的1024 ×8 bit的存储体构成,每个存储体由FPGA 内部的2 个BLOCKRAM构成,每个存储体都是双口的SRAM ,把其中一个端口定义为只写,另一个端口定义为只读。每个存储体的每个端口靠缓存控制模块发来的读写使能信号来进行相应操作。对这4 个存储体进行编号,依次为1、2、3、4 号存储体,其中的1、3 号存储体在这里称为奇行,2、4 号存储体在这里称为偶行。
3) 插值模块。此模块由2 个子模块构成,插值控制模块和插值运算模块。
插值控制模块先对存储体输入的数据线进行组合,并对组合后的数据线编号,如图3 所示,图3 中方框内的数字分别代表各个存储体输出的数据线,经过这样组合后,就得到24 位宽的数据线,并且数据线的高低位也是如图示的顺序,以1 组为例,存储体4 的数据线的最高位是组合后的最高位,存储体2 的数据线的最低位是组合后的最低位。在这里,把1 、3 组称为奇行组,2 、4 组称为偶行组。
插值控制模块内部有一个12 位的计数器,最高位控制进入插值模块的数据是1 、2 组还是3 、4 组,奇偶行组的数据分别进入各自的3 级寄存器组,如图4 所示。
评论
查看更多