发明内容
针对以上的不足,本发明提出了一种基于双三次插值的视频缩放装置,通过运用双三次插值使用同一个插值内核来实现放大和缩小操作。
一种基于双三次插值的视频缩放装置,它包括:用于提供输入数据接口和水平缩放接口,实现可靠稳定的跨时钟的数据传输和数据同步处理的第一和第二行缓冲器;用于存放插值系数的查找表LUT;用于根据第一行缓冲器读入的原始图像数据实现四次水平插值,得到当前插值点的像素值,并给出对第二行缓冲器的写使能信号和写行、列地址,以将水平插值的结果数据正确地写入第二行缓冲器,实现原始图像数据的水平缩放的水平缩放单元;用于根据第二行缓冲器读入的水平缩放后的图像数据实现垂直插值,得到当前插值点的像素值,输出结果图像数据和时序信息的垂直缩放单元;用于根据缩放倍数和输入像素时钟控制水平缩放单元和垂直缩放单元的工作时序的时序控制单元。
所述水平缩放单元包括水平逻辑控制单元、水平邻域选择单元、水平插值计算单元、水平系数计算单元和水平寄存器单元,水平逻辑控制单元读取水平寄存器单元的参数值dx和第一行缓冲器中的原始图像每一行数据,水平邻域选择单元计算当前插值点在原始图像邻域中每个水平方向上的四个像素值,以及插值点对应于参考点的偏移横坐标值Δx,水平逻辑控制单元利用Δx作为LUT的地址线输入,得到相应数据即为插值计算系数输入给水平系数计算单元,水平系数计算单元和水平插值计算单元计算出当前插值点的像素值,并将水平插值后的图像数据通过水平逻辑控制单元写入第二行缓冲器中。
所述垂直缩放单元包括垂直逻辑控制单元、垂直邻域选择单元、垂直系数计算单元、垂直插值计算单元单元和垂直寄存器单元,垂直逻辑控制单元读取垂直寄存器中的参数值dy和第二行缓冲器中的每一列水平差值后的图像数据,垂直邻域选择单元计算当前插值点在上述图像邻域中每个垂直方向的四个像素值,以及插值点对应于参考点的偏移纵坐标值Δy,垂直逻辑控制单元利用Δy作为LUT的地址线输入,得到相应的数据即为对应于四个像素值的插值系数,输入给垂直系数计算单元,垂直系数计算单元和垂直插值计算单元计算出当前插值点的像素值。
所述第一缓冲器为双口RAM,每个双口RAM的容量为一行目标分辨率的图像数据大小,所述第二缓冲器为双口RAM,双口RAM的容量为五行目标分辨率的图像数据大小。
所述第一缓冲器使用双口RAM的端口提供给输入信号和水平缩放单元接口信号,输入数据只能写入第一缓冲器,水平缩放单元只能读第一缓冲器中的数据;所述第二缓冲器使用双口RAM的端口提供给水平缩放单元和垂直缩放单元接口,水平缩放单元只能对第二缓冲器进行写操作,垂直缩放单元只能对第二缓冲器进行读操作。
所述水平系数计算单元和垂直系数计算单元采用八位二进制数(Δx,Δy)表示,事先计算好与八位精度的(Δx,Δy)对应的系数值,写在ROM中,用水平邻域选择单元和水平邻域选择单元产生的(Δx,Δy)作为地址线来读取ROM中相应的数据,即为要计算的系数。
所述参数值dx和参数值dy采用十六位二进制,
本发明的有益效果:一是利用双三次插值实现同一个插值内核来放大和缩小操作;二是要完全定点整数操作,提高处理速度,可以实现全高清视频分辨率转换;三是实现不限制放大或者缩小的倍数的范围,且不限制缩放倍数的取值;四是将邻域选择和偏移量计算分开,可以准确地定位新插值像素点在原图像中的位置,不受累计误差的影响可以减少查找表ROM大小。
具体实施方式
下面结合附图对本发明进行进一步阐述。
如图5所示,双三次插值的流程为:F(x,y)为要求的新像素点,原图像中其周围4×4邻域的点为P1,P2...P16 16个像素点,对应坐标分别图中标出,对新像素点进行反坐标变换得到其在原图像中的浮点坐标为(x,y)=(Xi+Δx,Yi+Δy),Δx,Δy为[0,1]区间的浮点数,即Δx=x-Xi,Δy=y-Yi。
首先对每个未知点的像素值,在水平方向上进行四次三次插值,则对图中第一行,有:
Fh1=C1P1+C2P2+C3P3+C4P4
其中Fh1为第一行进行水平插值的结果,P1,P2,P3,P4为原始图像中像素点的值,C1,C2,C3,C4为与P1,P2,P3,P4对应的插值系数。
再对第二、三、四行进行的水平插值计算Fh2、Fh3和Fh4,由于F(x,y)相对于每行四个像素点的坐标值与相对第一行的四个点的坐标值是相同的,因此插值系数也是相同的,即:
Fh2=C1P5+C2P6+C3P7+C4P8
Fh3=C1P9+C2P10+C3P11+C4P12
Fh4=C1P13+C2P14+C3P15+C4P16
四次水平插值完成之后,然后用水平插值的结果Fh1、Fh2、Fh3和Fh4进行垂直方向的插值:
F=L1Fh1+L2Fh2+L3Fh3+L4Fh4
其中L1,L2,L3,L4为垂直方向的插值系数。
得到要求插值点F(x,y)的像素值的表达式为:
F(x,y)=L1(C1P1+C2P2+C3P3+C4P4)+L2(C1P5+C2P6+C3P7+C4P8)+
L3(C1P9+C2P10+C3P11+C4P12)+L4(C1P13+C2P14+C3P15+C4P16)
由以上计算过程,根据要求的插值点的浮点坐标与其4×4邻域中的像素点,计算水平和垂直的插值系数,然后即可计算得到新插值点的像素值。
用于得到插值系数的双三次插值函数为:
其中,x表示待插值点与参考点之间在水平或垂直方向上的距离。
如图1所示,本发明基于双三次插值的视频缩放装置包括第一行缓冲器10、第二行缓冲器30、水平缩放单元20、垂直插值单元40、用于储存插值系数的查找表LUT 50和时序控制单元60。
如图2和图3所示,水平缩放单元20包括水平逻辑控制单元200、水平邻域选择单元201、水平插值计算单元203、水平系数计算单元202和水平寄存器204单元,垂直缩放单元40包括垂直逻辑控制单元400、垂直邻域选择单元401、垂直系数计算单元402、垂直插值计算单元单元403和垂直寄存器单元404。视频数据和时钟信号输入本缩放装置,写入第一行缓冲器10,水平缩放单元20从第一行缓冲器10中读取视频数据进行水平缩放,水平缩放结果写入第二行缓冲器30中,垂直缩放单元40在第二行缓冲器30中读取数据完成垂直方向的缩放,缩放的结果和时序信号直接输出,整个过程在时序控制单元60的控制下完成。
第一行缓冲器10与第二行缓冲器30实现可靠和稳定的跨时钟的数据传输和数据处理同步。由于定标器输入的图像分辨率可能有很多种,因此对应的输入像素时钟也不是固定的,而无论是进行图像放大还是缩小,缩放结果的图像数据都与输入图像分辨率不同,因此显示时钟和输入像素时钟肯定是不同的,这就意味着需要数据缓冲器来进行跨时钟的数据传输。在进行水平插值之前,需要先接收一定量的数据后才能开始处理,在水平缩放单元20和输入数据之间加上一个第一行缓冲器10,第一缓冲器10为双口RAM,双口RAM的容量至少为一行目标分辨率的图像数据大小。水平缩放单元20输出的数据是按行输出的,而垂直缩放单元40根据所采用的算法,需要多行中的同列数据来进行垂直方向上的缩放,本发明中采用双三次插值算法进行缩放,在每个维度上需要四个数据进行计算。另一方面,水平处理的速度和垂直处理的速度可能有很大差别,例如,当将原图像放大4倍时,每对一行完成水平缩放的同时,需要完成四行垂直方向上的插值。这时水平缩放和垂直缩放工作在不同的时钟下,即水平缩放时钟与显示时钟不同。所以在水平缩放和垂直缩放之间需要一个数据缓冲,本发明采用第二行缓冲器30作为这里的缓冲,容量为至少五行目标图像数据的大小,第二行缓冲器30使用双口RAM来实现,每个双口RAM的容量为一行目标分辨率的图像数据,或者直接采用一个容量至少为五行目标图像数据的大小的双口RAM。第一行缓冲器10使用双口RAM的端口提供给输入信号和水平缩放单元20接口信号,输入数据只能写入第一行缓冲器10,水平缩放单元20只能读第一行缓冲器10。同样,第二行缓冲器30使用双口RAM的端口提供给水平缩放单元20接口和垂直缩放单元40接口,水平缩放单元20只能对第二行缓冲器30进行写操作,垂直缩放单元40只能对第二行缓冲器30进行读操作。
时序控制单元60根据缩放倍数和输入像素时钟控制水平缩放单元20和垂直缩放单元40的工作时序,以保证行缓冲区的读、写操作不发生冲突,不出现溢出,能可靠的跨时钟传输数据。
如图2所示,水平缩放单元20包括水平逻辑控制单元200、水平邻域选择单元201、水平插值计算单元203、水平系数计算单元202和水平寄存器204,水平逻辑控制单元200读取水平寄存器204内的参数值dx,水平邻域选择单元201计算当前插值点在原图像中的4×4邻域中每个水平方向上的4个像素值,以及插值点对应于参考点的偏移横坐标值Δx,然后对前第一行缓冲器10给出读地址、读使能信号,使水平缩放单元20在水平工作时钟的控制下从第一行缓冲器10读入原始图像数据。水平逻辑控制单元200用Δx作为LUT的地址线输入,得到相应数据即为插值计算的系数输入给水平系数计算单元202。然后控制系数计算和水平插值计算单元203计算出当前插值点的像素值;得到像素值后,水平逻辑控制单元200给出对第二行缓冲器30的写使能信号和写行、列地址,以将水平插值的结果数据正确地写入第二行缓冲器30,供垂直缩放单元40读取进行垂直缩放。LUT中写入的系数数据由选所用的算法决定,本水平缩放单元20采用双三次插值算法,当然也可以选用其他算法,改变LUT中的系数即可改变插值效果。因此,本发明的缩放单元的系数可由使用者根据实际使用场合调整,以改变缩放结果。
如图3所示,类似于水平缩放单元20,垂直缩放单元40由垂直逻辑控制单元400、垂直垂直邻域选择401、垂直系数计算402、插值计算单元403和垂直寄存器404组成。垂直逻辑控制单元400读取垂直寄存器404中的参数值dy,垂直邻域选择单元401计算当前插值点在原图像中的4×4邻域中每个垂直方向的4个像素值,以及插值点对应于参考点的偏移纵坐标值Δy,然后对第二行缓冲器30给出读使能信号和读地址信号,控制垂直缩放单元40读入水平插值的结果数据。与水平缩放单元20不同的是,垂直缩放单元40读入的是不同行的同列数据,本单元读入的为4行中同列的数据。垂直逻辑控制单元400用Δy作为LUT的地址线输入,得到相应的数据即为对应于4个像素值的插值系数,输入给垂直系数计算单元402;然后控制系数计算和垂直插值计算单元403计算出当前插值点的像素值,垂直插值单元403使用水平插值的结果像素数据和系数值计算最终插值结果;最后,控制插值结果输出到下个单元,同时给出相应的输出像素时钟、帧有效和行有效信号。
水平系数计算单元202与垂直系数计算单元402采用8位二进制数表示(Δx,Δy),通过事先计算好与8位精度的(Δx,Δy)对应的系数值,写在ROM中,用邻域选择单元产生的(Δx,Δy)作为地址线来读取ROM中相应的数据,即为要计算的系数。对于本单元来说,8位二进制数的精度已可满足要求,因此由(Δx,Δy)计算得的系数也用八位二进制精度来表示。
水平插值单元203和垂直插值单元403分别根据系数计算单元的系数和邻域选择单元得到的原图像中的像素值进行计算。具体框图如图4:其中D1~D4为(什么数据),由于系数C1和C4为负值,为了简化运算,本scaler全部采用无符号数,因此这里用|C1|和|C4|作为系数进行计算,然后在最后计算插值结果时,将对应于这两个系数的像素值的加权结果用减法来计算。由于这里全部采用无符号数进行计算,因此最后需要对插值结果像素值进行范围限定。(关于此部分,最好把所有的英文转换成中文)
时序控制单元60控制整个缩放系统的工作,包括:输入数据是否为有效数据(帧有效且行有效),第一行缓冲器10在输入数据和水平缩放单元20之间的切换和传输,第二行缓冲器30在水平缩放单元20和垂直插值单元40之间的切换和传输。时序控制单元60还根据输入时序信号分离视频信号中连续两帧图像。
本发明的具体实施例为:假设原图像大小为(X_in,Y_in),目标显示设备分辨率为(X_out,Y_out)。如上所述,缩放过程分为水平和垂直两部分,先将图像水平缩放为(X_out,Y_in),然后完成垂直缩放,结果图像分辨率为(X_out,Y_out)。
原图像大小为(X_in,Y_in),目标显示设备分辨率为(X_out,Y_out),则对本scaler的寄存器写入水平缩放倍数 垂直缩放倍数
设(X_in,Y_in)的位宽为(M,N),(X_out,Y_out)位宽为(MO,NO),定义变量tempx和tempy来计算新插值点的邻域的点的坐标,则tempx和tempy的位宽分别为(16+M,16+N)。在计算过程中,仍然采取原图像的坐标,目标图像的坐标使用映射到原图像坐标中的浮点坐标。对新像素点进行反坐标变换得到其在原图像中的浮点坐标为(x,y)=(Xi+Δx,Yi+Δy),Δx,Δy为[0,1]区间的浮点数。即Δx=x-Xi,Δy=y-Yi。显然,目标图像中像素点间的距离为:
在大多数应用场合中,图像并不是呈整数倍缩放的,因此dx和dy通常为浮点数,用16位二进制数来近似,即用的精度来表示浮点数dx和dy。则对于新插值点(nx,ny)来说,其在原图像坐标中的浮点坐标为:
新插值点的参照点坐标为
(xint,yint)=(tempx(16+M downto 16),tempy(16+N downto 16))
新插值点与参照点的横、纵坐标差为:
(deltax,deltay)=(tempx(15 downto 0),tempy(15 downto 0))
由于dx和dy用二进制数来表示,这里引入了截断误差,当此截断误差累积到超过单位长度之后,则会出现定位不准确,新插值点的邻域坐标选择错误。为了能准确定位新插值点的邻域,经仿真验证,采用16位二进制数的精度来表示,可以准确定位新插值点的邻域。但在进行系数计算时,由于本发明的系数用查找表(look up table,LUT)来得到,采取16位地址线的ROM会严重影响芯片面积。经过对运算结果的评估,本发明采取8位横、纵坐标差来计算系数,在对处理效果没有太大影响的同时,减少了ROM的大小,也即减小了最终芯片的面积。即
(Δx,Δy)=(tempx(15 downto 8),tempy(15 downto 8))
水平和垂直逻辑控制单元在传递dy给邻域选择单元之前,判断像素是否处于边缘区域,然后进行相应的操作:
(1)边缘位置的点直接赋值。水平插值的过程中,目标图像的最左边和最右边两列直接用原图像最左边和最右边的两列像素值。垂直插值的过程中,目标图像的最上和最下两行直接等于水平插值结果图像的最上和最下两行的像素值。
(2)当新插值点处于原图像中的次边缘位置时,即处于第一行与第二行之间,或者最后一行和倒数第二行之间,或第一列与第二列之间,或者最后一列与倒数第二列之间。由于本发明采用的是bi-cubic算法,在每个维度上取周围四个点进行计算,在上述情况时,会出现邻域内不足四点的情况。因此,邻域中缺少的像素点用原图像中的边缘的像素值来表示。例如,当进行水平插值时,新插值点定位于第一列和第二列之间,这时,对于新插值点的P1像素值为空,本发明中采取令P1=P2来处理。即相当于对原图像在进行插值处理前,在上下左右分别复制第一行、最后一行、第一列、最后一列。