航空电子图像处理系统为操作者提供各种图像及字符信息,随着传感器、显示器的性能指标不断提升,图像处理系统的设计面临越来越大的挑战,其中图像缩放的功能是图像处理系统的关键技术要求。图像缩放功能有两种实现方案:1)软件实现,其优点是算法选择灵活多样,生成的画面质量较高,缺点是运算时间长。2)硬件实现,其优点是分辨率高,实时性强,缺点是不易实现功能强大的优秀算法。
近年来,FPGA技术发展迅速,片内集成了PLL、硬件乘法器、存储器,具有了实现优秀算法的充足资源。许多航空电子嵌入式图像处理系统是由固定的视频源和显示设备组成,系统中图像缩放的倍率是固定的。文中针对此展开重点研究,基于FPGA硬件,实现固定倍率的图像缩放。
1 图像缩放的算法
数字图像的缩放是一个处理2维离散信号的过程。输出图像中任一个像素F(x,y),均可以在输入图像f(x,y)的像素矩阵中找到其对应的位置,如图1所示。
图1 输入和输出图像像素的映射关系
F(x,y)的值可以对其邻域的原始图像进行二维卷积运算得到。
其中mxn为邻域范围,f(i,j)是输入原始图像,s(i,j)为系数函数。
因为图像中邻近的像素存在着相关性,所以输出图像像素可以依据其在原始输入图像映射位置邻域的像素数据卷积得到。邻域范围内各个像素的相关度由系数函数决定,邻域的范围决定了算法的运算速度。
基于FPGA硬件实现固定倍率的图像缩放,为了降低FPGA设计的复杂性,提高图像缩放算法的运算速度,增强系统的实时性,将2维卷积运算分解成2次1维卷积运算,对输入原始图像像素先进行行方向的卷积,再进行列方向的卷积,从而得到输出图像像素。
2 图像缩放的FPGA实现
2.1 基于FPGA实现图像缩放的功能结构
基于FPGA实现图像缩放的功能结构图如图2所示。
图2 功能结构图
卷积计算模块的硬件结构由算法决定,每个点时钟周期内,对输入原始图像像素和系数先进行行方向的卷积,再进行列方向的卷积,从而得到输出图像像素。系数产生功能是依据控制模块确定的状态,产生算法要求的系数。输入缓存由控制模块不断刷新,保证每一时钟输入给卷积计算模块相应的像素数据。输出缓存提供下一环节数据流接口。
控制模块是核心逻辑部分,可以采用逆向映射方式(按照输出像素的时间顺序递增,选择对应的输入像素得到结果),也可以采用顺向映射方式(直接在输入像素的时序中产生输出像素)。
逆向映射方式工作在输出图像的时钟域,控制模块根据缩放倍率、分辨率和同步信号,确定输入像素坐标的增量大小,使得在每一时钟周期输入缓存中出现相应的像素数据。因为逆向映射方式需要使输出时钟域与输入时钟域保持同步,所以需要大容量的输入数据存储空间,才能确保在每个时钟周期提供相应的输入像素数据。顺向映射方式输入和输出像素有很强的时序对应关系,按照输入像素的时序进程实时确定输出像素的时序,输出图像分辨率发生变化,但帧频一致。图像缩放过程中,输入一个像素可能会输出2个或3个像素,控制模块可以采用输出缓存、双口RAM、变换时钟域、增加数据总线宽度等方法达到这种同步。顺向映射方式符合输入图像的时序,不需要大容量的数据存储空间,具体根据图像缩放算法的邻域大小而定。
2.2 基于FPGA实现图像缩放的方法
基于FPGA实现图像缩放时,无论是逆向映射方式还是顺向映射方式,控制模块的设计都比较复杂。为了发挥FPGA的优势,大幅度降低设计难度,简化硬件结构,文中把图像缩放过程设计为一个单元体的循环过程,在单元体内部,可以事先计算出卷积系数。例如,把每行720个像素,放大到768个像素,相当于每输入15个像素,输出16个像素。此时可以把15个像素作为一个单元体,事先计算出每个输入像素周期的卷积系数,在FPGA中设计一个包含15种情况的状态机即可。单元体的像素数量越少,事先计算卷积系数和状态机设计的工作量就越少,因此像素的数量控制在20个以内,必要时可以采用近似的整数比。当输出像素的数量与实际要求相差很小时,图像边缘部分增加或减少几个像素对显示效果影响甚微,因此各种图像缩放倍率情况下,相应个数的输入像素都可以作为一个合适的单元体。
为论述方便,文中以将768x576的输入图像放大到1 024x768为例,说明基于FPGA实现对输入原始图像像素先进行行方向的卷积,再进行列方向的卷积,从而得到输出图像像素。
2.2.1 基于FPGA实现行方向的卷积
图像在行方向的放大比例为3:4,即单元体为3个输入像素和4个输出像素,如图3所示。
图3 单元体示意图
输入图像的AB空间中均匀分布X1、X2、X3,3个像素,放大后输出图像的这个空间将输出y0、y1、y2、y3,4个像素。这个单元体的时序关系是:当输入X1像素时,输出Y0像素;当输入X2像素时,输出Y1像素;当输入X3像素时,输出Y2和Y3像素。行方向的卷积公式为:
基于FPGA实现的源程序如下:
基于FPGA实现的仿真时序图如图4所示。
图4 时序图
在本例中时钟为输入的点时钟,为了在X3像素周期时输出2个像素:Y2和Y3,采用了扩充数据总线的方式。
2.2.2 基于FPGA实现列方向的卷积
数据流在行方向放大后写入双口RAM,然后从另一侧端口读出进行列方向的放大。由于行方向的卷积算法,双口RAM中至少应存储连续的3行输入图像像素数据,其中2行输入图像像素数据处于被读出状态,产生放大后的输出图像像素,另一行空间被写入当前的输入图像像素数据,循环刷新。
列方向的单元体和行方向相同,也由3个输入像素和4个输出像素组成,每种状态下也是同样的卷积系数,只是图像横向的空间变换成图像竖向的空间,因此基于FPGA实现列方向的卷积的方法与基于FPGA实现行方向的卷积的方法相同,此处不再赘述。
3 结束语
基于FPGA实现图像缩放,需要根据图像缩放的倍率确定包含适当数量像素的单元体。在单元体内部,根据图像缩放算法确定每个输出像素的计算公式和卷积系数,确定实现点时钟倍频效果的硬件方案。顺向映射方式输入和输出处于帧同步状态,由于输出像素数量多于输入像素,输出像素的点时钟频率要高于输入像素。本文行方向的放大过程,点时钟频率平均增加1/3倍,列方向的放大过程,点时钟频率还要继续增加1/3倍。实现倍频效果可以采用更高频的独立时钟,或者倍频输入点时钟,再或者增加数据总线宽度。为节省数据存储空间,当对图像放大时,先进行列方向的放大,后进行行方向的放大;当对图像缩小时,先进行行方向的缩小,后进行列方向的缩小。
基于FPGA实现图像缩放功能实时性强、分瓣率高。许多航空电子嵌入式图像处理系统是由固定的视频源和显示设备组成,系统中图像缩放的倍率是固定的。本文基于FPGA硬件实现固定倍率的图像缩放,能够大幅度降低设计难度,减少工作量。
基于FPGA硬件实现固定倍率的图像缩放的方法已经应用于某款航空电子产品中,电路板的原有硬件没有变动,对电路板中FPGA重新进行了设计,增加了新的内容,应用效果良好。