插值前置的仿射变换FPGA实现方法
2020-03-19吴艺阳
吴艺阳,樊 凡,2,周 怡,黄 珺,2
1.武汉大学 电子信息学院,武汉430072
2.武汉大学 宇航科学与技术研究院,武汉430072
1 引言
仿射变换是一种实现原始图像旋转、缩放与平移并最终得到目标图像的几何变换,是图像融合、图像配准、图像矫正等应用中不容或缺的步骤之一[1]。例如,在实时视频图像融合系统中,仿射变换可以实现来自不同波段图像之间的配准[2];在全景相机中,全景图像的拼接需要通过仿射变换实现[3];在医学图像应用中,仿射变换可以实现计算机断层扫描(CT)涉及的坐标配准[4]。上述应用普遍要求系统的实时性达到30 Hz 帧频[5]。相比ARM、DSP等处理器件,FPGA的灵活性更高、性能更强,采用FPGA 实现图像的仿射变换能够有效地提高系统的实时性[6-7]。但仿射变换中涉及大量的矩阵运算与插值运算,需要占用较多的逻辑资源,设计难度大[8-9]。因此,研究仿射变换FPGA的高吞吐率实现具有重要意义。
目前,国内外在实时视觉系统中的仿射变换FPGA实现均以反向映射为基本原理。这类方法需要使用存储器缓存一帧原始图像数据,然后根据目标像素的坐标从存储器中读取对应的四邻域像素灰度值,最后采用双线性插值算法确定目标像素灰度值。因为双线性插值模块需要从存储器中同步读取四邻域像素,所以存储器的传输数据带宽是原始图像数据流的4 倍。为了实现存储器的4 倍数据带宽需求,国内外研究人员提出了不同的方法。例如,Jiang 等人以及Gribbon 等人分别采用FPGA 内部存储资源与外部存储器缓存4帧相同的原始图像,从而实现双线性插值需要的4 路图像数据流输入,该方法存在存储资源消耗大的问题[10-11]。为节约存储资源FPGA 存储资源,Ngo 等人以及王文治采用像素时钟的4 倍频时钟从DPRAM 中读取原始图像数据[12-13];王金辉等人采用两个单口SRAM 实现乒乓操作,并使用像素时钟的4 倍频时钟读取原始图像[14]。上述实现方案可归纳为以下两种:(1)使用4 个独立的存储资源对原始图像进行存取[10-11];(2)采用像素时钟的4倍频对存储器内部数据进行读取[12-14]。第一种方式需要为4 个存储器提供更多的引脚资源与设计空间,在增加FPGA 功耗的同时,不利于实时系统的小型化实现。第二种方式需要将存储器的读写频率提高至原始图像时钟频率的4倍,考虑到存储器存在最大读写频率,所以这类提升频率的方法会将系统数据吞吐率降低至第一种方式的1/4。
综上所述,基于反向映射的仿射变换不能同时兼顾存储资源消耗与数据吞吐率。其根本原因在于双线性插值模块需要在一个像素时钟内从存储器中读取原始图像四邻域像素点,导致存储器的传输数据带宽需求为原始图像流的4 倍。为解决该问题,本文提出了一种插值前置的仿射变换FPGA 实现方法,该方法采用四角点映射方式将双线性插值计算提前到存储器缓存原始图像之前,避免了双线性插值模块对存储器的直接读取,从而降低了存储器的传输数据带宽需求。
2 传统的基于反向映射的仿射变换FPGA实现
目前,国内外在实时视觉系统中仿射变换的FPGA实现均以反向映射为基本原理。以反向映射为基础的仿射变换采用顺序扫描的方式遍历目标图像中的像素点,通过反向映射在原始图像中确定与该像素点对应的四邻域像素,并对四邻域像素进行双线性插值计算,最终建立目标图像。反向映射的数学模型为[15]:
其中,( x,y)T是原始图像中的坐标向量,( u,v)T是目标图像中的坐标向量,( k1,k2)是图像的缩放系数,θ 是图像的旋转角度参数,( t1,t2)是图像的横向与纵向平移参数。上述仿射参数{k1,k2,θ,t1,t2} 为预设值。
如图1 所示,基于反向映射的仿射变换FPGA 实现流程可归纳为:(1)地址生成模块根据行场同步信号产生目标图像的地址信号流;(2)该地址信号流经过反向映射得到原始图像中对应的坐标,并依此产生双线性插值需要的4 个像素坐标以及插值权重;(3)存储器接口使用4 路并行的数据链路从外部RAM 中同时读取这4个坐标的像素值;(4)双线性插值模块根据同步输入的插值权重与4 路原始图像数据流输出得到目标图像数据流[16]。
图1 反向映射FPGA实现原理设计框图
从图1 可以看出,基于反向映射的仿射变换FPGA实现方法需要从RAM 中同时读取4 路原始图像数据,该操作只能通过两种方式实现:(1)使用4 个独立的存储器对原始图像进行存取;(2)采用像素时钟的4 倍频对存储器内部数据进行读取。第一种方式需要为4 个存储器提供更多的引脚资源与设计空间,同时增加了FPGA 的功耗,不利于实时系统的小型化实现。第二种方式需要将RAM 的读写频率提高至原始图像时钟的4倍,考虑到RAM 存在最大读写频率,所以该方法会将数据吞吐率降低至第一种方式的1/4。综上所述,基于反向映射的仿射变换FPGA 实现方法不能同时兼顾存储资源与数据吞吐率。
3 基于前置插值的仿射变换
针对基于反向映射的仿射变换FPGA 实现方法存在的缺点,本文提出了一种基于前置插值的仿射变换理论,并详细介绍该仿射变换的FPGA 实现方法,并对实现方法中涉及的简化运算与相关的校验运算进行了分析。
3.1 基本原理
本文的想法是将双线性插值的计算提前到存储器缓存原始图像数据流之前,即在原始图像数据流输入的同时便实现双线性插值计算,从而避免存储器读写图像数据时所需的4 倍数据带宽。为实现插值前置,本文提出一种基于四角点映射的数学模型,该模型采用滑动窗遍历原始图像坐标,并在滑动窗中通过前向映射与反向映射的结合建立原始图像与目标图像的映射关系。滑动窗的大小选取与仿射变换中应用的具体插值算法相关,滑动窗内应包含插值运算中所需的所有原始图像坐标。因为本文提出的仿射变换方法中采用的是双线性插值算法,所以选取2×2 大小的窗口作为滑动窗。基于前置插值的仿射变换具体实现原理描述如下:
(1)如图2 所示,首先根据串行输入的图像数据流生成一个2×2 的滑动窗,即四角点对应的滑动窗,该滑动窗可以实现原始图像坐标与像素值的同步传输,为后续的映射关系计算与双线性插值计算提供时序上的同步。定义该窗口为四角点ABCD,ABCD 坐标即为四角点坐标。
图2 四角点映射原理图
(2)在已获得四角点滑动窗的基础上,需要建立原始图像与目标图像的映射关系,考虑到前向映射可在已知原始图像坐标与仿射参数的基础上实现映射关系的建立,本文采用前向映射将四角点滑动窗ABCD 的坐标映射到目标图像,得到映射窗口A′B′C′D′,并在接下来 的 步 骤 中 从 映 射 窗 口A′B′C′D′中 获 取ABCD 与A′B′C′D′之间像素的插值关系。其中,前向映射的数学模型为:
式(2)与式(1)互为反函数。
(3)通常情况下,映射后四角点A′B′C′D′的坐标包含小数部分,但是在基于FPGA 的数字图像处理中,必须对目标图像的整数坐标进行赋值才有意义。因此必须在A′B′C′D′内找到其内部的整数坐标( )u′,v′,并对其进行赋值。本文计算( )u′,v′的方式为:
其中( u1,v1)、( u2,v2)、( u3,v3)、( u4,v4)为映 射后 四角 点A′B′C′D′的坐标。为简化FPGA 的计算复杂度,( u′,v′)分别由( u1, u2,u3,u4)与( v1, v2,v3,v4)中的最大值并向下取整得到。
(4)在坐标( u′,v′)确定之后,需要对( u′,v′)的灰度值进行赋值。考虑到从映射后四角点A′B′C′D′直接计算( u′,v′)的灰度值计算复杂度较高,从四角点ABCD 确定坐标( u′,v′)灰度值计算复杂度较低,所以本文采用反向映射原理将目标图像中的( u′,v′)映射到原始图像得到坐标( x′,y′),并通过双线性插值算法确定( x′,y′)的灰度值。
(5)双线性插值根据同步输入的插值权重与4 路原始图像数据确定目标像素的灰度值,并将该数据存储到RAM 中。最后,在一帧原始图像数据进行四角点映射处理之后,从RAM 中顺序读出数据,便可得到仿射变换后的图像。
理论上讲,数字图像仿射变换的实现原理为:在仿射参数已知的情况下,通过某种映射计算方式建立原始图像与目标图像之间全部坐标及像素灰度值的映射关系。传统的反向映射采用点对点映射方式遍历目标图像坐标,并确定该坐标在原始图像中对应的四邻域像素,最终对四邻域像素进行插值计算。本文提出的基于前置插值的仿射变换方法根据反向映射的对称性,通过四角点窗口遍历原始图像获取目标图像中所有与当前窗口存在映射关系的像素坐标,然后通过反向映射确定当前像素坐标的像素灰度值,最终实现目标图像的建立。本文提出的基于前置插值的仿射变换方法需要实现四路并行的前向映射计算与一路的反向映射计算,实现难度与计算复杂度高于传统的反向映射方法。考虑到FPGA 具有逻辑资源丰富,支持并行运算的特点,本文提出的基于前置插值的仿射变换方法在FPGA 实现中设计与实现难度较低,之后将介绍该方法的FPGA 实现架构。
3.2 FPGA实现架构
根据3.1 节中介绍的基于前置插值的仿射变换原理,其FPGA 实现方法需要分别实现四角点坐标生成、四角点前向映射、坐标选取、反向映射、滑动窗并行输出以及双线性插值模块6 个处理模块,如图3 所示。下面将分别介绍这6个部分的FPGA实现方法。
(1)四角点坐标生成模块根据输入的行场同步信号生成4路并行的原始图像四角点坐标( xi,yi)T( i= 1,2,3,4)。
(2)四角点前向映射模块对输入的4 路坐标信号进行并行的前向映射计算得到4 路目标图像坐标信号( ui,vi)T( i= 1,2,3,4)。前向模块的FPGA 实现原理图如图4(a)所示,输入的x 坐标与y 坐标通过乘法器与加法器实现与仿射参数的乘加运算,得到目标图像坐标( u,v)。
图3 基于前置插值的FPGA实现方法设计框图
图4 前向映射与反向映射FPGA实现原理图
(3)坐标选取模块根据映射窗坐标( ui,vi)T(i=1,2, 3,4 )选取当前窗口的插值坐标( u′,v′),其RTL级电路如图5。坐标选取模块由数据比较器组与数据选择器组构成。数据比较器与数据选择器的作用是得到映射坐标( ui,vi)T( i= 1,2,3,4 )中的最大值与最小值。当且仅当umax-umin=1 与vmax-vmin=1 两个条件均成立时,坐标选取模块输出( umax,vmax)作为插值坐标( u′,v′)。当条件不成立时,意味着当前窗口不包含插值坐标,坐标选取模块在当前时刻将输出坐标(0,0)。
图5 坐标选取部分RTL级电路
(4)反向映射实现对输入的插值坐标( u′,v′)进行反向映射计算,得到对应的原始图像坐标( x′,y′),并通过( x′,y′)与四角点坐标( xi,yi)T( i= 1,2,3,4 )的位置关系确定插值权重。如图4(b)所示,反向映射的FPGA 实现也是通过乘法器与加法器对输入坐标( u′,v′)与相关仿射参数的运算,得到原始图像坐标( x′,y′)。
(5)滑动窗并行输出模块实现了原始图像数据的串并转换,其时序图如图6 所示。方法采用两个串行的FIFO 缓存图像数据,每个FIFO 内缓存图像的一行数据。寄存器Reg1、Reg2、Reg3 与Reg4 对FIFO 输出的数据进行流水缓存操作,从而实现图像数据的并行输出。其中,Reg1 与Rge3 内缓存的数据为同一列像素,Reg2与Reg4 内缓存的数据为同一列像素。当FIFO1 与FIFO2 均存满一行数据时,寄存器组将会并行输出当前2×2 窗口的像素值。该滑动窗结构实现了像素时钟下双线性插值模块所需的4倍数据带宽输入。
图6 滑动窗原理框图及时序图
(6)双线性插值部分根据输入的4 路原始图像数据流与插值权重,得到仿射变换图像数据流,并将其存入到外部存储器中。当滑动窗遍历原始图像中所有的像素坐标之后,顺序读出外部存储器中的数据流,即可得到最终的仿射变换图像数据。
插值前置的仿射变换FPGA 实现方法实现了双线性插值的前置计算,避免双线性插值模块对存储器的直接读取,降低存储器的传输带宽需求。
3.3 FPGA简化运算与校验分析
如上所述,为降低FPGA 的计算复杂度,本文提出的插值前置的仿射变换FPGA 实现方法在坐标选取部分中进行了简化计算,具体的简化过程为:坐标选取部分需要从映射窗口A′B′C′D′中选取插值坐标( u′,v′),通常情况下,A′B′C′D′的边与图像坐标轴为非平行关系,在A′B′C′D′中直接选取插值坐标( u′,v′)需要计算坐标( u′,v′)与A′B′C′D′形成的向量与映射窗口向量之间的内积,通过内积的取值判断当前坐标是否在映射窗口A′B′C′D′内部。上述操作需要使用大量的乘法器资源,降低FPGA 处理图像数据的实时性。因此,本文采用一种简化计算的坐标选取方法,将选取的矩形窗扩大为映射窗口A′B′C′D′的外接矩形EFGH,并通过对EFGH坐标最大值向下取整遍历的方式快速定位矩形窗内包含的整数坐标点。上述方法虽然降低了FPGA 的计算复杂度,但是矩形窗的外扩会在当前滑动窗中引入其余四角点滑动窗需要计算的插值坐标,如图7 所示,映射窗口A′B′C′D′中的有效插值点为I,但矩形窗的外扩导致无效插值点K 的引入。从而造成K 点双线性插值的重复计算,降低仿射图像的插值精度。
针对上述问题,本文在反向映射部分中添加校验计算模块实现无效坐标点的剔除。其中,无效坐标点的定义为非当前滑动窗内的插值坐标点。根据前向映射与反向映射的对称关系可知,当映射窗口中的插值坐标( u′,v′)为有效插值坐标时,该坐标通过反向映射计算后仍然在四角点ABCD 构成的滑动窗内,反之则会落于滑动窗外。根据上述性质,校验模块对选取到的插值坐标( u′,v′)进行反向映射计算得到坐标( x′,y′),判断( x′,y′)是否在当前四角点的滑动窗内。若当前坐标( x′,y′)在四角点ABCD 构成的滑动窗内,则该坐标为有效坐标,并对该坐标进行后续的插值计算;若当前坐标不在滑动窗内,则判定该坐标为无效坐标,并进行舍弃。
校验计算实现了在当前时刻仅对四角点滑动窗内的坐标进行插值计算,剔除由于插值坐标选取的FPGA简化计算带来的无效坐标点,避免对无效坐标点重复进行插值计算所导致的仿射图像插值精度下降的问题。
4 实验结果与讨论
为验证本文提出的基于前置插值的仿射变换算法的可行性,本文在Matlab中对本文提出的方法进行了仿真,仿真实验结果图如图8、图9 与图10 所示。图8、图9与图10 中的图(a)为原图,图(b)~图(e)为不同仿射参数下的仿射变换图像,其中实验中的k 为缩放参数,θ 为旋转参数,实验中横向与纵向缩放参数取值均为k。从实验结果可以看出本文提出的基于前置插值的仿射变换算法可以实现不同参数下的仿射变换。
图8 Venice基于前置插值的仿射变换Matlab仿真实验图
图9 Office基于前置插值的仿射变换Matlab仿真实验图
图10 Penguins基于前置插值的仿射变换Matlab仿真实验图
为验证本文提出算法的插值精度,采用峰值信噪比(PSNR)衡量仿射图像与原始图像相符合程度。首先对原始图像采用反向映射的方式对图像进行旋转得到两幅相同的旋转图像,然后分别通过反向映射的方式与本文算法对旋转图像进行仿射变换得到仿射图像,并与原始图像进行比较得到PSNR。表1 给出了通过反向映射与无校验的本文算法以及本文算法在不同图像中的PSNR 指标表现,从表1 可以看出本文算法的插值精度与基于反向映射的仿射变换的插值精度基本一致,这是因为本文提出的算法与基于反向映射的仿射变换均采用双线性插值实现插值计算,因此插值精度基本一致。与此同时,当本文算法缺少校验算法时,PSNR指标将会出现下降,这是因为校验模块的缺少会使得本文算法对部分坐标进行重复插值,从而降低了插值精度。
表1 PSNR指标实验对比数据 dB
为验证本文提出的插值前置的仿射变换FPGA 实现方法在数据传输带宽、存储资源与数据吞吐率中的表现,本文采用Altera 公司的Cyclone V 5CEFA7U19C8N芯片,在Quartus II 14.1 的综合编译平台上进行进一步验证。在验证实验中,原始图像数据流的输入时钟为6.75 MHz,帧频为50 Hz。
表1 给出了本文提出的实现方法与其他文献提出的方法在存储器传输带宽需求、外部存储器个数、内部存储器资源占用率、存储器读写频率与极限数据吞吐率的综合比较情况。其中,存储器传输带宽需求为成像系统工作时存储器在单位时间内的数据吞吐率。高存储器传输带宽需要通过消耗更多的存储资源或者降低极限数据吞吐率实现。存储器传输带宽需求越低,系统的资源消耗与极限数据吞吐率综合表现越好。fpixel为原始图像的像素时钟频率,在输入始终频率相同的情况下,存储器的读写频率越高,则存储器越容易到达读写频率上限,系统的极限数据吞吐率越低。由表2 可得,文献[10]虽然在不使用外部存储器的情况下达到了最高的数据吞吐率,但片上存储资源占用率高达80%,系统可扩展性差。文献[11]所需的外部存储器个数则高达4 个。文献[12]与文献[14]的存储器读写频率为像素频率fpixel的4 倍,导致系统极限数据吞吐率仅为其他方法的1/4。本文的存储器传输带宽需求为其他方法的1/4,避免了反向映射方法中为实现4 倍传输数据带宽而存在的存储资源消耗高与降低数据吞吐率的问题。最终在使用1 个外部存储资源并且内部存储资源占用率仅为0.48%的情况下,达到最大的极限数据吞吐率,在存储资源与数据吞吐率方面拥有最好的综合表现。
表2 不同方法的指标对比(fpixel为原始图像的像素时钟频率)
为说明本文提出的基于前置插值的仿射变换在FPGA实现中资源占用率情况,表3给出了Quartus II 14.1的综合编译资源报告。从表3 可以得到以下结论:本文提出的方法的ALM(算术逻辑资源),Registers(寄存器)与LUTs(查找表)的占用率均小于3%。与此同时,方法仅占用0.48%的Block Memory(片上存储资源)与14.1%乘法器资源。总体上说,本文提出的插值前置的仿射变换FPGA 实现方法仍然剩余充足的逻辑资源用于其余图像预处理算法中。
表3 AlteraCycloneV芯片资源占用表
本文将提出的基于前置插值的FPGA 实现方法应用于可见光与红外图像的实时融合系统之中,融合相机的实物图如图11 所示。其中,红外相机得到的红外图像分辨率为400×300。可见光相机的型号为MT9M034,最高可输出分辨率为1 280×960的可见光图像。该相机可通过简单的寄存器配置实现分辨率、帧频等图像参数的调节。因此,在实时相机融合系统中,本文提出的基于前置插值映射的仿射变换方法用于可见光相机的输出端,对可见光图像进行旋转,缩放与平移,从而达到红外图像与可见光图像像素间的对齐。首先,对红外图像进行图像预处理,得到清晰的红外图像信息,并将红外图像数据传输到可见光相机所在的FPGA 芯片。与此同时,对可见光图像进行仿射变换,实现红外图像与可见光图像的像素对齐。其中,仿射参数由Matlab仿真获得,并在系统初始化时便设置成固定参数。最后,对红外图像与可见光图像进行同步处理之后,对同步的红外图像与可见光图像进行融合处理。
图11 融合相机实物图
融合相机的实验结果图如图12 所示。由实验结果可得,本文提出的插值前置的仿射变换FPGA 实现方法可实现红外图像与可见光图像像素间的对齐。
图12 融合相机实验结果
5 结束语
针对基于反向映射的仿射变换在FPGA 实现中遇到的存储资源消耗高与数据吞吐率问题,本文提出了一种基于前置插值的仿射变换数学模型,实现了双线性插值的前置计算,避免双线性插值对存储器的直接读写,降低存储器的传输带宽需求。实验结果表明,本文提出的插值前置的仿射变换方法在实现实时仿射变换的同时,降低了存储器的传输带宽需求,拥有更好的存储器占用率与数据吞吐率综合表现。与此同时,本文提出的仿射变换方法成功实现红外图像与可见光图像的像素间的对齐。