图像缩放的双线性插值原理及DSP下的优化_第1页
图像缩放的双线性插值原理及DSP下的优化_第2页
图像缩放的双线性插值原理及DSP下的优化_第3页
图像缩放的双线性插值原理及DSP下的优化_第4页
图像缩放的双线性插值原理及DSP下的优化_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、图像缩放的双线性插值原理及DSP下的优化目录图目录31案例描述21.1图像缩放模块处理函数的实现方式21.2双线性缩放原理41.3DSP上的双线性缩放的实现81.3.1通用双线性的实现81.3.2快速双线性的实现102案例分析123解决过程124解决结果125总结12 图目录图表 1 基本的任意位置缩放效果图2图表 2 帧格式目的图像的缩放效果图2图表 3 场格式的目的图像缩放效果图3图表 4 原始图片7图表 5 最临近插值放大的效果图7图表 6双线型内插值放大图片7 关键词:双线性插值 dm6446 内联指令 YUV格式摘 要:本文描述了双线性插值的基本原理,同时介绍了其在YUV格式图像缩放

2、中的应用及优化。1 案例描述1.1 图像缩放模块处理函数的实现方式422缩放、420的缩放以及两者之间相互缩放,在Resizer模块中都是采用双线性原理实现的,唯一不同的就是根据图像的格式不同,取数据和拼数据的方式稍有不同,另外在实现缩放的同时也加入了根据用户输入的信息在目的图像周围加上任意颜色的边框的功能。图像缩放原理示意图如下:图表 1 基本的任意位置缩放效果图下面是目的图像为帧格式时加边框之后的效果:图表 2 帧格式目的图像的缩放效果图下面是目的图像为场格式时加边框之后的效果:图表 3 场格式的目的图像缩放效果图为了提高效率,将相同尺寸的图像直接进行拷贝,所以每种类型的转换都存在拷贝和缩

3、放两类函数。对于源是420的图像,由于Y、U、V分量数据是分段连续的,为了提高效率,对于两倍以内的缩小及各种尺寸的放大还提供了优化快速算法,快速算法效率为通用算法效率的3/5。另外,由于本模块的所有算法中,都参考了Stride参数,这样每个模块只需要重点实现帧到帧的拷贝和缩放函数即可,其他类型的转换分别可以通过调用这两个函数即可实现。例如:场到场的转换可以通过调用两次帧到帧即可实现;场到帧,可以也是通过调用两次帧到帧实现,这时只需要在每次调用的时候,将目的图像的Stride改为原来的两倍即可,这时第一场就会放在目的图像的奇数行,第二场图像就会放在目的图像的偶数行;帧到场的转换也类似,将源图像的

4、Stride改为原来的两倍,这样就可以通过,先将源图像的奇数行图像缩放到目的图像的第一场,然后将源图像的偶数行数据放在目的图像的第二场,调用两次帧到帧的缩放即可实现。1.2 双线性缩放原理图像的缩放很好理解,就是图像的放大和缩小。传统的绘画工具中,有一种叫做“放大尺”的绘画工具,画家常用它来放大图画。当然,在计算机上,我们不再需要用放大尺去放大或缩小图像了,把这个工作交给程序来完成就可以了。下面就来讲讲计算机怎么来放大缩小图象;在本文中,我们所说的图像都是指点阵图,也就是用一个像素矩阵来描述图像的方法,对于另一种图像:用函数来描述图像的矢量图,不在本文讨论之列。越是简单的模型越适合用来举例子,

5、我们就举个简单的图像:3X3 的256级灰度图,也就是高为3个象素,宽也是3个象素的图像,每个象素的取值可以是 0255,代表该像素的亮度,255代表最亮,也就是白色,0代表最暗,即黑色 。假如图像的象素矩阵如下图所示(这个原始图把它叫做源图,Source):234   38    2267     44    1289     65    63这个矩阵中,元素坐标(x,y)是这样确定的,x从左到

6、右,从0开始,y从上到下,也是从零开始,这是图象处理中最常用的坐标系,就是这样一个坐标:  -X  |  |  |  |  |Y如果想把这副图放大为 4X4大小的图像,那么该怎么做呢?那么第一步肯定想到的是先把4X4的矩阵先画出来再说,好了矩阵画出来了,如下所示,当然,矩阵的每个像素都是未知数,等待着我们去填充(这个将要被填充的图的叫做目标图,Destination):?        ?  &#

7、160;     ?       ?        ?        ?       ?        ?        ?   

8、    ?        ?        ?       ?   然后要往这个空的矩阵里面填值了,要填的值从哪里来呢?是从源图中来。好,先填写目标图最左上角的象素,坐标为(0,0),那么该坐标对应源图中的坐标可以由如下公式得出:  srcX=dstX* (srcWidth/dstWidth) , srcY = dst

9、Y * (srcHeight/dstHeight)好了,套用公式,就可以找到对应的原图的坐标了(0*(3/4),0*(3/4)=>(0*0.75,0*0.75)=>(0,0),找到了源图的对应坐标,就可以把源图中坐标为(0,0)处的234象素值填进去目标图的(0,0)这个位置了。接下来,如法炮制,寻找目标图中坐标为(1,0)的象素对应源图中的坐标,套用公式:(1*0.75,0*0.75)=>(0.75,0)结果发现,得到的坐标里面竟然有小数,这可怎么办?计算机里的图像可是数字图像,象素就是最小单位了,象素的坐标都是整数,从来没有小数坐标。这时候采用的一种策略就是采用四舍五入的

10、方法(也可以采用直接舍掉小数位的方法),把非整数坐标转换成整数,好,那么按照四舍五入的方法就得到坐标(1,0),完整的运算过程就是这样的:(1*0.75,0*0.75)=>(0.75,0)=>(1,0)那么就可以再填一个象素到目标矩阵中了,同样是把源图中坐标为(1,0)处的像素值38填入目标图中的坐标。依次填完每个象素,一幅放大后的图像就诞生了,像素矩阵如下所示:234    38     22     22  67      44  

11、;   12     12  89      65     63     63  89      65     63     63   这种放大图像的方法叫做最临近插值算法,这是一种最基本、最简单的图像缩放算法,效果也是最不好的,放大后的图像有很严重的马赛克,缩小后的图像有很严重的失真;效果不好的根

12、源就是其简单的最临近插值方法引入了严重的图像失真,比如,当由目标图的坐标反推得到的源图的坐标是一个浮点数的时候,采用了四舍五入的方法,直接采用了和这个浮点数最接近的象素的值,这种方法是很不科学的,当推得坐标值为 0.75的时候,不应该就简单的取为1,既然是0.75,比1要小0.25 ,比0要大0.75 ,那么目标象素值其实应该根据这个源图中虚拟的点四周的四个真实的点来按照一定的规律计算出来的,这样才能达到更好的缩放效果。双线型内插值算法就是一种比较好的图像缩放算法,它充分的利用了源图中虚拟点四周的四个真实存在的像素值来共同决定目标图中的一个像素值,因此缩放效果比简单的最邻近插值要好很多。双线性

13、内插值算法描述如下:对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+u,j+v) (其中i、j均为浮点坐标的整数部分,u、v为浮点坐标的小数部分,是取值0,1)区间的浮点数),则这个像素得值 f(i+u,j+v) 可由原图像中坐标为 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)        

14、60;                 公式1其中f(i,j)表示源图像(i,j)处的的像素值,以此类推。比如,象刚才的例子,现在假如目标图的象素坐标为(1,1),那么反推得到的对应于源图的坐标是(0.75 , 0.75), 这其实只是一个概念上的虚拟象素,实际在源图中并不存在这样一个象素,那么目标图的象素(1,1)的取值不能够由这个虚拟象素来决定,而只能由源图的这四个象素共同决定:(0,0)(0,1)(1,0)(1,1),而由于(0.

15、75,0.75)离(1,1)要更近一些,那么(1,1)所起的决定作用更大一些,这从公式1中的系数uv=0.75×0.75就可以体现出来,而(0.75,0.75)离(0,0)最远,所以(0,0)所起的决定作用就要小一些,公式中系数为(1-u)(1-v)=0.25×0.25也体现出了这一特点;最邻近插值和双向性内插值缩放图片的效果对比:图表 4 原始图片图表 5 最临近插值放大的效果图图表 6双线型内插值放大图片由上面两幅放大之后的图像效果可见双线性插值相对于临近点复制,图像质量还是有比较明显的改进。1.3 DSP上的双线性缩放的实现1.3.1 通用双线性的实现上面的原理介绍中

16、,实现上是采用浮点数的方式实现的,这种方式并不适合在DSP上实现,为了便于在DSP上实现,在实现中,采用了将浮点数进行定点化的方式实现,目的图像的整数点位置由32位数的高16位表示,小数位置由32位数的低16位实现,这里为了便于优化并保证不溢出,根据人眼区分的尺度大概在1/2个像素左右,这里只取了小数位的高三位,也即精确到0.125位置。具体实现方法如下:每次对于XY的步进值如此计算得到:u32XStride = (l32SrcWidth - 1) << 16) / (l32DstWidth - 1);u32YStride = (l32SrcHeight - 1) <<

17、 16) / (l32DstHeight - 1);每次循环都会加上上面的步进值:u32YPosition += u32YStride;u32Ysrc = u32YPosition >>16;u32WY2 = _extu(u32YPositionTmp, 16, 29);u32WY1 = 8 - u32WY2Tmp;上面的u32Ysrc就是源图像中的整数位置,u32WY1就是第一行数据的权重,u32WY2就是第二行数据的权重,对于X方向的整数位置和权重也是类似的方法得到:u32XPosition += u32XStride; u32Xsrc = u32XPosition >&

18、gt; 16; u32WX2 = _extu(u32XPosition, 16, 29);u32WX1 = 8 - u32WX2;对于上面的权重采用如下的打包方式: /0 1 2 3u32WY1 = _pack2(u32WY1, u32WY1); /Y1 0 Y1 0u32WY2 = _pack2(u32WY2, u32WY2); /Y2 0 Y2 0u32WY1 = _packl4(u32WY2, u32WY1);/Y1 Y1 Y2 Y2X方向类似:/ 0 1 2 3u32WX1 = _pack2(u32WX2, u32WX1); / X1 0 X2 0u32WX1 = _packl4(u3

19、2WX1, u32WX1);/ X1 X2 X1 X2将XY综合打包如下:d64Weight = _mpyu4(u32WX1, u32WY1);/ X1*Y1 0 X2*Y1 0/ X1*Y2 0 X2*Y2 0u32Weight3210 = _packl4(_hi(d64Weight), _lo(d64Weight);/ X1*Y1 X2*Y1 X1*Y2 X2*Y2这样就得到原理中的四个系数,与取得的四个点数据相乘即可得到最终的双线性插值结果:/得到源图目标映射点周围4点u32V10 = _mem4(pu8SrcLine1 + u32Xsrc);u32V32 = _mem4(pu8SrcL

20、ine2 + u32Xsrc);u32v3210 = _pack2(u32V32, u32V10);/权加求目标值u32Res = _dotpu4(u32v3210, u32Weight3210);*pu8Dst+ = (u32Res >> 6);至此得到目的图像的一点数据,其余类似。对于420格式的图像和422格式的图像,区别主要时在数据排列上不同,因此,主要是打包和组包的方式不同,另外,对于422图像,由于是YUV数据时交叉在一起的,所以,一组循环尽量把YUV数据一起处理,才能保证够高效。1.3.2 快速双线性的实现对于420图像的快速算法,是利用尽量减少数据读取而优化下来的,

21、由于核心循环的瓶颈其实是在数据读写上面,计算单元其实还有很大空余,上面一次读取四点数据,当缩放比例在两倍或者两倍以内的时候,上面一次读取的数据至少可以供两次计算使用,利用这个规律,我们采用数据不动,移动对应系数的方式来减少数据读取,同时利用行权重在一行中不变的特性,一次出两行的两点数据。具体实现方式如下:Y的两行权重的计算方法:u32YPosition += u32YStride;u32WY1 = _extu(u32YPosition, 16, 29);u32WY2 = 8 - u32WY1;u32WeightY1 = _pack2(u32WY1, u32WY2);u32YPosition +

22、= u32YStride;u32WY1 = _extu(u32YPositionTmp, 16, 29);u32WY2 = 8 - u32WY1;u32WeightY2 = _pack2(u32WY1, u32WY2);X方向的权重值计算方法如下:u32XPosition += u32XStride;u32WX2 = _extu(u32XPosition, 16, 29);u32WX1 = 8 - u32WX2;u32WeightX1 = (u32WX2 << 8) | u32WX1;取一次源数据:/得到源图目标映射点周围4点u32SrcLine1Tmp = _mem4(pu8Sr

23、cLine1 + u32XSrc);u32SrcLine2Tmp = _mem4(pu8SrcLine2 + u32XSrc);u32SrcLine3Tmp = _mem4(pu8SrcLine3 + u32XSrc);u32SrcLine4Tmp = _mem4(pu8SrcLine4 + u32XSrc);u32VTemp1 = _pack2(_dotpu4(u32SrcLine2Tmp, u32WeightX1),_dotpu4(u32SrcLine1Tmp, u32WeightX1);u32CTemp1 = _pack2(_dotpu4(u32SrcLine4Tmp, u32WeightX1), _dotpu4(u32SrcLine3Tmp, u32WeightX1);步进到X方向的第二点,并计算第二点的权重:u32XSrc2 = u32XPosition >> 16;u32WX2 = _extu(u32XPosition, 16, 29);u32WX1 = 8 - u32WX2;u32WeightX2 = (u32WX2 << 8) | u

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论