手持设备上视频图像的快速缩放方法
【技术领域】
本发明涉及一种视频处理技术,特别涉及一种手持设备上视频图像的快速缩放方法。
【背景技术】
目前,手持消费电子设备上的视频播放是一个很重要的功能,消费者要求能够将互联网上的各种视频下载到手持设备上直接进行播放,而无需提前经过转换。互联网上常见的视频格式,其分辨率千差万别。从QVGA(320*240像素),到VGA(640*480像素),D1(720*480像素),再到最近两年大量增加的720P(1280*720像素),1080P(1920*1080像素)。所有这些不同分辨率的视频,要在手持设备上顺利播放,除了要求手持设备具有很高的解码性能和全面的解码兼容性外,也无一例外要求能够提供视频图像的实时缩放功能。其主要的原因在于,手持设备受限于显示屏(LCD)的工艺和整体成本,其显示分辨率主要有WQVGA(480*272像素),VGA(640*480像素)和WVGA(800*480像素)几种。因此,要将不同视频的分辨率按照显示屏(LCD)的分辨率输出,必须在嵌入式多媒体系统设计中增加视频图像的实时缩放功能。
在嵌入式系统中,视频图像的实时缩放,一直都是整个系统设计中不可缺少的模块。通常,视频图像的缩放模块都采用硬件或软件来完成。采用硬件的方案,可以使用复杂的缩放算法,缩放后质量最好。但是这一类硬件通常直接挂在系统总线上,它需要不断的读取解码器解码得到的视频图像数据,经过缩放后,再送到外部存储器或者直接送到显示屏(LCD)上。其一般性的系统框图如图1a和图1b所示。图1a中,视频图像缩放模块(Video Scaler)直接将存储在外部存储器(External Memory)的原始视频图像数据读入其中,缩放后再直接送到LCD上。由于原始视频图像数据量太大,因此在缩放模块中设计一个同样大小的图像数据缓冲来一次存储整帧的数据的成本就变得非常高。减小内部数据缓冲的结果必然使得Video Scaler需要从外部存储器中不断地分批分块读取图像数据进来缩放。如果LCD的刷新率是60赫兹/秒,则Video Scaler每秒所需要从外部存储器读取的数据就是60倍原始视频图像大小。毫无疑问,这加重了系统总线和存储器访问的负担,必然反过来影响视频编解码器的性能。同理,在图1b中的设计中,缩放后的数据重新写回到外部存储器中,再从外部存储器写到LCD,这种方式比前一种方式进一步加重了系统负担。
为了降低系统负担,可在视频编解码器(Video Decoder)内部实现Video Scaler功能。这样直接送到外部存储器的是经过缩放后的解码图像,如此对总线带宽和存储器访问的影响远小于上面两个方案。Video Codec通常由可编程处理器或专用的硬件完成。采用可编程处理器实现Video Codec,需要考虑增加的缩放模块所带来的复杂程度和缩放效果,并尽量在这二者之间寻找折中。过于复杂的缩放算法会消耗大量的处理器运算资源,反过来严重影响视频解码性能;而过于简单的缩放算法将造成缩放后图像的质量急剧下降。
常见的视频缩放算法包括最近领域缩放,双线性缩放,双立方缩放等算法。最近领域缩放最简单,但效果最差,极容易引起锯齿现象。双线性缩放是一种被广泛使用的缩放算法。一般的,缩放倍数在0.5倍以上,2倍以下的,采用双线性缩放对任何图像的缩放结果都是完全可以接受的。在0.5倍以下,2倍以上的缩放效果存在一定下降。双线性缩放的不足之处在于二维方向上每缩放一个点需要共计8次乘累加。这在软件上存在一定量的开销。双立方缩放的效果更好,但需要增加的运算复杂度也是三个中最高的,并且远超过前两者。
由上可知,即使采用双线性缩放,仍需要一定的计算量,而采用最近领域缩放的质量却是最差的。考虑到视频最大的原始分辨率为1080P(1920*1088像素),最小的原始分辨率基本在QVGA(320*240像素)左右。而通常需要缩放到的目标分辨率都是LCD的显示分辨率,即介于WQVGA(480*272像素)和WVGA(800*480像素)之间,可见缩小的最大倍数是4倍,而放大的倍数是3倍左右,即缩放倍数介于原始视频图像的0.25到3倍之间。因此,本发明综合考虑了最近领域和双线性缩放,同时结合了视频图像的组织方式,提出一种缩放方法,可有效减少运算量,尤其是乘累加的次数,同时缩放后的质量显著好于最近领域缩放,逼近双线性缩放效果。
图像缩放的一般方法:从一维方向上看,可以表示成如下形式。以X方向缩放为例:
xs=kxd
其中,xd表示缩放后点的x坐标,xs表示对应的缩放前点的x坐标,k表示缩放的倍数。从此表达式来看,它和直线方程是一致的。既然如此,通用的画直线方法也一样适用于x方向的缩放。在文献Jack E.Bresenham,″Algorithm for computer control of a digital plotter″,IBM Systems Journal,Vol.4,No.1,January 1965,pp.25-30中介绍的Bresenham直线绘制(Bresenham Line Drawing)算法是最为常见的直线画法。它的基本原理如下:
1.画第i点P(xi,yi),xi表示P点在水平方向上的坐标,yi表示P点在垂直方向上的坐标,其像素值表示为pixel(xi,yi);
2.准备画第i+1点,x坐标加1,即xi+1=xi+1;判断如果达到终点,则完成;否则,由图2可知,下个要画的点或者是当前点的右邻接点B(注:申请人指明是哪一点,最好能在图中有相应标示),或者是当前点的右上邻接点A;
3.如果直线方程y=kx与xi+1的交点的y坐标大于M(xi,yi+0.5)的y坐标的话,下个点即A(xi+1,yi+1),像素值为Pixel(xi+1,yi+1);否则,下个点为B(xi+1,yi),其像素值为Pixel(xi+1,yi);
4.画点A(xi+1,yi+1)或者B(xi+1,yi);
5.跳回第2步。
上述的Bresenham直线绘制算法借助于一个误差量(直线与当前实际绘制像素点的距离),来确定下一个像素点的位置。该算法的巧妙之处在于采用增量计算,使得对于每一列,只要检查误差量的符号,就可以确定该下一列的像素位置。
采用该算法绘制直线,虽然下一个点的获取可由一次比较完成,但直线的效果还是比较粗糙的。利用该算法原理进行图像缩放,其质量和最近领域法本质是一样的。
文献Riemersma,Thiadmer;″Quick and smooth image scaling with Bresenham″;Dr.Dobb′s Journal;May 2002.提出了一种smooth scaling with Bresenham。其核心思想是在Bresenham直线绘制(Bresenham Line Drawing)算法基础上引入半像素。参考图2,若xi+1对应的y坐标在N点,由于N点的y坐标大于M点的y坐标,则该点像素值和M点相同,其像素值为pixel(xi+1,yi+0.5),它是对A点和B点的像素值求平均得到的。若小于M点的y坐标,则取B(xi+1,yi)的像素值Pixel(xi+1,yi)。该算法相对于Bresenham直线绘制,很好的解决了缩放比例在0.5~2倍之间的图像效果,计算量也非常小,仅增加了一次平均值的计算。但对于0.5~2之外的缩放倍数,图像效果下降比较明显,会出现明显的锯齿。由此,本发明在该基础上,进一步提高图像缩放精度,且计算量小,可实现快速缩放。
【发明内容】
本发明要解决的技术问题,在于提供一种视频的快速缩放方法,可有效减少运算量,尤其是乘累加的次数,实现快速缩放,同时缩放后的质量显著好于最近领域缩放,逼近双线性缩放效果。
本发明是这样实现的:一种手持设备上视频图像的快速缩放方法,包括水平方向上的缩放和垂直方向上的缩放;其特征在于:将水平方向或垂直方向上的每个像素长度均分为四等分,形成四个等分参照区间,每个等分参照区间具有两个端点的坐标值;之后按下述步骤进行操作:首先沿水平方向上画点,完成后再沿垂直方向画点;亦可以首先沿垂直方向上画点,完成后再沿水平方向上画点;其中沿水平方向上画点包括:
步骤11、画第i点P(xi,yi),i是为方便叙述而引入的索引,xi表示P在缩放后水平方向上的坐标,yi对应P在缩放前水平方向上的坐标,其像素值表示为pixel(xi,yi);
步骤12、判断是否达到终点,若达到终点,则退出沿水平方向上画点的过程;否则,准备画第i+1点,对xi坐标加1得到xi+1,即xi+1=xi+1;
步骤13、确定第i+1点的缩放前水平方向像素值:构建水平方向上的缩放直线方程yi=k1xi,式中的xi表示缩放后点的水平方向坐标,yi表示对应的缩放前点的水平方向坐标;k1为图像在水平方向上的缩放倍数,该直线方程与坐标轴xi+1的交点,判断该交点的y坐标处于yi和yi+1之间的像素长度的哪个等分参照区间,则第i+1点的缩放前水平方向像素值就取该等分参照区间下方端点的像素值;
步骤14、根据步骤13所确定的第i+1点的缩放前水平方向像素值进行画点;之后返回步骤12;
其中在垂直方向上画点包括:
步骤21、画第j点Q(xj,yj),j是为方便叙述而引入的索引,yj表示Q在缩放后垂直方向上的坐标,xj表示Q在缩放前垂直方向上的坐标,其像素值表示为pixel(xj,yj);
步骤22、判断是否达到终点,若达到终点,则退出沿垂直方向上画点的过程;否则,准备画第j+1点,对xj坐标加1得到xj+1,即xj+1=xj+1;
步骤23、确定第j+1点的缩放前垂直方向像素值:构建垂直方向上的缩放直线方程yj=k2xj,式中的xj表示缩放后点的垂直方向坐标,yj表示对应的缩放前点的垂直方向坐标;k2为图像在垂直方向上的缩放倍数,该直线方程与坐标轴xi+1的交点,判断该交点的y坐标处于yj和yj+1之间的像素长度的哪个等分参照区间,则第j+1点的缩放前垂直方向像素值就取该等分参照区间下方端点的像素值;
步骤24、根据步骤23所确定的第j+1点的垂直方向像素值进行画点;之后返回步骤22;
当水平方向和垂直方向上的点均达到终点,则结束。
本发明具有如下优点:本发明所涉及到的缩放方法是以最近领域缩放和双线性缩放两种方法上为基础,再结合视频图像的组织方式,通过有效减少运算量,尤其是乘累加的次数来达到视频的快速缩放,同时缩放后的质量显著好于最近领域缩放,逼近双线性缩放效果。
【附图说明】
下面参照附图结合实施例对本发明作进一步的说明。
图1a和图1b分别为现有技术中手持设备中视频图像的缩放模块的结构示意图。
图2是现有技术中画直线方法的原理示意图(限于水平方向)。
图3是本发明方法的原理示意图(限于水平方向)。
图4a为一典型的视频数据排列图。
图4b为经过优化策略后的视频数据排列图。
【具体实施方式】
请参考图3至图4b,以详细说明本发明方法。
本发明仍采用经过改进的画直线方法进行缩放,其包括水平方向上的缩放和垂直方向上的缩放,由背景技术中的分析可知,手持设备上的视频缩放倍数通常介于0.25到3倍之间。为此,在本发明方法中引入1/4像素的概念。其中:将水平方向或垂直方向上的每个像素长度均分为4等分,形成四个等分参照区间,每个等分参照区间具有两个端点的坐标值(对于每个像素来说,共产生两个端点的坐标值、一个中间点即1/2像素点的坐标值以及两个1/4像素点的坐标值;)。
采用本发明改进的画直线方法进行缩放:其中水平方向是根据公式yi=k1xi计算出缩放前源图像的水平方向坐标,由该坐标点的像素值得到缩放后目标图像水平方向上的点的像素值;式中的xi表示缩放后点的水平方向坐标,yi表示对应的缩放前点的水平方向坐标,k1为图像在水平方向上的缩放倍数;垂直方向上根据公式yj=k2xj计算出缩放前源图像的垂直方向坐标,由该坐标点的像素值得到缩放后目标图像垂直方向上的点的像素值;xj表示缩放后点的垂直方向坐标,yj表示对应的缩放前点的垂直方向坐标;k2为图像在垂直方向上的缩放倍数。k1和k2可以相等,也可以不等。
之后按下述步骤进行操作:首先沿水平方向上画点,完成后再沿垂直方向上画点;亦可以首先沿垂直方向上画点,完成后再沿水平方向上画点;即水平方向上和垂直方向上画点不限先后,但原理相同,其中在水平方向上画点包括:
步骤11、画第i点P(xi,yi),i是为方便叙述而引入的索引,其表示水平方向要画点的个数的变量,取值为整数,xi表示P在缩放后水平方向上的坐标,yi表示P在缩放前水平方向上的坐标,其像素值表示为pixel(xi,yi);
步骤12、判断是否达到终点,若达到终点,则退出沿水平方向上画点的过程;否则,准备画第i+1点,对xi坐标加1得到xi+1,即xi+1=xi+1;
步骤13、确定第i+1点的缩放前水平方向像素值:构建水平方向上的缩放直线方程yi=k1xi,式中的xi表示缩放后点的水平方向坐标,yi表示对应的缩放前点的水平方向坐标;k1为图像在水平方向上的缩放倍数,判断该直线方程与坐标轴xi+1交点的y坐标处于yi和yi+1之间的像素长度的哪个等分参照区间,则第i+1点的缩放前水平方向像素值就取该等分参照区间下方端点的像素值;
如图3所示,例如,在图像水平方向缩放过程中,构建一个和水平方向缩放前后相关的二维坐标系,坐标系中用xh轴表示缩放后点的水平方向坐标,用yh轴表示缩放前点的水平方向坐标,其中缩放前水平方向即yh上在yi和yi+1之间的一个像素长度两个端点为A和B,其坐标值分别是A(xi+1,yi+1)、B(xi+1,yi+0.5),A和B之间具有一个1/4像素点F点坐标是(xi+1,yi+0.75),一个1/2像素点M点坐标是(xi+1,yi+0.5),另一个1/4像素点E点坐标是(xi+1,yi+0.25)。其中根据如下的AVERAGE运算定义:
AVERAGE(a,b)=(a+b)/2
可知,其M点、F点、E点对应的像素值为:
M点:
Pixel(xi+1,yi+0.5)=AVERAGE(Pixel(xi+1,yi)+Pixel(xi+1,yi+1))
F点:
Pixel(xi+1,yi+0.75)=AVERAGE(Pixel(xi+1,yi+1)+Pixel(xi+1,yi+0.5))
E点:
Pixel(xi+1,yi+0.25)=AVERAGE(Pixel(xi+1,yi)+Pixel(xi+1,yi+0.5))
如图3所示,假设直线方程yi=k1xi与坐标xi+1的交点为N,如果N点的y坐标介于A(xi+1,yi+1)与F(xi+1,yi+0.75)的y坐标之间,则第i+1点的缩放前水平方向像素值与F点像素值pixel(xi+1,yi+0.75)相同;如果N点的y坐标介于F(xi+1,yi+0.75)与M(xi+1,yi+0.5)的y坐标之间,则第i+1点的缩放前水平方向像素值与M点像素值pixel(xi+1,yi+0.5)相同;如果N点的y坐标介于M(xi+1,yi+0.5)与E(xi+1,yi+0.25)的y坐标之间,则第i+1点的缩放前水平方向像素值就取E点的像素值pixel(xi+1,yi+0.25),否则,如果N点的y坐标介于E(xi+1,yi+0.25)与B(xi+1,yi+0.5)的y坐标之间,则第i+1点的缩放前水平方向像素值就取B点的像素值pixel(xi+1,yi);
步骤14、根据步骤13所确定的第i+1点的缩放前水平方向像素值进行画点;更新i值之后返回步骤12,进入下一点的画点流程。
在垂直方向上画点可以按下述步骤进行,由于其原理与在水平方向上画点的原理相同,细节可参考上述在水平方向上画点的例子,此处不再详细说明:
步骤21、画第j点Q(xj,yj),j是为方便叙述而引入的索引,其表示垂直方向要画点的个数的变量,取值为整数,yj表示Q在缩放后垂直方向上的坐标,xj表示Q在缩放前垂直方向上的坐标,其像素值表示为pixel(xj,yj);
步骤22、判断是否达到终点,若达到终点,则退出沿垂直方向上画点的过程;否则,否准备画第j+1点,对xj坐标加1得到xj+1,即xj+1=xj+1;
步骤23、确定第j+1点的缩放前垂直方向像素值:构建垂直方向上的缩放直线方程yj=k2xj,式中的xj表示缩放后点的垂直方向坐标,yj表示对应的缩放前点的垂直方向坐标;k2为图像在垂直方向上的缩放倍数,判断直线方程与坐标轴xi+1的交点的y坐标处于yj和yj+1之间的像素长度的哪个等分参照区间,则第j+1点的缩放前垂直方向像素值就取该等分参照区间下方端点的像素值;
步骤24、根据步骤23所确定的第j+1点的缩放前垂直方向像素值进行画点;更新j值之后返回步骤22,进入下一点的画点流程。
当水平方向和垂直方向上的点均达到终点,则结束。
相对于smooth scaling with Bresenham算法,本发明方法共增加了2次比较,2次求平均,无乘法操作,同时缩放的倍数完全满足了手持设备上的视频缩放倍数要求。
在一些嵌入式平台中,由于存在指令预取机制(instruction prefetch mechanism),从逻辑顺序上,一旦接下来需要执行的指令没有预取进指令cache中,则流水线就会被中断,因而出现阻塞(stall),整个程序的执行性能将明显下降。这种阻塞现象经常出现在判断操作中。因此,应使用条件判断和条件执行指令来消除跳转操作。
解码器解码得到的视频图像是由YUV420数据组成的。如图4a所示一个典型的视频数据排列图。由于UV分量已经是亚采样,因此UV分量的缩放可以使用1/2像素的精度进行,以获得比Y分量缩放更小的计算量。同时在嵌入式系统设计中,U和V通常组织在一起,构成UV对。这样做的原因是U和V的采样精度一致,其运动矢量也一致。其UV的排列如下:
U00V00U01V01U02V02……·U(M/2)(N/2)V(M/2)(N/2)
针对这个特点,U和V分量的缩放可以同时完成。由于U和V各为8比特,而该方法唯一的像素计算就是求平均值。
Ub15Ub14Ub13Ub12Ub11Ub10Ub9Ub8,Vb7Vb6Vb5Vb4Vb3Vb2Vb1Vb0
V分量在进行AVERAGE计算的时候,存在进位的可能,即可能从Vb7进位到Ub8位,如果提前将Ub8置为0,则U分量的AVERAGE结果误差最大为1。而轻微的色度分量误差并不会对缩放后的质量产生过多的影响。
如前所述,本发明所涉及到的缩放方法综合考虑了最近领域和双线性缩放,同时结合了视频图像的组织方式,有效减少了运算量,尤其是乘累加的次数,同时缩放后的质量显著好于最近领域缩放,逼近双线性缩放效果。
虽然以上描述了本发明的具体实施方式,但是熟悉本技术领域的技术人员应当理解,我们所描述的具体的实施例只是说明性的,而不是用于对本发明的范围的限定,熟悉本领域的技术人员在依照本发明的精神所作的等效的修饰以及变化,都应当涵盖在本发明的权利要求所保护的范围内。