一种基于FPGA实现图像转置的方法
技术领域
本发明涉及一种图像转置的方法,尤其是涉及一种基于FPGA硬件实现图像转置的方法。
背景技术
目前,视频图像从横屏到竖屏旋转处理在许多领域有着广泛应用,并且在视频图像处理领域中,已经有了很多实现图像转置的方法,但是大多方法是采用软件来实现的,在某些实时性要求较高的场合下,这些基于软件的视频图像转置处理的速度难以满足实时性的要求。
例如,请参见图1,现有技术中对视频图像旋转采用数字信号处理器DSP架构,由DSP和片外静态存储器SRAM一同完成视频图像旋转工作,基于DSP实现视频图像旋转架构。视频源输入数据交替缓存在两个静态存储器SRAM1和SRAM2中,当某一帧图像缓存好后,DSP从相应的存储器中读取数据并进行相应处理,同时视频源输入数据缓存到另一块静态存储器中,如此循环操作(乒乓操作)。在DSP中采用最邻近差值算法作为图像旋转算法,并且对算法进行优化,使其运算时间减少。这种方法的问题在于:图像旋转的运算量很大,占用时间较长,如果在DSP中运行多任务系统时,其实时性欠佳,而且同等容量的静态存储器(SRAM)比动态存储器(DRAM)成本高很多。
还有一种方法,请参见图2,对视频图像旋转采用可编程逻辑器件FPGA架构,由FPGA和片外动态随机存储器一同完成视频图像旋转工作,基于FPGA实现视频图像旋转架构。在FPGA内部采用一种可编程片上系统SOPC,在SOPC系统中包含一个嵌入式处理器内核,负责图像旋转的算法实现,SOPC系统中的存储器控制器用于控制片外动态存储器,以实现数据的缓存。视频源输入数据由SOPC系统的存储器控制器控制缓存到片外存储器中,嵌入式处理器实现视频图像旋转的CORDIC算法,并控制数据流输出到后续处理模块或显示模块。这种方法采用SOPC系统可以简化系统复杂度,但是其缺点在于:视频图像旋转的CORDIC算法运算大,采用嵌入式处理器来处理此算法,软件耗时周期长,实时性不强。
为了解决现有技术中普遍存在的“实时性”差的技术问题,实有必要发明一种基于FPGA硬件实现图像转置的方法,并且能够满足实时性要求较高场合下的需求。
发明内容
本发明的基于FPGA实现图像转置的方法是一种基于FPGA硬件实现图像转置的方法,解决了现有技术中普遍存在的“实时性”差的技术问题,特别能够满足多任务处理条件下,实时性要求仍然较高的需求。
为了实现上述目的,本发明的基于FPGA实现图像转置的方法是这样的:
一种基于FPGA实现图像转置的方法;其包括如下步骤:
步骤A:将输入的视频源数据预处理为YCBCR4:2:2格式;
步骤B:将YCBCR4:2:2图像数据逐行顺序存储到第一缓存区;
步骤C:将第一缓存区的图像数据转存到第二缓存区;
步骤D:将第二缓存区的图像数据进行YCBCR4:2:2格式到YCBCR4:4:4格式的处理;
步骤E:将YCBCR4:4:4格式的图像数据转换成RGB格式输出至显示器显示。
作为优选实施方式,所述步骤C的转存方法为,
步骤C1:将第一缓存区的图像数据,从第1列最后1行的像素开始以N列为一组逐行读取,写入到第二缓存区第1至N行并且逐列写入;步骤C2:重复步骤C1,将第一缓存区中第N+1列至最后1列的图像数据,分别对应写入到第二缓存区第N+1行至最后1行。
作为优选实施方式,所述第二缓存区分为两个缓存空间,用以乒乓操作。
作为优选实施方式,所述步骤D中YCBCR4:2:2格式到YCBCR4:4:4格式的处理,是为奇数行增加CR数据,所述奇数行的CR数据为上下一行的CR数据的均值。
作为优选实施方式,所述步骤D中YCBCR4:2:2格式到YCBCR4:4:4格式的处理,是为偶数行增加CB数据,所述偶数行的CB数据为上下一行的CB数据的均值。
作为优选实施方式,如果图像的总行数是偶数,所述第一行的CR数据由第二行的CR数据值替换;如果图像的总行数是奇数,所述第一行的CR数据由第二行的CR数据值替换,所述最后一行的CR数据由倒数二行的CR数据值替换。
作为优选实施方式,如果图像的总行数是偶数,所述最后一行的CB数据由倒数二行的CB数据值替换。
作为优选实施方式,所述步骤B中的第一缓存区为FPGA片外的动态存储器。
作为优选实施方式,所述动态存储器按地址划分为2个或多个部分
作为优选实施方式,所述步骤C中的第二缓存区为FPGA片内的静态存储器。
本发明的基于FPGA实现图像转置的方法的有益效果在于:本发明通过可编程逻辑器件FPGA和动态存储器架构来实现视频图像转置功能,由于是通过硬件实现而不是软件来实现,因此其处理速度快,响应时间短,实时性好。特别能够满足多任务处理条件下,实时性要求仍然较高的需求。
附图说明
图1是一种现有技术的示意图;
图2是另一种现有技术的示意图;
图3是本发明的技术方案的示意图;
图4A是将图像数据存储到第一缓存区的示意图;
图4B是从第一缓存区读取图像数据的示意图;
图5A是第一缓存区原始图像数据的示意图;
图5B是转置后第二缓存区的图像数据的示意图;
图6A是用于说明乒乓操作时,第一缓存区原始图像数据的示意图;
图6B是用于说明乒乓操作时,第二缓存区第一缓存空间的图像数据的示意图;
图6C是用于说明乒乓操作时,第二缓存区第二缓存空间的图像数据的示意图;
图7是YCbCr4:4:4格式的图像数据的示意图。
具体实施方式
下面结合附图和实施例对本发明进一步说明。
本发明设计是基于FPGA和动态存储器架构,其模块设计如图3所示。本发明的图像转置的方法一共使用到了两种存储器。1:FPGA片外的动态存储器(例如第三代双倍数据率同步动态存储器DDR3,按DDR3地址划分为2个或多个部分),用于缓存输入视频信号。2:FPGA片内静态存储器SRAM。
简单而言,首先,将每一帧原始图像转化为YCbCr4:2:2的图像显示格式;接下来,将图像从左到右逐行存储像素到第一缓存区(FPGA片外的动态存储器),如图4A所示;然后,再从下到上的逐列读取第一缓存区中的像素信息,如图4B所示,并将读出的像素信息按照从左到右的顺序逐行存储到第二缓存区(FPGA片内静态存储器SRAM);第四,由于第二缓存区中的像素信息会因此而丢失Cr或Cb值,因此对于丢失Cr信息的行,使用前、后各一行中同列的Cr信息的平均值作为本行该列的Cr值,对于丢失Cb信息的行,使用前、后各一行中同列的Cb信息的平均值作为本行该列的Cr值;对于第一行或最后一行无法计算平均值的,则直接使用第二行或倒数第二行中同列的Cr/Cb值,图像成为YCbCr4:4:4格式的图像;最后,再将上述YCbCr4:4:4格式的图像信息输出或进一步转化为RGB格式的数据输出。由于Cr/Cb值记录的是色彩的色差信号,而人眼对饱和度高的色彩的色差敏感度较弱,因此采用本发明的图像转置的方法处理后的YCbCr4:4:4格式的图像的效果,几乎同原始图像一样。
下面以将横屏视频图像转化为竖屏图像为例,详细描述本发明的基于FPGA实现图像转置的方法。
首先,将输入的横屏视频源数据预处理为YCBCR4:2:2格式,这样可以有效降低带宽和存储量,方便后续的数据传输和处理。如果源数据已经为YCBCR4:2:2格式则可以省略此步骤。由于上述视频格式的转换预处理属于现有技术的范畴,并非本发明的重点所在,所以不予赘述。
接下来,将经过处理的YCBCR4:2:2横屏视频图像逐行顺序存储到第一缓存区(FPGA片外的动态存储器),如图5A所示。本领域技术人员可以理解,如果每次处理的像素过少,会降低处理效率,而处理像素过多,又有可能会丢失数据。因此为了保障存储速度和数据安全性,优选每次向第一缓存区写入8个(也可以是任意自然数N个)像素点。在写入这8个像素点后,把当前列的地址设置为偏移8个像素点,当列地址为最后一列时,当前行的地址才转到下一行,否则行地址不变。
然后,在FPGA内部开辟第二缓存区,优选将第二缓存区分为第一缓存空间和第二缓存空间,每次从第一缓存区读取经过旋转后图像的8个像素点,轮流存入到第二缓存区的两个缓存空间内。从第一缓存区读取像素点的方法如下:如图5B所示,由于从横屏到竖屏变化,因此读取第一个像素点位置从原先横屏最后一行第一个像素点开始,每次根据当前行地址和列地址从第一缓存区中读取横屏视频图像像素点,每次读取8个像素点,在读取完8个像素点后,把当前行地址设置为倒数第二行的地址,当行地址为第一行时,当前列地址才进行一次列地址操作,偏移8个像素点,否则列地址不变。不断重复操作直到一帧完整视频结束,当最后一次操作不满8个像素点时,即视频帧不能被8个像素点整除时,那么这次操作按实际像素点计算。
本领域技术人员可以理解,由于从第一缓存区读取数据向第二缓存区写入时,需要读取的第一个像素点位置是原先横屏最后一行第一个像素点,因此必须保证该帧图像最后一行的第一个像素点已经存入了第一缓存区。为了加快第一缓存区的缓存速度,优选地,可以在FPGA片外动态存储器的内部划分2个或多个部分作为第一缓存区,加快缓存速度。另外,为了加快第二缓存区的缓存速度,第二缓存区的两个缓存空间优选采用两片FPGA片内静态存储器SRAM,用于乒乓操作。所谓乒乓操作是本领域的通用技术术语,指的是将数据流分配到两个数据缓存区,在第一个缓存周期,将输入的数据流缓存到“第一缓存空间”,此时第二缓存空间里没有有效数据;在第2个缓存周期,将输入的数据流缓存到“第二缓存空间”,同时将“第一缓存空间”缓存的第1个周期数据送到“后续模块”进行运算处理,并将第一缓存空间的数据清空;在第3个缓存周期再将输入的数据流缓存到“第一缓存空间”,同时将“第二缓存空间”缓存的第2个周期的数据送到“后续模块”进行运算处理,并将第二缓存空间的数据清空。如此循环。
上述乒乓操作的结果请参见图6A、6B和6C。第一次读1到8个数据到第二缓存区的第一缓存空间,第2次读17到24到第二缓存区的第一缓存空间,第3次读33到40到第二缓存区的第一缓存空间,第4次读49到56到第二缓存区的第一缓存空间(此时第二缓存区的第一缓存空间写完,进而向第二缓存空间写入数据),第5次读9到16到第二缓存区的第二缓存空间,第6次读25到32到第二缓存区的第二缓存空间,第7次读41到48到第二缓存区的第二缓存空间,第8次读57到64到第二缓存区的第二缓存空间(此时第二缓存区的第二缓存空间写完,进而再向第一缓存空间写入数据),如此循环操作。由于目前最大视频图像格式是1920×1080,那么优选在FPGA内部划分2块片内静态存储器SRAM大小都是1080×8,即可满足上述实施例的要求。
最后,针对存储在第二缓存区内的像素点,进行YCBCR4:2:2格式到YCBCR4:4:4格式的处理。经过转化后YCBCR4:4:4格式数据再转换成RGB格式输出至显示器显示。同理,由于上述YCBCR4:4:4格式到RGB格式的转换属于现有技术的范畴,并非本发明的重点所在,所以不予赘述。
转置前的横屏图像和转置后的竖屏图像数据格式排列分别如图5A和图5B所示,旋转前一帧视频图像大小为n行m列,旋转后一帧视频图像大小为m行n列。
但是,由于旋转前的视频图像数据格式排列是YCBCR4:2:2,经过旋转后的视频图像数据格式则为是奇数行是由Y和CB组成,而偶数行是由Y和CR组成。因此旋转后视频图像虽然也是YCBCR4:2:2格式,但是旋转后的图像数据不能直接用于显示,必须经过YCBCR4:2:2格式到YCBCR4:4:4格式的转换才能用于显示。
YCBCR4:2:2表示色度信号2:1的水平取样,没有垂直下采样,因此旋转后图像亮度信号不作变化,而色差信号抽样率是亮度信号的一半。由于旋转后奇数行色差信号为CB,偶数行为CR,经过处理变成YCBCR4:4:4格式,其处理结果如图7所示。经过旋转后图像格式,其奇数行CB信号不变,而CR是由上下一行CR信号做均值处理得到的,同理,偶数行CR信号不变,而CB信号是由上下一行CB信号做均值处理得到的。优选地,如果图像的总行数是偶数,所述第一行的CR数据由第二行的CR数据值替换;所述最后一行的CB数据由倒数二行的CB数据值替换。如果图像的总行数是奇数,所述第一行的CR数据由第二行的CR数据值替换,所述最后一行的CR数据由倒数二行的CR数据值替换。
上述实施例仅供说明本发明之用,而并非是对本发明的限制,有关技术领域的普通技术人员,在不脱离本发明范围的情况下,还可以做出各种变化和变型,因此所有等同的技术方案也应属于本发明的范畴。