一种红外图像线性插值膨胀硬件处理方法与流程

文档序号:12462874阅读:275来源:国知局
一种红外图像线性插值膨胀硬件处理方法与流程

本发明涉及一种红外图像线性插值膨胀硬件处理方法,属于专用算法硬件电路设计领域。



背景技术:

基于图像匹配的信息处理技术在新一代航天型号中已经开始大量应用,图像处理的实时性直接影响着制导精度。以往基于通用处理器(如DSP)采用软件实现图像处理算法越来越难以满足航天型号的实时性要求。目前,经常采用简化算法牺牲算法精度的方式来减小算法运算时间。通过算法硬件化实现算法加速是减小算法运算时间的最有效手段。

目前图像处理采用的是基于灰度信息的匹配方法,这种方法匹配精度高但是运算量比较大。通过对捕获、跟踪等末制导导引头信息处理过程进行分析,将其中耗费时间长、处理结构复杂、占用空间大的图像算法进行硬件化设计,图像膨胀算法是其中需要加速处理的算法之一。



技术实现要素:

本发明的技术解决问题是:克服现有技术的不足,提供了一种红外图像线性插值膨胀硬件处理方法,通过流水线设计,无精度损失快速取址、灰度快速读取等设计,极大提高了算法运算速度,提高了计算精度,合理控制硬件资源代价,并在Xilinx virtex5-XC5VFX100T下实现,工作运行在100M。

本发明的技术解决方案是:一种红外图像线性插值膨胀硬件处理方法,该方法采用硬件实现,加快图像膨胀处理速度,首先将原图进行膨胀放大得到膨胀后的图像,然后对膨胀后图像中每个像素点p'执行如下步骤:

(1)、坐标计算,根据p'在膨胀后图像坐标系中的坐标p'(m,n)反推该点在原图坐标系的坐标p(i0,j0),对p(i0,j0)的坐标值进行取整运算,得到原图中距离p点最近的左上点坐标(im,jn);所述膨胀后图像坐标系的坐标原点为膨胀后的图像左上角,左上角向右为膨胀后图像坐标系横轴X轴正方向,左上角向下为膨胀后图像坐标系纵轴Y正方向,所述原图坐标系的坐标原点为原图的左上角,左上角向右为原图坐标系横轴X轴正方向,左上角向下为原图坐标系纵轴Y轴正方向。

(2)、灰度读取,从原图存储器中获取原图中p(i0,j0)点周围四个点的灰度值:f(im,jn)、f(im+1,jn)、f(im,jn+1)、f(im+1,jn+1),将存储连续的两组灰度数据分别存入两个内部FIFO中,所述f(x,y)为原始图像中坐标(x,y)处的灰度数据;

(3)、膨胀计算,从两个FIFO中读取出p(i0,j0)点周围四个点的灰度值:f(im,jn)、f(im+1,jn)、f(im,jn+1)、f(im+1,jn+1),采用双线性插值算法计算膨胀后的图像中p'(i,j)的图像灰度值;

(4)、灰度存储,将步骤(3)计算出来的图像灰度值保存到膨胀后图像对应的存储器中,更新膨胀后图像中p'(i,j)的图像灰度值。

所述方法在FPGA中实现。

所述步骤(1)~步骤(4)的坐标计算、灰度读取、膨胀计算、灰度存储采用四级流水线并行实现。

所述步骤(1)中当原图的尺寸为width_src×height_src,膨胀后图像的尺寸为width_exp×height_exp时,根据膨胀后图像中坐标p'(m,n)反推该点在原图中的对应的位置p(i0,j0),得到原图中距离p点最近的左上像素点坐标(im,jn)采用迭代递推的方法为:

当m=0,n=0时,令i0=0,j0=0,令中间变量R0=0,T0=0;

当m≥1时,计算中间变量Rm=Rm-1+width_src,m∈{1,…,width_exp-1},如果Rm<width_exp,则im=im-1;如果Rm≥width_exp,则im=im-1+1,Rm=Rm-1-width_exp;

当n≥1时,计算中间变量Tn=Tn-1+height_src,n∈{1,…,height_exp-1},如果Tn<height_exp,则jn=jn-1;如果Tn≥height_exp,则jn=jn-1+1,Tn=Tn-1-height_exp。

原图存储器位宽为像素点灰度值宽度的4倍,每四个像素点灰度值对应一个地址存储空间,其存储地址为:(纵坐标x×原始图像宽度width_src+横坐标y)>>2,两个FIFO的宽度均为像素点灰度值的宽度,深度大于等于16。

灰度读取的具体实现过程为:

在每行的第一个流水线周期内,执行如下步骤:

(2.1a)、计算灰度值f(im,jn)在存储器中的绝对地址,记为上行地址addr;计算f(im+1,jn)在存储器中的绝对地址,记为下行地址addr

addr=im×width_src+jm

addr=(im+1)×width_src+jm

(2.2a)、将上行地址addr和下行地址addr转换成二进制形式,并将二进制形式的上行地址addr和二进制形式的下行地址addr进行低两位截短得到存储器上行读地址addr_read和下行读地址addr_read

(2.3a)、根据上行读指针addr_read提取存储器中连续4个灰度数据存入到FIFO_0中,上行读地址addr_read加1,FIFO_0写地址加4;根据下行读指针addr_read提取存储器中连续4个灰度数据存入到FIFO_1中,下行读地址addr_read加1,FIFO_1写地址加4;

(2.4a)、当addr的低2位为2’b11时,将addr_read往后递推一个地址,得到新的addr_read,重新执行步骤(2.3a),然后,进入下一级流水线膨胀计算步骤;否则,直接进入下一级流水线膨胀计算步骤;

在每行的后续流水线周期,执行如下步骤:

(2.1b)、判断FIFO_0中是否存在至少4个空闲空间,如果存在,则上行读地址addr_read加1,从存储器中读取连续4个灰度数据依次存入到FIFO_0中;FIFO_0写地址加4;否则,等待;

(2.2b)、判断FIFO_1中是否存在至少4个空闲空间,如果存在,则下行读地址addr_read加1,从存储器中读取连续4个灰度数据,依次存入到FIFO_1中;FIFO_1写地址加4;否则,等待;

所述FIFO_0和FIFO_1均为循环缓冲区,当FIFO_0和FIFO_1已满时,循环存储。

膨胀计算的具体实现为:

在每行的第一个流水线周期内,执行如下步骤:

(3.1a)、根据二进制形式上行地址addr和二进制形式下行地址addr的低两位作为FIFO_0和FIFO_1中的初始读地址;

(3.2a)、从FIFO_0中读地址开始取出f(im,jn)、f(im,jn+1);从FIFO_1中读地址开始取出f(im+1,jn)、f(im+1,jn+1);

(3.3a)、将步骤(3.2a)中读取的四个灰度值进行相加后右移2位得到膨胀后的图像中p'(i,j)的图像灰度值:

f′(m,n)=(f(im,jn)+f(im+1,jn)+f(im,jn+1)+f(im+1,jn+1))>>2;

在每行的后续流水线周期内,执行如下步骤:

(3.1b)、根据步骤(2)中坐标变换中计算结果,当Rm<width_exp,即im=im-1,且Tn<height_exp,即jn=jn-1时,FIFO_0和FIFO_1读地址不变;当Tn≥height_exp时,jn=jn-1+1,FIFO_0和FIFO_1读地址加1;

(3.2b)、从FIFO_0中读地址开始取出f(im,jn)、f(im,jn+1);从FIFO_1中读地址开始取出f(im+1,jn)、f(im+1,jn+1);

(3.3b)、将步骤(3.2b)中读取的四个灰度值进行相加后右移2位得到膨胀后的图像中p'(i,j)的图像灰度值:

f′(m,n)=(f(im,jn)+f(im+1,jn)+f(im,jn+1)+f(im+1,jn+1))>>2。

本发明与现有技术相比的有益效果是:

(1)、本发明采用了4级流水线设计,通过高效并行计算提高运算速度。

(2)、本发明采用了无精度损失快速取址方法,该方法可以单周期得到灰度取址地址,并且计算过程只采用了简单的加法和比较操作,无精度损失。

(3)、本发明采用了两个内部FIFO控制器来实现灰度的快速读取。由于每次膨胀计算所需读取灰度地址不连续,采用了两个独立的小FIFO保存存储器读取数据,并通过FIFO读写控制保证单周期提供4个灰度数据参与膨胀计算,维持了流水线的效率。

(4)、本发明通过对图像双线性插值膨胀算法进行分析,算法需要先对原始输入图像进行线性插值膨胀,然后再在膨胀的图像上居中截取需要的尺寸图像。通过流水线,快速取址、灰度快速读取等设计,进行优化硬件化设计,极大的提高算法速度。而且整个设计过程中巧妙地采用比较操作和平移操作替代乘法和除法运算,减小耗用资源和精度损失。

(5)、本算法在Xilinx virtex5-XC5VFX100T下实现,运行在100M,这种条件下对原始图像160*128,膨胀1.2倍,即192*153,再在膨胀图像上截取原模板图1.1倍大小即176*140的图像,完成算法运算只需0.25ms。

附图说明

图1为本发明图像膨胀前后示意图;

图2为双线性插值膨胀算法灰度计算原理图;

图3为本发明红外图像线性插值膨胀硬件加速总体架构;

图4为根据截取大小计算原始图像参与计算坐标范围的方法示意图;

图5为流水线设计示意图;

图6为图像膨胀坐标计算过程示意图;

图7为图像膨胀算法FIFO示意图。

具体实施方式

本发明说明书中未作详细描述的内容属于本领域专业技术人员的公知技术。下面结合附图对本发明的具体实施方式进行进一步的详细描述。

图像双线性插值膨胀算法是最常用的图像膨胀算法,用于将预处理图像分辨率调整至与实时图分辨率相同。

图1为图像膨胀前后示意图,左图为原图,右图为膨胀后图像。p′点为膨胀后图像数据中的一个像素点,在a′×b′膨胀后图像坐标系中位置为p'(m,n),p为对应点在原图中的点,在原图坐标系中的位置为p(i0,j0)。所述膨胀后图像坐标系的坐标原点为膨胀后的图像左上角,左上角向右为膨胀后图像坐标系X轴正方向,左上角向下为膨胀后图像坐标系Y轴正方向,所述原图坐标系的坐标原点为原图的左上角,左上角向右为原图坐标系X轴正方向,左上角向下为原图坐标系Y轴正方向。

双线性插值膨胀算法的基本原理为:

根据p'在膨胀后图像坐标系中的坐标p'(m,n)反推该点在原图坐标系的坐标p(i0,j0)。根据图1中p点与p′点的关系可知,令r为膨胀系数,则在得到p点的坐标后,显然p点的坐标不一定是整数,为了准确地描述p'点的灰度值,对(i0,j0)进行取整运算,得到原图中距离p点最近的左上点坐标(im,jn),(im,jn)、(im,jn+1)、(im+1,jn)、(im+1,jn+1)为(i0,j0)周围的四个像素点坐标。设f(x,y)为原始图像灰度数据,f(im,jn)、f(im+1,jn)、f(im,jn+1)、f(im+1,jn+1)为p0点周围四个点的灰度值,如图2所示。采用双线性插值算法计算膨胀后的图像中p'(m,n)的图像灰度值,则p′点的灰度值可表示为:f′(m,n)=(f(im,jn)+f(im+1,jn)+f(im,jn+1)+f(im+1,jn+1))/4。

图3为本发明提出的红外图像线性插值膨胀硬件加速总体架构。算法输入有原始图像尺寸:width_src×height_src,width_src为原始图像宽,height_src为原始图像高,膨胀后图像尺寸width_exp×height_exp以及截取图像尺寸width_icpt×height_icpt,width_exp为膨胀后图像宽,height_exp为膨胀后图像高,width_icpt为截取后图像宽,height_icpt为截取后图像高。

首先根据这些参数可计算出截取图像即输出图像在膨胀后图像的位置范围,只需计算此范围内的像素点进行坐标转换和计算灰度值即可。

图4为根据截取大小计算原始图像参与计算坐标范围的方法示意图。如图4所示,图像输出在膨胀后图像中从中央截取,截取范围为:

矩阵宽范围:(width_exp-width_icpt)/2,(width_exp+width_icpt)/2

矩阵高范围:(height_exp-height_icpt)/2,(height_exp+height_icpt)/2

得到输出图像范围后,进行坐标转换反向计算输出图像膨胀计算需要原始图像灰度坐标,根据原始图像灰度坐标计算得到灰度值在存储器中的地址,从存储器1中读取数据,然后进行灰度插值膨胀计算,计算完成后写入存储器2。

为提高数据吞吐量和处理效率,根据红外图像膨胀运算IP核实现过程将算法采用硬件实现,加快膨胀处理速度。首先,将原图进行膨胀放大得到膨胀后的图像,然后,逐行依次对膨胀后图像中每个像素点p'进行处理,每个像素点p'实现过程分解为坐标计算、灰度读取、膨胀计算、灰度存储四级流水线。如图5所示。分析各阶段运算时间,合理均匀分布在各级流水线中,每级流水线任务均能单周期完成,实现四级流水线并行工作。

以下介绍具体实现过程:

1、坐标计算

四级流水线中第一级坐标计算是计算预处理图像在存储器中的位置。膨胀系数r为width_exp/width_src,i*(1/r)=i*(width_src/width_exp)取整即为预处理图像中宽度取址坐标,其中i顺序增加。硬件除法器耗费资源大,运算时间长(需要多个周期)。每次取址都进行i*(width_src/width_exp)计算将极大降低了流水线效率;而且每次取址若采用width_src/width_exp累加取整将会带来取址误差,这是由于除法器位宽有限,多次累加造成误差积累,很可能造成取址错误。本算法采用坐标比较法实现无精度损失快速取址计算,只需要简单的加减比较操作就可以了,耗用资源少,速度快,而且完全没有精度损失。

坐标计算计算过程示意图如图6所示,即需要得到截取图像灰度计算需要的原始图像灰度坐标,下一个灰度膨胀将根据坐标转换结果决定在原始图像中取址坐标是否右移/下移。

图像膨胀系数r为width_exp/width_src(或height_exp/height_src,横向和纵向图像膨胀系数可不一致),i·(1/r)取整即为膨胀后坐标。反过来,膨胀后图像灰度计算需要的原始图像灰度坐标即为i*(1/r)取整。

本发明设计了一种无精度损失快速取址方法,取址计算不采用乘除法运算,只用简单的加法和比较运算,保证单周期完成该级流水线。

如前面提高的图像膨胀坐标转换公式:这样,膨胀后图像每行横向坐标i与原始图像坐标i0的映射关系为该式中分母一致为width_exp,膨胀后图像坐标每一次移动表示分子加上width_src,对分子分母进行比较来判断横坐标是否移动。

i=0时,分子初值为0,[i0]=0;

i=1时,分子为width_src+0,由于width_src<width_exp,则[i0]不变仍为0;

i=2时,分子为width_src+width_src,若width_src+width_src<width_exp,则[i0]不变仍为0;若width_src+width_src≥width_exp,则[i0]加1且分子减去width_exp为下一次即i=3比较运算的分子值;

……

i=n时,比较分子与width_src之和与width_exp,若分子与width_src之和小于width_exp则[i0]不变;若分子与width_src之和大于width_exp,则[i0]加1且分子减去width_exp作为下一次即i=n+1比较运算的分子值;

纵坐标同理,膨胀后图像每行纵向坐标j与原始图像坐标j0的映射关系为按照相同的方法通过来比较分子分母判断纵坐标是否移动,可得到膨胀后图像对原始图像纵坐标的映射。

得到膨胀后图像对原始图像横坐标和纵坐标的映射后,即可得到对原始图像地址取址,取址地址=纵坐标×width_src+横坐标。这种方法没有采用除法操作,只有简单的加法和比较操作,因此没有精度损失,可以实现对原始图像坐标的快速取址。

2、灰度读取

为缩减处理时间提高处理效率,只进行最终截取图像的膨胀运算。一次膨胀运算读取需要四个灰度数据。若每次只读取一个灰度数据,每次膨胀运算需要读取4次,即需要四个时钟周期。本算法采用高位宽存储器,图3中存储器1的总线位宽为灰度位宽的4倍,这样一次可以读取4个灰度数据。以灰度位宽8bit为例,存储器总线位宽取为32bit。每四个像素点的灰度值对应一个存储地址。另外,由于膨胀计算需要的四个灰度数据地址不连续,其中两两一组连续,两组数据间隔width_src。本设计采用了两个深度为16,宽度为灰度位宽的内部FIFO(FIFO_0和FIFO_1)。从存储器中读取的灰度存入FIFO,膨胀计算从FIFO读取灰度,完成膨胀计算后的FIFO空间释放。FIFO存在4个或以上空闲空间时会自动从存储器中读取灰度,如图6所示。若灰度位宽为8bit,两个FIFO大小均为16*8bit,即一个FIFO可存储16个灰度数据。读取外部地址时,轮流读上下两行数据,分别写入两个FIFO。这样,在读取存储器每行的数据时地址不需要经过复杂的运算,顺序加1就可以了。

考虑到截取图像的随机性,在读取存储器中的数据时需要考虑读取灰度的有效性。由于图像对齐影响,原始图像每行第一拍灰度需考虑偏移有效位,对第一拍数据有效灰度判断。由于取址地址实际上是对存储地址进行了低两位截短,因此存储地址的低两位就是读取数据的有效位。当低两位为2’b00时读取的4个灰度数据都有效。当低两位为2’b01时读取的后3个灰度数据有效。当低两位为2’b10时读取的后2个灰度数据有效。当低两位为2’b11时读取的最后1个灰度数据都有效。当低两位为2’b00,2’b01,2’b10时,第一次灰度读取需要2个周期,之后流水线正常工作。当低两位为2’b11时,第一次灰度读取需要4个周期。每次FIFO写操作写入4个FIFO灰度存储空间,FIFO读操作读出2个FIFO数据,根据取址偏移判断是否释放FIFO灰度存储空间。通过FIFO读写控制,当FIFO中数据完成计算释放资源存在4个或以上可用灰度存储空间读取存储器数据写入FIFO,反复循环。由于FIFO写比FIFO读更快,可以保证后续流水线每个clk均可从FIFO读取数据进行膨胀计算,保证流水线顺利进行。

具体实现过程为:

在每行的第一个流水线周期内,执行如下步骤:

(2.1a)、计算灰度值f(im,jn)在存储器中的绝对地址,记为上行地址addr;计算f(im+1,jn)在存储器中的绝对地址,记为下行地址addr

addr=im×width_src+jm

addr=(im+1)×width_src+jm

(2.2a)、将上行地址addr和下行地址addr转换成二进制形式,并将二进制形式的上行地址addr和二进制形式的下行地址addr进行低两位截短得到存储器上行读地址addr_read和下行读地址addr_read

(2.3a)、根据上行读指针addr_read提取存储器中一个数据(连续4个灰度数据)存入到FIFO_0中,上行读地址addr_read加1,FIFO_0写地址加4;根据下行读指针addr_read提取存储器中一个数据(连续4个灰度数据)存入到FIFO_1中,下行读地址addr_read加1,FIFO_1写地址加4;

(2.4a)、当addr的低2位为2’b11时,将addr_read往后递推一个地址,得到新的addr_read,重新执行步骤(2.3a),然后,进入下一级流水线膨胀计算步骤;否则,直接进入下一级流水线膨胀计算步骤;

也就是说,当二进制形式的上行地址addr的低2位,2’b00、2’b01或者2’b10时,完成上述步骤(2.3a)即可开始下一级流水线膨胀计算;当addr的低2位为2’b11时,需要从存储器读取数据两次才能开始下一级流水线膨胀计算,需要等待1个周期,将上述步骤(2.3a)进行两次;

在每行的后续流水线周期,执行如下步骤:

(2.1b)、通过FIFO_0读写地址比较判断FIFO_0中是否存在至少4个空闲空间,如果存在,则上行读地址addr_read加1,从存储器中读取一个数据(连续4个灰度数据)依次存入到FIFO_0中;FIFO_0写地址加4;否则,等待;

(2.2b)、通过FIFO_1读写地址比较判断FIFO_1中是否存在至少4个空闲空间,如果存在,则下行读地址addr_read加1,从存储器中读取一个数据(连续4个灰度数据)依次存入到FIFO_1中;FIFO_1写地址加4;否则,等待;

所述FIFO_0和FIFO_1均为循环缓冲区,当FIFO_0和FIFO_1已满时,循环存储。

3、膨胀计算

膨胀计算根据p(i0,j0)点周围四个点的灰度值:f(im,jn)、f(im+1,jn)、f(im,jn+1)、f(im+1,jn+1),采用双线性插值算法计算膨胀后的图像中p'(i,j)的图像灰度值,其具体实现为:

在每行的第一个流水线周期内,执行如下步骤:

(3.1a)提取根据二进制形式上行地址addr和二进制形式下行地址addr的低两位作为FIFO_0和FIFO_1中的初始读地址;

(3.2a)、从FIFO_0中读地址开始取出f(im,jn)、f(im,jn+1);从FIFO_1中读地址开始取出f(im+1,jn)、f(im+1,jn+1);

(3.3a)、将步骤(3.2a)中读取的四个灰度值进行相加后右移2位得到膨胀后的图像中p'(i,j)的图像灰度值:

f′(m,n)=(f(im,jn)+f(im+1,jn)+f(im,jn+1)+f(im+1,jn+1))>>2;

在每行的后续流水线周期内,执行如下步骤:

(3.1b)根据坐标变换中计算结果,当Rm<width_exp,即im=im-1,且Tn<height_exp,即jn=jn-1时,FIFO_0和FIFO_1读地址不变;当Tn≥height_exp时,jn=jn-1+1,FIFO_0和FIFO_1读地址加1;

(3.2b)、从FIFO_0中读地址开始取出f(im,jn)、f(im,jn+1);从FIFO_1中读地址开始取出f(im+1,jn)、f(im+1,jn+1);

(3.3b)、将步骤(3.2b)中读取的四个灰度值进行相加后右移2位得到膨胀后的图像中p'(i,j)的图像灰度值:

f′(m,n)=(f(im,jn)+f(im+1,jn)+f(im,jn+1)+f(im+1,jn+1))>>2;

本算法硬件化过程中,前面提到的除2操作也通过右移1位来实现。

4、灰度存储

将膨胀计算所得到的p'(m,n)的图像灰度值f′(m,n)保存至指定的存储器中,即图3中的存储器2。

当膨胀图像后为截取图像时,一般在膨胀后图像上居中截取,用来调整图像分辨率。截取图像尺寸为width_icpt×height_icpt。截取区域矩阵宽坐标范围:(width_exp-width_icpt)/2,(width_exp+width_icpt)/2;矩阵高坐标范围:(height_exp-height_icpt)/2,(height_exp+height_icpt)/2。只需要计算该截取区域的膨胀图像灰度即可。坐标变换从行第一个数开始计算截取图像中第一行第一个像素点在原图中映射坐标,截取图像每行第一个像素点在原图中映射纵坐标一致,之后按照上述流水线方式计算膨胀图像灰度。

实施例

本发明在Xilinx virtex5-XC5VFX100T下FPGA实现,工作在100M。对原始图像160*128,膨胀1.2倍,即192*153,再在膨胀图像上截取原模板图1.1倍大小即176*140的图像,完成算法运算只需0.25ms。

以上所述,仅为本发明最佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。

本发明说明书中未作详细描述的内容属于本领域专业技术人员的公知技术。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1