龙芬
摘要摘要:采用双线性插值和最近邻域插值两种算法,设计了一种实用的视频图像缩放器。该缩放器以较短延迟的方式改变视频流大小,在需要配置的参数中,数据宽度、颜色通道以及最大视频分辨率可在编译前配置好,输入输出分辨率、缩放因子以及大小改变类型等参数可实时配置。
关键词关键词:图像插值;视频缩放;Verilog HDL
DOIDOI:10.11907/rjdk.171017
中图分类号:TP319
文献标识码:A文章编号文章编号:16727800(2017)005009303
0引言
随着科技的进步,显示设备得到快速发展,特别是移动手持终端设备使得多媒体资源越来越丰富,格式多种多样。但各种显示设备支持的分辨率、帧率、刷新率等参数动态范围较小,基本为固定的几种模式,如电脑显示器的刷新频率一般为75Hz,而常见的消费类视频源信号刷新频率一般为25或29.97帧/秒, DVD和DTV源素材可能仅仅是24帧/秒[1]。为了有效解决视频图像数据和显示设备之间这一矛盾,必须进行视频的后期处理,即运用现代数字信号处理技术,在数字域内对视频信号进行各种数学运算。视频信号在不同的显示终端显示时需要进行缩放处理,而缩放质量的好坏会直接影响到视频播放质量。
1图像插值
实际操作中主要使用图像插值来完成数字图像缩放,因此图像质量和失真情况很大程度上依赖于插值算法的好坏。数字图像的插值处理一般要满足两个条件:①图像在插值像素点的值在二维空间是一个连续曲面;②在源图像的采样点,由插值计算得出的运算结果与源图像的值相等[2]。本设计主要采用双线性插值法和最邻近插值法。
1.1双线性插值法
双线性插值法又称为一阶插值法,通过空间几何变换分析,找出与目标像素最邻近的4个源图像像素点,利用对这4个点的像素值进行加权运算得出目标像素值,每个邻近点的权值与插值点距该邻近点的距离成反比[3]。假定一个目标像素点通过反向变换得到的插值点浮点坐标为(i+Δu,j+Δv),其中i、j为非负整数,Δu、Δv为区间[0,1]内的浮点数,源图像中坐标为(i,j),(i+1,j),(i,j+1),(i+1,j+1)所对应的最邻近4个像素值即可决定目标像素点的值。
f(i+Δu,j+Δv)=(1-Δu)(1-Δv)f(i,j)+Δu(1-Δv)f(i+1,j)+(1-Δu)Δvf(i,j+1)+ΔuΔvf(i+1,j+1)(1)
如果目标像素点经过空间变换正好处在4个源像素点的正中间,那么它的值就是源图像与之相邻近的4个像素值的平均[4]。
1.2最近邻域插值法
最近邻域插值法又称为零阶插值法,此方法计算灰度及色度插值最简单,只需考虑距离目标像素点最近的一个源图像像素,直接采用离插值位置最近的源像素值进行插值[5]。通过空间几何变换得到插值点的浮点坐标,该插值点像素值即等于它最邻近源像素点的值。使用最近邻域插值法等价于源图像像素与矩形函数在空间域进行卷积运算[6]。
2视频缩放器IP核架构
本视频缩放器系统框图如图1所示,主要由RAMFIFO、RAM填充控制、读控制以及数据合成控制等模块组成。
其中,RAM FIFO(RFIFO)是数据缓冲模块,也是各种控制操作的核心。除了数据的输入输出是连接到块RAM以外,RAM的操作主要利用FIFO结构完成。RAM需要提供单写双读端口控制,每个读端口同时读数据。若选择双线性插值算法,伴随着串行的视频行写RAM操作,需要为双线性插值准备4个输出值。RAM填充逻辑模块负责根据系统配置来决定哪些输入数据需要推入到RFIFO中,哪些输入数据需要丢弃[7]。所有被输出部分使用的行数据写到FIFO中,而未被输出部分使用的行则丢弃。读控制模块为RFIFO的RAM端口提供地址驱动和读使能,并推动RFIFO的读端口输出新的视频行, RFIFO读出4个像素插值的混合值。数据合成控制模块取混合值X Blend与Y Blend并产生4个系数,将系数与从RFIFO中读到的4个像素值相乘之后求和,得到输出数据。而在最近邻域算法模式中,只有一个值为1.0的系数,其余的值为0.0,以上产生的值都基于混合值X Blend与Y Blend。
3视频缩放器工作流程
视频缩放器采用Verilog HDL语言实现,在每个视频帧开始时,起始信号start由用户逻辑来声明,最小为一个时钟周期,这将在上一帧之后复位缩放器模块。接着缩放器可以在数据输入端口读取视频流数据。一旦读取了足够的数据就可以出现在输出端口。输入数据以标准的光栅扫描方式从左上角像素开始向右下角像素扫描读取数据,有效的视频数据能通过缩放器。
控制信号指定哪些输入数据是有效的。
控制信号在系统工作(读写数据)时不能改变,如果改变会破坏一帧的数据输出,控制信号的改变应该在读出完成之后下一帧起始信号出现之前这段时间。
下面以视频图像分辨率放大操作为例阐述视频缩放器工作流程。
3.1数据输入输出
数据输入输出时序波形如图2所示,在start信号之前可由用户逻辑设置控制信号。在帧开始读数据之前,用户逻辑需要置位start信号一个或几个时钟周期。缩放器读行数据直到缓冲区满为止。如果控制信号指定丢弃,则输入数据将在缓冲区填满之前丢弃。读入两行后,就可以在dOut上读到数据。为了避免提前读数据,dOutValid将一直保持低电平,直到数据有效為止。在已处理的帧被读出之后,从缩放器连续读数据是安全的,也不会导致读入额外的数据。
3.2写数据到dIn
写数据到dIn波形如图3所示。用户逻辑用dInValid信号维持有效原始数据。nextdIn是缩放器应答dIn的信号。当nextdIn为高电平且dInValid有效时,用户逻辑改变dIn到下一个值。
3.3从dOut读数据
从dOut读数据波形如图4所示,用户逻辑用nextDout请求从缩放器读出数据。如果RFIFO数据读完,则dOutValid将保持低电平直到缓冲区足够满为止。注意,从请求信号nextDout到数据出现在dOut总线上有4个时钟周期延迟。
3.4输出行切换
在输出视频行末尾,dOutValid将变低一个时钟周期,以允许RFIFO切换RAMs,如果用户逻辑在完成一行读出之后(此时为实际显示时的水平消隐期)使nextdOut低,dOutValid的这个跳跃周期将发生在nextdOut较低期间,不会被用户逻辑捕捉。
如输出视频行的最后像素是D9,则有如图5所示波形。
3.5控制信号
本设计的主要操作由控制信号模块控制。若从较小的Y方向输入分辨率切割,则由inputDiscardCnt设定,而较大的切割通过改变输入到缩放器的数据来完成。inputDiscardCnt像素会读入,但在图像的开始处被丢弃。输入分辨率信号(inputXRes,inputYRes,outputXRes,outputYRes)告知缩放器如何插值及输出像素流。这些值必须设置为像素流分辨率-1。缩放比例通过xScale及yScale控制。视频通过1/xScale和1/yScale放大。
4测试
为了更好地读取和显示raw文件,采用MATLAB进行raw文件与bmp文件转换,以方便对缩放器处理之后的数据进行测试,并查看到由视频缩放器处理之后的图像效果。
测试前先对软件进行例化,以便对不同大小的输入输出图像进行处理。测试软件包括缩放器的例化、部分参数设置、工作时钟产生、raw文件数据的读写等。采用ModelSim软件进行仿真测试,仿真波形如图6所示。
5结语
本設计针对图像处理中的缩放问题,提出了双线性插值和最近邻域插值的图像缩放器结构。系统采用Verilog HDL语言加以实现,经过MATLAB对处理后的数据进行转换,仿真测试采用ModelSim软件实现。测试结果表明该设计思路能满足视频质量要求,具有一定的可移植性,为高清图像视频缩放器的后续研究提供一定的参考价值。
参考文献参考文献:
[1]李然.视频图像缩放算法的研究与实现[D].广州:华南理工大学,2012.
[2]吕荣国,蒋林,杨飞.图像缩放的研究与FPGA设计[J].计算机技术与发展,2011(12):205208.
[3]张洋.基于双线性插值法的图像缩放算法的设计与实现[J].电子设计工程,2016(3):169170.
[4]邓林华,柳光乾.基于插值算法的图像缩放的应用研究[J].微计算机信息,2010(31):2324.
[5]汪颖,陈涛.视频图像缩放的设计及实现[J].电视技术,2004(6):3638.
[6]陈锦华.数字视频信号缩放器的设计及芯片实现[D].上海:复旦大学,2008.
[7]胡小龙,冯彬.基于FPGA的高分辨实时监控图像缩放设计[J].液晶与显示,2009(12):882885 .
责任编辑(责任编辑:杜能钢)