基于双线性算法的定标器及其FPGA实现
2008-11-05
作者:陈 伟,卢贵主,郑灵翔
摘 要: 在视频显示系统中,定标器" title="定标器">定标器(scaler)起着匹配视频输出设备和视频显示设备之间的显示分辨率的作用,它直接影响了图像缩放之后的显示效果" title="显示效果">显示效果。本文采用双线性插值" title="插值">插值(bilinear interpolation)算法,在FPGA上实现了定标器,最后给出了验证平台和方法,结果表明所设计的定标器有效并且显示效果良好。
关键词: 定标器;FPGA;双线性
视频显示系统中经常需要进行图像的分辨率转化,这个过程通常称为图像缩放(scaling),是由定标器实现的。它不仅影响着图像显示的分辨率,而且影响图像显示的质量。
图像缩放的算法很多,常用的有最近邻法(nearest narbor)、双线性插值" title="双线性插值">双线性插值法、双三次插值法(bicubic interpolation),另外,还有基于边缘的图像算法(edge-based scaling methods)[1]。基于边缘的图像算法能够得到最好的显示效果,但是这种算法复杂度高,不易于实现。在参考文献[2]中还提到了一种小波双线性插值算法,用小波变换把图像分解成一些具有不同空间分辨率、频率特性和方向特性的子带信号。这种插值保存了图像中丰富的高频信息,使图像具有很好的显示效果,但是该算法主要是针对于遥感图像应用。本文对显示效果和实现的资源耗费、速度进行折衷,采用双线性插值法并在FPGA上实现了定标器。采用FPGA进行设计主要是因为它能够提高设计的并行度从而保证实时性的要求。如果采用DSP的解决方案,虽然在设计的灵活度上有所加强,但是往往无法满足实时性的要求。特别是在视频显示系统中,设计应该优先考虑用硬件进行实现。
本文首先对算法进行了描述,之后对硬件实现的各个模块都作了详细说明,包括获取原始图像相邻的四个像素模块,水平、垂直两个增量的生成模块,插值运算模块以及同步信号" title="同步信号">同步信号生成模块。最后对所设计的定标器进行验证,并给出了验证的平台、方法以及结果。
1 双线性算法描述
几何运算[3](geometry operations)的定义是:改变图像像素空间分布的一系列运算。在实施几何运算时,可以想象成将输入的像素一个一个地移动到输出图像中,称为向前映射法;另一种方法按反向移动像素,称之为逆向映射法。如果映射回的像素落在4个输入像素之间,则其灰度由4个像素插值计算得到。双线性算法就属于逆向映射法。
双线形算法的描述为:假设原始图像的4个像素点为P1、P2、P3、P4,水平和垂直两个方向的点距为单位长度1。4点坐标分别为P1(x,y)、P2(x+1,y)、P3(x,y+1)、P4(x+1,y+1),缩放后的目标像素点的坐标为P(x+dy,y+dy),dx、dy分别是目标像素点与原始图像中的邻近点的水平和垂直坐标方向上的两个增量。因此,所得到的目标插值像素点的灰度表达式为:
P(x+dx,y+dy)=(1-dx)(1-dy)P1+dx(1-dy)P2+(1-dx)dyP3+dxdyP4
利用这个公式,对于每一个目标像素点,都可以定量地由原始图像的4个像素点进行计算得到。
2 定标器的FPGA实现
2.1 定标器的实现模块
基于双线性算法定标器的实现可以划分为4个功能模块:(1)获取原始图橡的水平、垂直两个方向相邻的4个像素P1,P2,P3,P4。(2)计算对应各个像素位置的水平、垂直方向上的坐标增量dx,dy。(3)进行插值运算得到新的图像的像素点。(4)同步信号生成模块。实际的定标器还包括了前端处理模块和后端处理模块。前端处理模块主要进行图像的格式转换等,而后端处理模块主要进行图像的增强处理。这些增强处理包括:图像变换、直方图变换、灰度变换、图像平滑和图像锐化[4]等。在4个功能模块中,同步信号的生成模块负责产生显示所需要的同步和消隐信号,同时它会产生一帧图像的索引地址,包括行地址和列地址。当索引地址索引到目标图像的一个像素时,由它去获得对应的输入图像的相关像素的灰度值,同时获得对应的位置偏移量。这样就保证了输入图像到输出图像的映射无误。其他三个模块是插值运算的具体执行单元。获取相邻4个像素模块在索引输出图像的某一个像素时获取插值计算这个像素点所需要的4个相邻的输入图像像素。水平、垂直方向上的坐标增量生成模块在行场有效信号的控制下使能有效,并且每个像素时钟都更新增量的值。插值运算对输入图像中得到的几个像素值和对应的坐标增量进行运算,最后得到在索引地址位置的输出像素的灰度值。从时序上看,插值运算有固定的延迟,因而不会造成时序混乱,同时由于整个插值算法的实现是在同步信号生成模块的控制下进行的,这就保证了算法实现上时序的正确性。因而,上面的模块划分是可行的。基于双线性算法定标器的实现框图如图1。
2.2 获取原始图像相邻的四个像素模块
采用3个双口dpram进行实现,每个dpram的深度取一行原始图像的深度。3个dpram模块分别工作在写有效状态和只读状态下。初始时,3个dpram都处于只读状态,之后dpram1、dpram2、dpram3轮流处于写有效状态,而且当其中一个dpram处于写有效状态时,另外两个dpram处于只读状态。由于采用的是双口dpram,因而当处于只读状态时,一个dpram可以读取一行上相邻的两个像素。控制dpram的功能采用了状态机来完成,其中状态的变化都由ChangeMode_en信号进行控制,这个信号由行同步信号和场同步信号控制生成。dpram控制状态机如图2所示,其有4个状态,分别是WAIT状态、dpram1写有效状态、dpram2写有效状态、dpram3写有效状态。初始时复位,进入WAIT状态,其余时刻在ChangeMode_en为高电平时进行状态转变,为低电平时保持原来的状态。
2.3 水平、垂直两个增量dx、dy的生成模块
它们是由缩放系数conf决定。这里的缩放系数指:对于用单位长度来表示两个像素点距离的模型进行缩放时,以conf为间隔形成的一个新采样格栅,对模型图像进行重采样时,则新的图像相邻的像素点之间的距离便为conf。如果在水平和垂直两个方向上的缩放倍数不同,则可以定义两个不同大小的缩放因子conf_x、conf_y。例如:从分辨率为640×480的图像转化为800×600的图像,需要进行行列方向上1.25倍的放大,则缩放系数分别为conf_x=1/1.25,conf_y=1/1.25。假设原始图像对应的目标图像大小为I×J,则在水平和垂直方向上分别对应有I个dx、J个dy,即i的取值从0~I,j的取值从0~J。计算dx、dy的公式如下:
这里,增量dx和dy的生成要和原始图像的四个像素点相对应,即对应不同的目标像素点,需要更新i和j的值,然后计算对应的增量dx和dy。硬件实现电路图如图3。在行、场有效信号时,分别产生行和列方向的使能信号En_x和En_y。控制增量系数和对应的像素点之间的同步生成。最后累加和与累加和取整相减的实现是对累加和的结果Sum_x和Sum_y进行处理,保留它的小数部分作为最后的增量的值。
2.4 插值运算模块
这个模块的作用是实现以下公式的运算:
P(x+dx,y+dy)=(1-dx)(1-dy)P1+dx(1-dy)P2+(1-dx)dyP3+dxdyP4
对获取的4个相邻的像素P1、P2、P3、P4和坐标增量dx、dy进行双线性的插值运算。计算前可以对计算式进行优化,使它耗费的资源最少。公式经过减少乘法器的等价变换之后,变成了如下形式:
P(x+dx,y+dy)=((P4-P3)-(P2-P1))dxdy+(P2-P1)dx+(P3-P1)dy+P1
它只需要4个乘法器和7个加法器。因而比原计算公式节省了4个乘法器的资源。该模块有固定的延时时间。对于不同的延时路径,只要在适当的地方插入寄存器进行平衡,即引入流水线(pipeline)的技术,加快模块处理的吞吐率,最后再把几个路径的结果进行累加,就可以得到最后的目标像素点的灰度值。电路原理图如图4。
2.5 同步时序信号生成模块
这个模块的作用是,一方面产生显示所需要的同步信号、消隐信号,包括行同步信号H_sync、场同步信号V_sync、混合同步信号C_sync、消隐信号Blank;另一方面产生地址信号用于控制增量生成模块以及获取原始图像的4个相邻的像素模块。
同步时序信号的生成,对于不同的图像显示格式,必须符合特定要求。针对Virtex_iv开发平台,由于使用的时钟频率为25.175MHz,因而图像显示的分辨率取为640×480,场频为59.94Hz。对于场信号,主要参数有:总行数、有效显示行数、场同步信号的宽度、场消隐前肩、场消隐后肩;同样,对于行信号,也有类似的几个参数:总像素点、有效显示的像素点、行同步信号宽度、行消隐前肩、行消隐后肩。参数的具体设置值为:总行数为525行,有效显示行数为480行,场同步信号为2行,场消隐前肩为13行,场消隐后肩为30行;总像素点为800点,有效显示的像素点为640点,行同步信号为96点,行消隐前肩为19点,行消隐后肩为45点。
本文是采用计数器方法设计。首先设计一个总的行数、点数的计数器进程,其中行计数器在0~479的计数值时作为有效显示行的时刻,480~524时为场消隐的时刻,包括场同步、场消隐前肩、场消隐后肩;点数计数器,在0~639的计数值为有效显示的时刻,640~799为行消隐的时刻,包括行同步、行消隐前肩、行消隐后肩。
3 验证及其资源利用
定标器的验证示意图如图5,在FPGA内部BRAM中存储一幅图像,也可以通过总线输入图像数据。图像数据通过一个FIFO缓存模块缓存一行数据之后,数据流输入到定标器中进行分辨率的调整,最后由定标器输出显示所需要的RGB数据和同步信号H_sync、V_sync、C_sync、Blank_n以及像素地址Addr_x、Addr_y。同步信号直接作用于显示的接口芯片。像素地址用于从FIFO缓存模块中读出原始图像的像素。
验证平台采用了Virtex_4 FX12 Evaluation Board以及Audio/Video Board。Audio/Video模块并不是单独使用的模块,而是和具有足够的利用音/视频能力并且能够提供实时处理能力的实体模块一起使用[5]。板上使用的FPGA芯片为vc4vf12-12ff668。板上提供的AD转换芯片为ADV7123,像素时钟为25.175MHz。因而目标图像的显示格式选取为640×480,25.175MHz。通过VGA接口,不同显示分辨率的原始图像经过定标器的缩放之后,在CRT或TFT显示器上进行显示。实验结果表明,目标图像显示清晰,而且在边缘处也比较平滑,没有出现影响视觉观察的块状效应。
本验证的综合结果为:使用的Slices数目为566个,只占Slices总数的10%;使用的Slice Flip Flops数目为321个,只占总数的2%;使用输入LUTs的数目为1024个,占总数的9%。因而,设计的定标器占用的资源较小。定标器对视频显示分辨率的调整以及视频显示的质量有较大影响,被广泛地应用于平板显示器的显示系统中,因而对它进行探讨很有意义。目前,对于定标器的研究很少,本文给出了定标器在FPGA上的一种实现方法。实验结果表明,这种定标器能够有效地实现缩放,而且显示效果清晰。这种实现方法对于定制定标器IP模块也具有参考意义。
参考文献
[1] 刘政林,邹雪城,向祖权,等.定标器的设计与实现[J].电子学报,2006,34(1):185-188.
[2] 刘笑宙,涂国防.小波双线性插值应用于光学遥感图像[J].中国科学院研究生院学报,2003,20(1):39-43.
[3] 陈书海,傅录详.实用数字图像处理[M].北京:科学出版社,2005,6.
[4] 胡小锋,赵辉.Visual C++/MATLAB图像处理与识别实用案例精选(第一版)[M].北京:人民邮电出版社,2004,9.
[5] AVNET.Audio/Video Module User Guide.http://www.em.avnet.com/evk/home/,2006.