一种基于FPGA的图像旋转方法及装置与流程

文档序号:12126092阅读:1985来源:国知局
一种基于FPGA的图像旋转方法及装置与流程

本发明涉及FPGA数字图像处理领域,更具体地说,涉及一种基于FPGA的图像旋转方法及装置。



背景技术:

数字稳像在无人机拍摄等众多领域有关广泛的需求。而实际中数字稳像一般是把图像的抖动分解成图像的平稳与图像的旋转。图像的平移实现简单,但图像的旋转,由于是实时的稳像,因此实际上是要对视频作实时的旋转处理。而对视频作实时的旋转处理,其旋转处理难度会随着旋转角度的增大而增大,所以目前普遍的嵌入式芯片只能作简单的90度或者80度旋转,而无法作其它角度的旋转,或者专门的图像处理芯片的数字防抖也只能作微小角度的旋转,从而使得其数字防抖的效果不佳。另外,在现有的图像旋转方法中,由于旋转的特性,从而导致了在图像旋转的处理过程中对原始图像数据的读取是随机的,特别是对于大角度的旋转,则会造成缓存资源消耗大的问题,且在旋转后对图像的存储存在大量的冗余操作,进而需要更大的实现代价或者无法实现大角度的图像旋转。



技术实现要素:

本发明要解决的技术问题在于,针对现有技术的上述缺陷,提供一种基于FPGA的图像旋转方法及装置。

本发明解决其技术问题所采用的技术方案是:构造一种基于FPGA的图像旋转方法,所述基于FPGA的图像旋转方法包括以下步骤:

S1:对存储在外部存储器DDR中的原图像进行分块处理,获得M*N块原子图像块,M为大于1的正整数,N为大于1的正整数;

S2:将一块所述原子图像块存储在输入缓存块中,所述输入缓存块包括多个存储器;

S3:根据旋转角度对一块所述原子图像块进行旋转得到一块旋转子图像块,并将一块所述旋转子图像块存储在输出缓存块中,所述输出缓存块包括多个存储器;

S4:将存储在所述输出缓存块中的执行了旋转操作后的一块所述旋转子图像块存储在输出缓存器中;

S5:重复执行步骤S2至步骤S4,直至M*N块所述旋转子图像块全部存储在输出缓存器中,得到最终的旋转图像。

优选地,所述步骤S1包括:

根据所述输入缓存块中的存储器的大小确定原子图像块的大小,对所述原图像进行分块处理。

优选地,所述步骤S2包括:

采用突发模式将存储在外部存储器DDR中的所述原子图像块读入到所述输入缓存块中,且在每次读取所述原子图像块时,比所述原子图像块多读取2行2列。

优选地,所述步骤S3包括:

根据旋转角度以所述原子图像块的中心点为旋转中心进行旋转,并将旋转后的所述旋转子图像块存储在所述输出缓存块中。

优选地,所述步骤S3还包括:

根据所述原子图像块的中心点在所述原图像中的坐标及所述旋转角度,计算得到旋转后的所述旋转子图像块的中心点在输出缓存块中的坐标;

根据所述旋转子图像块在输出缓存块中的坐标及所述旋转子图像块的大小确定存储在所述输出缓存块中的所述旋转子图像块写入到所述输出缓存器中的起始地址。

优选地,所述步骤S4包括:

根据所述起始地址将存储在所述输出缓存块中的所述旋转子图像块写入到所述输出缓存器中,直至一块所述旋转子图像块完全写入所述输出缓存器中。

优选地,所述步骤S4还包括:

采用突发模式根据所述起始地址将所述旋转子图像块写入到所述输出缓存器中。

优选地,在所述步骤S4前还包括:

根据所述旋转子图像块的旋转坐标通过反向旋转得到所述旋转子图像块对应原子图像块在所述输入缓存块中的反向旋转坐标;

若所述反向旋转坐标超出了所述原子图像块的坐标范围,则对与所述旋转子图像块的旋转坐标对应的点增加数据有效标志,所述数据有效标志为0。

优选地,每一所述原子图像块为正方形,且边长为奇数。

本发明还提供一种基于FPGA的图像旋转装置,所述基于FPGA的图像旋转装置包括:

分块处理单元,用于将存储在外部存储器DDR中的原图像进行分块处理,获取M*N块原子图像块,M为大于1的正整数,N为大于1的正整数;

第一存储单元,用于将一块所述原子图像块存储在输入缓存块中,所述输入缓存块包括多个存储器;

旋转单元,用于根据旋转角度对一块所述原子图像块进行旋转得到一块旋转子图像块,并将一块所述旋转子图像块存储在输出缓存块中,所述输出缓存块包括多个存储器;

第二存储单元,用于将存储在所述输出缓存块中的执行了旋转操作后的一块所述旋转子图像块存储在输出缓存器中;

重复执行单元,用于重复执行所述第一存储单元、所述旋转存储单元以及所述第二存储单元的执行步骤,直至M*N块所述旋转子图像块全部存储在输出缓存器中,得到最终的旋转图像。

实施本发明的基于FPGA的图像旋转方法及装置,具有以下有益效果:本方法通过根据原图大小及存储器的资源容量以原图分块为原则,对分块后的子图像块单独进行旋转,同时记录数据的有效性,旋转后的图像输出到缓存器时结合数据有效性进行突发模式的读/写操作,同时确定旋转后的图像块在输出缓存器中的坐标,实现了在FPGA上以最小代价对图像进行任意角度的快速旋转,达到了既能以任意角度快速旋转、节约成本、减少资源消耗,又能实现实时稳像的目的,提升了用户体验。

附图说明

下面将结合附图及实施例对本发明作进一步说明,附图中:

图1是本发明基于FPGA的图像旋转方法一实施例的流程示意图;

图2是本发明图像旋转装置一实施例的结构示意图;

图3是本发明基于FPGA的图像旋转方法另一实施例的图像分块旋转示意图;

图4是本发明基于FPGA的图像旋转方法另一实施例的一块子图像块旋转处理示意图;

图5是本发明基于FPGA的图像旋转方法另一实施例的一块子图像块旋转示意图;

图6是本发明基于FPGA的图像旋转方法另一实施例的旋转子图像块大小示意图;

图7是本发明基于FPGA的图像旋转方法另一实施例的一块子图像旋转示意图;

图8是本发明基于FPGA的图像旋转方法另一实施例的子图像块读取示意图;

图9是本发明基于FPGA的图像旋转方法基于FPGA实现原理框图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图和具体实施例,对本发明进行进一步的详细说明。应当理解,此处描述的具体实施例仅用于解释本发明,并不用于限定本发明。

如图1所示,在本发明的基于FPGA的图像旋转方法流程示意图中,本发明的基于FPGA的图像旋转方法包括以下步骤:

S1:对存储在外部存储器DDR中的原图像进行分块处理,获得M*N块原子图像块,M为大于1的正整数,N为大于1的正整数。

具体地,在步骤S1中,对存储在外部存储器DDR中的原图像进行分块可根据原图像每个像素点进行划分,也可以按块对原图像进行划分,且每一块的大小可根据存储器的大小进行划分。在本发明的实施例中,存储器可以为由FPGA内部的多个BRAM组成,则按照存储器的大小进行划分,即为根据多个BRAM组成的容量对原图像进行分块。例如,以xilinx 7系列FPGA为例,FPGA内部的1块BRAM的容量为36Kb,如果每个像素的位宽为32bit,则1块BRAM可以存储36*1024bit/32bit=1152个像素,原图像为5百万像素的图像有2592*1944=5038848个像素。

如果采用4块BRAM作为一个存储器,则该存储器可以存储的最大子图像块的像素数为1152*4=4608个,则5百万像素原图像最少需要分成5038848/4608=1074块。在实际进行原图像分块时,需根据FPGA内部的BRAM的数量确定一个存储器的大小,进而对原图像进行分块。例如,可以将5百万像素原图像分成水平32块*垂直37块,则每个原子图像块的大小为水平m=81像素*n=53像素,则4块BRAM组成的一个存储器可以存储83*55(比m,n各大2,即存储器比原子图像块多2列、2行)。

如果采用8块BRAM作为一个存储器,则存储器可以存储的最大子图像块的像素数为1152*8=9216个,则5百万像素原图像最少需要分成5038848/9216=547块。在实际进行原图像分块时,需根据FPGA内部的BRAM的数量确定一个存储器的大小,进而对原图像进行分块。例如,可以将5百万像素原图像分成水平28块*垂直24块,每个原子图像块的大小为水平m=95像素*n=81像素,则4块BRAM组成的存储器可以存储97*83(比m,n各大2,即存储器比原子图像块多2列、2行),这样原子图像块的总数比前面所述的4块BRAM作为一个存储器时的原子图像块的总数要少,但BRAM的需求数量从4个提高到了8个。

S2:将一块原子图像块存储在输入缓存块中,所述输入缓存块包括多个存储器。

具体地,在步骤S1中,对于5百万像素的原图像分成水平32块*垂直36块,输入缓存块中包括多个BRAM组成的存储器,每次只存储一块原子图像块m=83像素*n=56像素在多个BRAM组成的存储器中。

S3:根据旋转角度对一块原子图像块进行旋转得到一块旋转子图像块,并将一块旋转子图像块存储在输出缓存块中,所述输出缓存块包括多个存储器。

S4:将存储在输出缓存块中的执行了旋转操作后的一块旋转子图像块存储在输出缓存器中。

S5:重复执行步骤S2至步骤S4,直至M*N块旋转子图像块全部存储在输出缓存器中,得到最终的旋转图像。

具体地,在本发明的实施例中,本发明的基于FPGA的图像旋转方法为基于FPGA的基于FPGA的图像旋转方法,即本发明的基于FPGA的图像旋转方法是在FPGA上实现的,其对图像的分块、旋转及输出均可在FPGA中实现。且在本发明的实施例中,对原子图像块的旋转处理可采取并行的模式,也就是说,当FPGA中有较多BRAM时,可根据实际应用,由BRAM组成多个存储器并行进行旋转处理。

进一步地,步骤S1包括:根据输入缓存块中的存储器的大小确定原子图像块的大小对原图像进行分块处理。具体地,在本发明的实施例中,输入缓存块包括多个存储器,存储器可以为由FPGA内部的多个BRAM组成,其大小由所使用的FPGA所能分配给用于图像旋转存储子图像块的BRAM的数量决定,本发明对存储器的大小不作具体的限定,可根据实际处理进行确定。在本发明的实施例中,BRAM可为36Kb等。可以理解地,例如,以xilinx 7系列FPGA为例,FPGA内部的1块BRAM的容量为36Kb,如果每个像素的位宽为32bit,则1块BRAM可以存储36*1024bit/32bit=1152个像素,原图像为5百万像素的图像有2592*1944=5038848个像素。

如果采用4块BRAM作为一个存储器,则该存储器可以存储的最大子图像块的像素数为1152*4=4608个,则5百万像素原图像最少需要分成5038848/4608=1074块。在实际进行原图像分块时,需根据FPGA内部的BRAM的数量确定一个存储器的大小,进而对原图像进行分块。例如,可以将5百万像素原图像分成水平32块*垂直37块,则每个原子图块的大小为水平m=81像素*n=53像素,则4块BRAM组成的一个存储器可以存储83*55(比m,n各大2,即存储器比原子图像块多2列、2行)。

在一些实施例中,步骤S2包括:采用突发模式将存储在外部存储器DDR中的原子图像块读入到输入缓存块中,且在每次读取原子图像块时,比原子图像块多读取2行2列。例如,前述实施例中,假设M0为分块后的第一块原子图像块,则读取该原子图像块时比该原子图像块的大小多读取2行2列。在本发明的实施例中,采取读取原子图像块的数据时多读取2行2列的数据读取方式实际是对原子图像块进行边缘处理,从而可使其大旋转后得到正常的旋转输出,实现了无缺失旋转的目的。另外,在本发明的实施例中,读取原子图像块时采用的是突发(burst)的模式。突发是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输的周期就是突发长度,即burst length。采集突发模式,在进行突发传输时只要指定起始列地址与突发长度,内存就会依次地自动对后面相应数量的存储单元进行读/写操作,而不再需要控制器连续提供列地址。因此,在本发明的实施例中采用突发模式读取原子图像块实现了顺序的DDR读取地址,即从左到右,从上到下,从而使得读取到输入缓存块中的原子图像块是从第一块原子图像块开始依次按顺序读取的,避免了随机读取的问题,从而大大提高了处理速度,减少所需的存储资源。

在一些实施例中,步骤S3包括:根据旋转角度以原子图像块的中心点为旋转中心进行旋转,并将旋转后的旋转子图像存储在输出缓存块中。在本发明的实施例中,假设旋转角度为a,以原子图像块的中心为中心进行角度为a的矩阵旋转运算,得到旋转a角度后的旋转子图像块,并将旋转a角度后的旋转子图像块存储在输出缓存块中。进一步地,在该步骤S3执行的同时,即在步骤S4开始前,由于本发明的基于FPGA的图像旋转方法是以将原图像分块后对每一块原子图像块进行单独旋转的,所以在最后输出的图像中会带有非图像内容,即相当于无效的数据,而为了避免在输出缓存器中写入无效数据,占用内存,本发明则采用增加无效使能的标志,以使无效数据不被写入缓存器中。可以理解地,具体为,根据旋转子图像块的旋转坐标通过反向旋转得到旋转子图像块对应原子图像块在输入缓存块中的反向旋转坐标,如果反向旋转坐标超出了原子图像块的坐标范围(也就是说,如果反向旋转坐标在原子图像块的坐标内没有对应的坐标),则对该旋转子图像块的旋转坐标对应的点增加数据有效标志,该数据有效标志为0。在具体的实施例中,如果在输入缓存块没有对应坐标的图像数据,则该旋转坐标对应的数据为无效数据,并置该点为0,假设为strobe(数据有效标志),则在写入输出缓存器时strobe为0,即不写入输出缓存器中,也就是说,在输入缓存块中除了存储原图像的像素值外,还需存储对应的像素的数据有效数据有效标志strobe信号。

在一些实施例中,步骤S3还包括:根据原子图像块的中心点在原图像中的坐标及旋转角度,计算得到旋转后的旋转子图像块的中心点在输出缓存块中的坐标;根据旋转子图像块在输出缓存块中的坐标及旋转子图像块的大小确定存储在所述输出缓存块中的旋转子图像块写入到输出缓存器中的起始地址。具体地,将原子图像块的中心点在原图像中的坐标,以原图像的中心旋转a角度,得到旋转后的旋转子图像块中心点在输出缓存块中的坐标,并以此坐标推测出旋转子图像块在输出缓存器中的起始位置,即起始地址。

在一些实施例中,步骤S4包括:根据起始地址将存储在输出缓存块中的旋转子图像块写入到输出缓存器中,直至一个旋转子图像块完全写入输出缓存器中。

在一些实施例中,步骤S4还包括:采用突发的模式根据起始地址将旋转子图像块写入到输出缓存器中。

在一些实施例中,本发明的基于FPGA的图像旋转方法中所划分的每一块原子图像块为正方形,且边长为奇数。

进一步地,本发明的基于FPGA的图像旋转方法为基于FPGA的基于FPGA的图像旋转方法,其中所指的输入缓存块中的存储器和输出缓存块中的存储器为由FPGA内部的多个BRAM组成的存储器,输出缓存器为FPGA的扩展存储器,即外部存储器DDR。

实施本发明的基于FPGA的图像旋转方法,通过采用对原图像进行分块为基准,单独对分块后的原子图像块进行旋转并采用burst的方式读取图像数据,进而解决了一般的基于FPGA的图像旋转方法中从DDR读取/写入数据效率低、速度慢的瓶颈问题。而且在本发明的基于FPGA的图像旋转方法在原子图像块完成旋转后得到旋转子图像块并存储在BRAM中,再通过采用burst写的方式将旋转子图像块写入输出缓存器DDR中,同时在对旋转子图像块进行写入DDR的操作时由于采用了数据有效数据有效标志,使得在将旋转子图像块的数据写入DDR中时没有冗余写入,且采用burst方式可使旋转速度不受旋转角度的影响。每个原子图像块按正常的方式进行旋转处理后,通过原子图像块中心点定位输出旋转子图像块在输出缓存块BRAM中的坐标,并配合图像块边缘处理(即在读取原子图像块的数据里,每一块原子图像块都多取2行2列),以得到正常的旋转输出。另外,采用本方法输出的图像写入DDR与最终输出的图像尺寸无关,因为本方法是对整图像进行旋转,最终输出只需要在DDR的输出缓存中开窗取数据即可。而且,本方法在将读取原子图像块及写入旋转子图像块的过程中都采用了burst的模式,且根据旋转后的旋转子图像块的大小及坐标确定了输出缓存块中旋转子图像块写入到DDR中的起始地址,从而确保了将图像分块单独旋转后写入到DDR中的旋转后的旋转子图像块按与原子图像块在原图像中的相应位置的分布,即本方法读取原子图像块和输出(写入)旋转子图像块都是顺序执行的,从而保证了旋转子图像块存储在DDR中时按顺序排布,而不是随机排布,进而得到最终的旋转图像。

另一方面,在追求图像处理速度的嵌入式应用场合,如果没有专门的图像处理芯片可实现客户需求时,往往采用FPGA专门定制逻辑电路来实现客户的特殊需要。经过FPGA的前期实现及验证,后期在有大批量需求时也可以此为基础设计专用芯片,批量流片。因此本方法适用于FPGA实现也具有很好的现实应用价值。

如图2所示,为本发明基于FPGA的图像旋转装置一实施例的结构示意图,该基于FPGA的图像旋转装置包括:

分块处理单元100,用于将存储在外部存储器DDR中的原图像进行分块处理,获取M*N块原子图像块,M为大于1的正整数,N为大于1的正整数。

具体地,在分块处理单元100中,分块处理单元100对采集到的原图像进行分块可根据原图像每个像素点进行划分,也可以按块对原图像进行划分,且每一块的大小可根据存储器的大小进行划分。在本发明的实施例中,存储器可以为由FPGA内部的多个BRAM组成的存储器,则按照存储器的大小进行划分,即为根据多个BRAM组成的容量对原图像进行分块。例如,以xilinx 7系列FPGA为例,FPGA内部的1块BRAM的容量为36Kb,如果每个像素的位宽为32bit,则1块BRAM可以存储36*1024bit/32bit=1152个像素,原图像为5百万像素的图像有2592*1944=5038848个像素。

如果采用4块BRAM作为一个存储器,则该存储器可以存储的最大子图像块的像素数为1152*4=4608个,则5百万像素原图像最少需要分成5038848/4608=1074块。在实际进行原图像分块时,需根据FPGA内部的BRAM的数量确定一个存储器的大小,进而对原图像进行分块。例如,可以将5百万像素原图像分成水平32块*垂直37块,则每个子图块的大小为水平m=81像素*n=53像素,则4块BRAM组成的一个存储器可以存储83*55(比m,n各大2,即存储器比原子图像块多2列、2行)。

如果采用8块BRAM作为一个存储器,则存储器可以存储的最大子图像块的像素数为1152*8=9216个,则5百万像素原图像最少需要分成5038848/9216=547块。在实际进行原图像分块时,需根据FPGA内部的BRAM的数量确定一个存储器的大小,进而对原图像进行分块。例如,可以将5百万像素原图像分成水平28块*垂直24块,每个子图块的大小为水平m=95像素*n=81像素,则4块BRAM组成的存储器可以存储97*83(比m,n各大2,即存储器比原子图像块多2列、2行),这样原子图像块的总数比前面所述的4块BRAM作为一个存储器时的原子图像块的总数要少,但BRAM的需求数量从4个提高到了8个。

第一存储单元200,用于将一块所述原子图像块存储在输入缓存块中,所述输入缓存块包括多个存储器。

具体地,在分块处理单元100中,对于5百万像素的原图像分成水平32块*垂直37块,输入缓存块中包括多个BRAM组成的存储器,则每次只存储一块原子图像块m=83像素*n=55像素在多个BRAM组成的存储器中。

旋转单元300,用于根据旋转角度对一块所述原子图像块进行旋转得到一块旋转子图像块,并将一块所述旋转子图像块存储在输出缓存块中,所述输出缓存块包括多个存储器。

第二存储单元400,用于将存储在所述输出缓存块中的执行了旋转操作后的一块所述旋转子图像块存储在输出缓存器中。

重复执行单元500,用于重复执行所述第一存储单元、所述旋转存储单元以及所述第二存储单元的执行步骤,直至M*N块所述旋转子图像块全部存储在输出缓存器中,得到最终的旋转图像。

具体地,在本发明的实施例中,本发明的图像旋转装置是基于FPGA的图像旋转装置,其对图像的分块、旋转及输出均可在FPGA上实现。且在本发明的实施例中,对原子图像块的旋转处理可采取并行的模式,也就是说,当FPGA中有较多BRAM时,可根据实际应用,由BRAM组成多个存储器并行进行旋转处理。

进一步地,分块处理单元100根据输入缓存块中的存储器的大小确定原子图像块的大小对原图像进行分块处理。具体地,在本发明的实施例中,输入缓存块包括多个存储器,存储器可以为由FPGA内部的多个BRAM组成,其大小由所使用的FPGA所能分配给用于图像旋转存储子图像块的BRAM的数量决定,本发明对对存储器的大小此不作具体的限定,可根据实际处理进行确定。在本发明的实施例中,BRAM可为36Kb等。可以理解地,例如,以xilinx 7系列FPGA为例,FPGA内部的1块BRAM的容量为36Kb,如果每个像素的位宽为32bit,则1块BRAM可以存储36*1024bit/32bit=1152个像素,原图像为5百万像素的图像有2592*1944=5038848个像素。

如果采用4块BRAM作为一个存储器,则该存储器可以存储的最大子图像块的像素数为1152*4=4608个,则5百万像素原图像最少需要分成5038848/4608=1074块。在实际进行原图像分块时,需根据FPGA内部的BRAM的数量确定一个存储器的大小,进而对原图像进行分块。例如,可以将5百万像素原图像分成水平32块*垂直37块,则每个子图块的大小为水平m=81像素*n=53像素,则4块BRAM组成的一个存储器可以存储83*55(比m,n各大2,即存储器比原子图像块多2列、2行)。

在一些实施例中,在第一存储单元200中,采用突发模式将存储在外部存储器DDR中的原子图像块读入到输入缓存块中,且在每次读取原子图像块时,比原子图像块多读取2行2列。例如,前述实施例中,假设M0为分块后的第一块原子图像块,则读取该原子图像块时比该原子图像块的大小多读取2行2列。在本发明的实施例中,采取读取原子图像块的数据时多读取2行2列的数据读取方式实际是对原子图像块进行边缘处理,从而可使其大旋转后得到正常的旋转输出,实现了无缺失旋转的目的。另外,在本发明的实施例中,读取原子图像块时采用的是突发(burst)的模式。突发是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输的周期就是突发长度,即burst length。采集突发模式,在进行突发传输时只要指定起始列地址与突发长度,内存就会依次地自动对后面相应数量的存储单元进行读/写操作,而不再需要控制器连续提供列地址。因此,在本发明的实施例中采用突发模式读取原子图像块实现了顺序的DDR读取地址,即从左到右,从上到下,从而使得读取到输入缓存块中的原子图像块是从第一块原子图像块开始依次按顺序读取的,避免了随机读取的问题,从而大大提高了处理速度,减少占用资源小。

在一些实施例中,旋转单元300根据旋转角度以原子图像块的中心点为旋转中心进行旋转,并将旋转后的旋转子图像存储在输出缓存块中。在本发明的实施例中,假设旋转角度为a,以原子图像块的中心为中心进行角度为a的矩阵旋转运算,得到旋转a角度后的旋转子图像块,并将旋转a角度后的旋转子图像块存储在输出缓存块中。进一步地,在旋转单元300执行的同时,即在第二存储单元400开始执行前,由于本发明的基于FPGA的图像旋转装置采用的是以将原图像分块后对每一块原子图像块进行单独旋转的,所以在最后输出的图像中会带有非图像内容,即相当于无效的数据,而为了避免在输出缓存器中写入无效数据,占用内存,本发明则采用增加无效使能的标志,以使无效数据不被写入缓存器中。可以理解地,具体为,根据旋转子图像块的旋转坐标通过反向旋转得到旋转子图像块对应原子图像块在输入缓存块中的反向旋转坐标,如果反向旋转坐标超出了原子图像块的坐标范围(也就是说,如果反向旋转坐标在原子图像块的坐标内没有对应的坐标),则对该旋转子图像块的旋转坐标对应的点增加数据有效标志,该数据有效标志为0。在具体的实施例中,如果在输入缓存块没有对应坐标的图像数据,则该旋转坐标对应的数据为无效数据,并置该点为0,假设为strobe(数据有效标志),则在写入输出缓存器时strobe为0,即不写入输出缓存器中,也就是说,在输入缓存块中除了存储原图像像素值外,还需存储对应的像素的数据有效数据有效标志strobe信号。

在一些实施例中,旋转单元300中还包括根据原子图像块的中心点在原图像中的坐标及旋转角度,计算得到旋转后的旋转子图像块的中心点在旋转后的图像中的坐标;根据旋转子图像块在旋转后的图像中的坐标及旋转子图像块的大小确定存储在所述输出缓存块中的旋转子图像块写入到输出缓存器中的起始地址。具体地,将原子图像块的中心点在原图像中的坐标,以原图像的中心旋转a角度,得到旋转后的旋转子图像块中心点在输出缓存器中的坐标,并以此坐标推测出旋转子图像块在输出缓存器中的起始位置,即起始地址。

在一些实施例中,第二存储单元400包括:第二存储单元400根据起始地址将存储在输出缓存块中的旋转子图像块写入到输出缓存器中,直至一个旋转子图像块完全写入输出缓存器中。

在一些实施例中,第二存储单元400包括:第二存储单元400采用突发的模式根据起始地址将旋转子图像块写入到输出缓存器中。

在一些实施例中,本发明的基于FPGA的图像旋转装置中,分块处理单元100所划分的每一块原子图像块为正方形,且连长为奇数。

进一步地,本发明的基于FPGA的图像旋转装置为基于FPGA的图像旋转装置,其中所指的输入缓存块中的存储器和输出缓存块中的存储器为由FPGA内部的多个BRAM组成的存储器,输出缓存器为FPGA的扩展存储器,即外部存储器DDR。

由前述的背景技术分析可知,制约快速旋转实现的最大的瓶颈在于处理过程中对原图像数据的随机读取上:由于旋转的特点,造成需要的数据分布相对来说是随机的(即不是顺序的DDR地址,从左到右,从上到下),这种情况下,按前面分析,要么就是采用足够大随机缓存,要么就不采用burst读,在随机缓存不够的情况下,就会造成速度瓶颈。因此,本发明的重点就是要避开随机读取的问题,要使读与写都采用burst顺序操作,这样才能提高速度,同时也要满足不能使用太多的随机缓存。

现在对本发明的基于FPGA的图像旋转方法进行举例说明,如图3所示,先将原图I2进行分块获得原子图像块,由图3示意,根据FPGA内部BRAM的容量,对原图I2进行分块,在本实施例中,在BRAM足够的条件下,原子图像块越大越好,同时将分块后的原子图像块依次按照burst方式将原子图像块读取到第一储存器(FPGA内部的BRAM)中。另外,原子图像块为正方形且原子图像块的边长为奇数,旋转子图像块的边长是原子图像块的边长的倍,即旋转角度最大的情况(45度)的奇数倍时可以存放下旋转输出的图像块,如图4所示。

具体地,

(1)将原图像进行分块,获得原子图像块,并以单个原子图像块为单元(实际多2行2列)以DDR burst方式读入到输入缓存块的存储器中;

(2)以存储在输入缓存块中的原子图像块的中心为中心进行角度为a的矩阵旋转运算,得到的旋转a角度后的旋转子图像块存入输出缓存块中,无效数据置数据有效数据有效标志为0。在该步骤中,写入输出缓存块中的数据时,如果在输入缓存块中没有对应的原子图像数据,即无效数据,则置该点的strobe为0,写入DDR时其strobe就是0,即不写入;也就是在输入缓存块中除了要存储图像像素值,还需要存储对应的像素的数据有效数据有效标志strobe信号。

(3)将原子图像块的中心点在原图像中的坐标,以原图像的中心作a角度旋转,得到旋转后的旋转子图像块的中心点在输出缓存块中的坐标,并以此坐标推算出在输出缓存块中的旋转子图像块的图像在输出缓存器中的起始位置,即起始地址,然后将输出缓存块中的数据以burst方式结合数据有效数据有效标志写入到对应位置的输出缓存器DDR中,从而完成了原图像中一个块的旋转,重复以上步骤,直到原图像中所划分的每一子图像块都处理完,即完成了一幅图像的旋转。在该步骤中,写入DDR时,要配合输出缓存块中像素点的strobe信息,只写入有效数据,无效数据不写入DDR,如图5所示。

如图6所示,确定旋转后旋转子图像块的大小;

原子图像块的长宽分别为width、height,逆时针旋转角度a后,旋转后图像的完整大小为W*H,则

W=width*cos(a)+height*sin(a)

H=height*cos(a)+width*sin(a) (1)

在本发明的实施例中,对图像块的旋转可按一般的图像旋转进行旋转,本发明对此不作限定。

以图像中心为原点,逆时钟旋转角度a,旋转前坐标为(x,y,1)T,旋转后坐标为(x1,y1,1)T,旋转矩阵为M,及逆矩阵为M-1,有

(x1,y1,1)T=M*(x,y,1)T (2)

则有

反向旋转,逆矩阵

(x1,y1,1)T=M-1*(x,y,1)T (4)

如图7所示。原图有a的旋转角,则稳像需要反向旋转角度a,因此,图像块处理时只要按公式(4)、(5)操作就可以。

由于对原子图像块的旋转是以原子图像块的中心为中心进行的,所以可以通过旋转后的旋转子图像块中心来推测旋转子图像块缓存在DDR中新图像的存储坐标。如图7右边所示,输出缓存块中旋转子图像块的存储起始坐标(xs,ys)即图中最左上角的坐标,其与旋转后的旋转子图像块的中心(xc,yc)之间的关系由图可知

而w与h可由旋转前的原子图像块的width及height根据式(1)求出。由此可确定旋转子图像块存储到DDR中的起始坐标。

由于如果按变换前后图像块尺寸一样来从原子图像块计算旋转子图像块,根据旋转角度在旋转时旋转子图像块边界在新图中是倾斜的,而计算时由于是非整数计算,所以会造成旋转后的子图像块中图块之间的边界出现锯齿状。原因就是图块旋转时边界数据不够,为此,可以将原子图像块(即实际处理的图像块)取的数据多于原图像实际划分的子图像块,这样,每次相邻两处理图像块就会有部分重叠,实验表明,只要原图处理块比原图块大2行2列即可。

如图8所示,原图像分成了3行4列的原子图像块(即一个原子图像块的大小为mxn),取数据时在原子图像块中取窗口((m+2)x(n+2)),如图8所示,w0为在原图中第一个原子图像块的取数据示意,w1为处理块在第二个原子图像块的取数据示意,可以看到每2个相邻块之间都会有部分数据(2行或2列)重合,这样便可保证在最终输出缓存器DDR中得到正常的旋转图像。

如图9所示,为本发明基于FPGA的图像旋转方法的基于FPGA实现原理框图,本发明的基于FPGA的图像旋转方法是基于FPGA实现的,其采用以最少的资源实现任意角度图像(包括视频)旋转的效果的同时,可以根据FPGA的资源情况,通过简单模块利用,达到更高效快速并行处理,提高速度,节省资源、降低成本。从整体来看,本发明的基于FPGA的图像旋转方法电路的具体实施结构包括2个大的模块,分别为主控单元和图块处理单元。

具体地,主控单元以原始图像划分的原子图像块为计数,将需要处理的原子图像块的起始坐标、原子图像块的大小、原子图像块的中心点在原图像中的坐标、旋转角度等参数发送给图块处理单元,由图块处理单元完成对原子图像块的读取、旋转及输出存储到外部存储器DDR(即输出缓存器)中,从而完成一块原子图像块的旋转,并返回完成信号给主控单元,主控单元的原子图像块计数将加一计数,直到所有原子图像块都完成了旋转,即完成一幅图像的旋转。在FPGA中的电路实现时,可以根据FPGA逻辑资源的情况,一个主控单元可同时控制多个图块处理单元,从而达到并行处理的效果,提升整体图像旋转的处理速度。

图块处理单元在主控单元的控制下,通过对原子图像块的数据读取、旋转、输出到外部存储器DDR的操作,完成此原子图像块的旋转,并返回完成状态信号给主控单元。图块处理单元可以有多个,所有的图块处理单元相同,每个图块处理单元内部主要包括7个子模块:分别为子控制模块、原子图像块读取模块、输入缓存块、坐标处理模块、数据搬移模块、输出缓存块、输出模块。

子控制模块:子控制模块主要用于接收主控单元发送的参数,如原子图像块在DDR中的起始坐标、原子图像块的大小、原子图像块的中心点在原图像中的坐标、旋转角度等参数,并在主控制单元发出控制信号后,将需要处理的原子图像块的起始坐标、原子图像块的大小等参数,发送给原子图像块读取模块,由原子图像块读取模块完成从外部存储器DDR中以burst模式读出原子图像块并存储在输入缓存块中,在收到原子图像块读取模块返回的完成信号后,子控制模块将原子图像块大小、旋转角度、原子图像块中心点在原图像中的坐标等参数发送给坐标处理模块,并启动坐标处理模块,坐标处理模块将输入缓存块中的原子图像块旋转、存储在输出缓存块并最终通过输出模块存储到外部存储器DDR后,坐标处理模块返回原子图像块处理完成信号给子控制模块,子控制模块最终将完成信号返回给主控单元,代表主控单元要求处理的原子图像块已经处理完成,即完成对一块原子图像块的旋转。

原子图像块读取模块:原子图像块用于读取原子图像块并返回完成信号,即读取模块接收子控制模块发送过来的需要处理的原子图像块的起始坐标、原子图像块大小等参数,以burst模式读取外部存储器DDR的命令,将需要处理的原子图像块从外部存储器DDR中读出,并存储在输入缓存块中,并返回完成信号给子控制模块。

输入缓存块:输入缓存块主要用于缓存原子图像块,其由FPGA内部BRAM组成的缓存块,用来缓存待处理的原图像的子图像块,即原子图像块。其特点是容量小、随机存取、速度快。

坐标处理模块:坐标处理模块主要用于处理原子图像块的坐标。具体地,坐标处理模块接收子控制模块发送的原子图像块大小、原子图像块中心点在原图像中的坐标、旋转角度等参数,在接收到子控制模块发出的启动命令后,将输出缓存块的坐标,通过反向旋转,得到其对应原图像的点在输入缓存块中的坐标,然后将此输入及输出的坐标发送给数据搬移模块,由数据搬移模块完成将输入缓存块的图像数据搬移到输出缓存块中,依次完成整个输入缓存块中的原子图像块的旋转。同时,坐标处理模块,反向旋转得到的坐标,如果超出了输入缓存块的坐标范围,则在输出缓存块中置该点的位为0,代表此点的数据无效,不需要写入到外部存储器DDR的起始坐标,并输出给输出模块,由输出模块完成将输出缓存块的数据写入到外部存储器DDR中。

数据搬移模块:数据搬移模块主要用于搬移数据,即根据坐标处理模块发送过来的坐标,从输入缓存块中读取数据,并存储到输出缓存块中,从而完成数据的搬移。

输出缓存块:输出缓存块主要用于缓存旋转后的旋转子图像块,其与输入缓存块一样,也是由FPGA内部BRAM组成的缓存块,用来缓存旋转后的子图像块,即旋转子图像块。其特点是容量小、随机存取、速度快。

输出模块:输出模块主要用于将输出缓存块的数据写入到外部存储器DDR中。具体地,输出模块接收坐标处理模块发出的输出缓存块写入到外部存储器DDR的起始地址,并启动,以burst的模式,将输出缓存块的数据全部写入到对应地址的外部存储器DDR中。从输出缓存块中取数据时,跳过标志位为0的无效数据,从而达到只写入有效数据的目的、减少无效操作,直至将所有的旋转子图像块写入外部存储器DDR中,最终得到旋转后的图像。

以上实施例只为说明本发明的技术构思及特点,其目的在于让熟悉此项技术的人士能够了解本发明的内容并据此实施,并不能限制本发明的保护范围。凡跟本发明权利要求范围所做的均等变化与修饰,均应属于本发明权利要求的涵盖范围。

应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,而所有这些改进和变换都应属于本发明所附权利要求的保护范围。

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