技术领域
[0001] 本
发明属于
图像处理领域,具体涉及一种基于FPGA和非线性插值的视频缩放方法。
背景技术
[0002] 视频缩放广泛应用于数字图像和视频处理等方面。
算法的典型应用就是视频图像的缩放处理,即利用算法将输入的不同尺寸的视频图像按要求进行视频尺寸的重建(包括放大及缩小);重建之后的视频在图像
质量及显示效果上要求尽量贴近原视频,达到不失真的要求。
[0003] 当前视频缩放的算法存在很多,其中主流的有最近邻域插值法和双三次插值缩放算法。最近邻域插值法是以离待插值点最近的点的
像素值作为待插值点的像素值。该算法计算量小,计算速度快,但是没有考虑周围像素点带来的影响,仅仅将距离最近的像素点的值赋给当前像素点,简单地将原图像放大或者缩小到到
指定大小。同时,虽然该算法
硬件可实现性好,但是容易产生锯齿状和
马赛克现象,放大后的图像有较明显的失真。双三次插值缩放算法中,待插值点的像素值是通过矩形网格中最近的16个
采样点的加权平均得到,由于采样点增加,各像素点之间的过渡更加平缓,实现后的效果更好,但该算法的计算复杂度也大幅提升,在FPGA上实现占用大量的可配置资源。由于FPGA内部的逻辑资源有限,综合考虑显示效果、延时和硬件可实现性,实际工程中上述两种方法均存在一定局限性,对缩放算法的
硬件实现造成了困难。
发明内容
[0004] 本发明的目的在于提供一种可靠性高、易于实施且效果较好的基于FPGA和非线性插值的视频缩放方法。
[0005] 本发明提供的这种基于FPGA和非线性插值的视频缩放方法,包括如下步骤:
[0006] S1.对原始视频
分辨率及目的视频分辨率进行行场时序控制;
[0007] S2.对原始
视频流数据进行乒乓缓存;
[0008] S3.对原始视频流数据中的动态视频数据进行写RAM控制,从而实现根据写数据的反压控制;
[0009] S4.生成目的像素点,并根据目的像素点映射生成对应的索引地址;
[0010] S5.实时生成目的像素点的权值;
[0011] S6.实时读取步骤S3中RAM中的原始数据,并根据插值算法计算得到目的像素点的像素值,并实现对RAM的readempty控制;
[0012] S7.重复步骤S1~S6,实时生成新的目的像素点的像素值,从而实现原始视频的缩放。
[0013] 步骤S1所述的行场时序控制,具体为按输出的分辨率逐行生成,并采用如下算式计算产生的索引地址:
[0014] colcount_dst_index_x=src_Width*colcount_dst/dst_Width;
[0015] rowcount_dst_index_y=src_Height*rowcount_dst/dst_Height;
[0016] 式中colcount_dst_index_x为索引列地址值且为变化值,rowcount_dst_index_y为索引行地址值且为变化值,src_Width为源视频的宽度值且为固定值,src_Height为源视频的高度值且为固定值,colcount_dst为实时生成的目的视频的宽度值且为变化值,rowcount_dst为实时生成的目的视频的高度值且为变化值,dst_Width为目的视频的宽度值且为固定值,dst_Height为目的视频的高度值且为固定值。
[0017] 步骤S2所述的乒乓缓存,具体为对原始视频流数据进行带反压控制
信号的乒乓缓存;当存储接近饱和时采用如下算式计算并产生反压信号,从而保证数据不会丢失:
[0018] M-Addr_wr+Addr_rd<=Ram_TH
[0019] 式中M为一行RAM的存储空间大小;Addr_wr为当前写数据的地址;Addr_rd为当前读数据的地址;Ram_TH为满
水线;所述的满水线为饱和最大值的80%。
[0020] 步骤S6所述的根据插值算法计算得到目的像素点的像素值,具体为采用如下算式计算得到目的像素点的像素值v0:
[0021] v0=v1*s1*s4+v2*s1*s2+v3*s2*s3+v4*s3*s4
[0022] 其中v1~v4为目的像素点周围的四个已知点P1~P4的像素值;目的像素点的坐标为P0(X0,Y0);P1点的坐标为P1(SX1,SY1),P2点的坐标为P2(SX2,SY2),P3点的坐标为P3(SX3,SY3),P4点的坐标为P4(SX4,SY4);s1为点P0到直线P1P2的距离,s2为点P0到直线P2P3的距离,s3为点P0到直线P3P4的距离,s4为点P0到直线P1P4的距离。
[0023] 本发明提供的这种基于FPGA和非线性插值的视频缩放方法,基于FPGA和插值算法,采用行场时序控制、乒乓缓存和反压控制等方式,实现了视频缩放,在保证本发明方法的效率的前提下,硬件资源消耗极小,而且可靠性高,易于实施。
附图说明
[0024] 图1为本发明方法的方法流程示意图。
[0026] 图3为本发明方法的乒乓缓存示意图。
[0027] 图4为本发明方法的插值算法的示意图。
具体实施方式
[0028] 如图1所示为本发明方法的方法流程示意图:本发明提供的这种基于FPGA和非线性插值的视频缩放方法,包括如下步骤:
[0029] S1.对原始视频分辨率及目的视频分辨率进行行场时序控制;具体为按输出的分辨率逐行生成,并采用如下算式计算产生的索引地址:
[0030] colcount_dst_index_x=src_Width*colcount_dst/dst_Width;
[0031] rowcount_dst_index_y=src_Height*rowcount_dst/dst_Height;
[0032] 式中colcount_dst_index_x为索引列地址值且为变化值,rowcount_dst_index_y为索引行地址值且为变化值,src_Width为源视频的宽度值且为固定值,src_Height为源视频的高度值且为固定值,colcount_dst为实时生成的目的视频的宽度值且为变化值,rowcount_dst为实时生成的目的视频的高度值且为变化值,dst_Width为目的视频的宽度值且为固定值,dst_Height为目的视频的高度值且为固定值;
[0033] S2.对原始视频流数据进行乒乓缓存;具体为对原始视频流数据进行带反压
控制信号的乒乓缓存;当存储接近饱和时采用如下算式计算并产生反压信号,从而保证数据不会丢失:
[0034] M-Addr_wr+Addr_rd<=Ram_TH
[0035] 式中M为一行RAM的存储空间大小;Addr_wr为当前写数据的地址;Addr_rd为当前读数据的地址;Ram_TH为满水线;所述的满水线为饱和最大值的80%;
[0036] S3.对原始视频流数据中的动态视频数据进行写RAM控制,从而实现根据写数据的反压控制;
[0037] S4.生成目的像素点,并根据目的像素点映射生成对应的索引地址;
[0038] S5.实时生成目的像素点的权值;
[0039] S6.实时读取步骤S3中RAM中的原始数据,并根据插值算法计算得到目的像素点的像素值,并实现对RAM的readempty控制;具体为采用如下算式计算得到目的像素点的像素值v0:
[0040] v0=v1*s1*s4+v2*s1*s2+v3*s2*s3+v4*s3*s4
[0041] 其中v1~v4为目的像素点周围的四个已知点P1~P4的像素值;目的像素点的坐标为P0(X0,Y0);P1点的坐标为P1(SX1,SY1),P2点的坐标为P2(SX2,SY2),P3点的坐标为P3(SX3,SY3),P4点的坐标为P4(SX4,SY4);s1为点P0到直线P1P2的距离,s2为点P0到直线P2P3的距离,s3为点P0到直线P3P4的距离,s4为点P0到直线P1P4的距离;
[0042] S7.重复步骤S1~S6,实时生成新的目的像素点的像素值,从而实现原始视频的缩放。
[0043] 如图2所示为本发明方法的实现框图示意图:其中RAM0/RAM1为缓存模
块,主要用来缓存外部进来的视频流数据,乒乓操作模式,带反压控制信号,当接近存储饱和时,产生反压信号,以保证数据不被丢失;产生反压控制的
阈值公式如下:M-Addr_wr+Addr_rd<=Ram_TH;(其中M为一行ram的储存空间大小,Addr_wr为当前写数据的地址,Addr_rd为当前读数据的地址,该反压公式适用于读写
指针在相邻行中)
[0044] Bilinear interpolation为双线性插值模块,用于将上下行的4点像素值,根据插值公式生成目的像素值;
[0045] Src Row&&Column count和Dst Row&&Column count为行场计数模块,用于对输入输出的视频流进行行场计数控制,已达到像素图像的
帧数控制;
[0046] FIFO为索引地址缓存模块,用于设置一个深度较小的FIFO主要用于缓存索引目的像素点的地址,将源跟目的数据分隔,实现流水控制;
[0047] Dst pixels为最终的输出数据,为目的像素点的像素值。
[0048] 如图3所示为本发明方法的乒乓缓存示意图:其中写数据控
制模块MUX_2to1_wr_Ctrl控制数据的乒乓写操作,写数据受当前RAM状态的反压影响,当前RAM出现反压信号,MUX_2to1_wr_Ctrl不再往RAM中写入数据,将数据缓存在上级FIFO中,等待反压解除;读数据
控制模块MUX_2to1_rd_Ctrl控制数据的乒乓读操作,读数据受当前RAM状态是否非空及读指针不能超前写指针的共同影响,当前RAM出现读空标志,MUX_2to1_rd_Ctrl不再发起读操作,直至RAM非空。
[0049] RAM中数据的读取控制需要满足当前RAM非空且读指针不能超前写指针即可,从RAM中取到的数据根据前文的双线性插值公式生成新的像素点值。
[0050] 如图4所示为本发明方法的插值算法的示意图:目的像素点的像素值v0的计算公式为:
[0051] v0=v1*s1*s4+v2*s1*s2+v3*s2*s3+v4*s3*s4
[0052] 其中v1~v4为目的像素点周围的四个已知点P1~P4的像素值;目的像素点的坐标为P0(X0,Y0);P1点的坐标为P1(SX1,SY1),P2点的坐标为P2(SX2,SY2),P3点的坐标为P3(SX3,SY3),P4点的坐标为P4(SX4,SY4);s1为点P0到直线P1P2的距离,s2为点P0到直线P2P3的距离,s3为点P0到直线P3P4的距离,s4为点P0到直线P1P4的距离
[0053] 在具体实施时,通过缩放比例关系计算得到的缩小点为p0(x0,y0),则其4周的点分别为:P1点的坐标为P1(SX1,SY1),P2点的坐标为P2(SX2,SY2),P3点的坐标为P3(SX3,SY3),P4点的坐标为P4(SX4,SY4);
[0054] x0的可能取值为:sx1=(int)x0;sx2=sx1+1;int为取整函数;
[0055] y0的可能取值为:sy1=(int)y0;sy2=sy1+1;int为取整函数;
[0057] s1=y0–sy1,
[0058] s2=sx2–x0,
[0059] s3=1.0–s1,
[0060] s4=1.0–s2,
[0061] 其中s1,s2,s3,s4表示长度;假设p1,p2,p3,p4的像素值(24位的RGB数据)分别为v1,v2,v3,v4,则双线性插值计算p0点像素值v0(24位的RGB数据)公式为:v0=v1*s1*s4+v2*s1*s2+v3*s2*s3+v4*s3*s4。
[0062] 本发明提供的这种基于FPGA和非线性插值的视频缩放方法,较其他方案及平台有多种优势,具体体现在:
[0063] 1.FPGA资源有限,采用非线性插值法实现视频缩放,可以在满足视频缩放要求的
基础上,进一步避免了由于使用其他复杂算法而过多的消耗FPGA资源,在一定程度上解决了由于视频缩放算法带来的原始图像信息丢失导致的图像失真。
[0064] 2.FPGA基于可编程逻辑实现硬件功能,具有灵活性强,维护方便等优点。
[0065] 3.FPGA内部并行
数据处理架构,对于处理大量实时的视频数据,具有处理速度快,效率高的优点。
[0066] 4.基于FPGA的pipeline架构的非线性插值算法,较CPU等
软件处理方式,大大提高了数据处理的效率,提高了视频数据的实时性,较软件的实现方式,该算法在FPGA上性能能提升50%以上,经仿真测试表明该算法处理
视频帧率能达到60fps,FPGA上实现较为简单,并能实现任意比列的图像缩放。