图像缩放的双线性插值原理及DSP下的优化

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图像缩放的双线性插值原理及DSP下的优化

目录

图目录 (3)

1案例描述 (2)

1.1图像缩放模块处理函数的实现方式 (2)

1.2双线性缩放原理 (4)

1.3DSP上的双线性缩放的实现 (8)

1.3.1通用双线性的实现 (8)

1.3.2快速双线性的实现 (10)

2案例分析 (12)

3解决过程 (12)

4解决结果 (12)

5总结 (12)

图目录

图表 1 基本的任意位置缩放效果图 (2)

图表 2 帧格式目的图像的缩放效果图 (2)

图表 3 场格式的目的图像缩放效果图 (3)

图表 4 原始图片 (6)

图表 5 最临近插值放大的效果图 (7)

图表6双线型内插值放大图片 (7)

关键词:

双线性插值dm6446 内联指令YUV格式

摘要:

本文描述了双线性插值的基本原理,同时介绍了其在YUV格式图像缩放中的应用及优化。

1 案例描述

1.1 图像缩放模块处理函数的实现方式

422缩放、420的缩放以及两者之间相互缩放,在Resizer模块中都是采用双线性原理实现的,唯一不同的就是根据图像的格式不同,取数据和拼数据的方式稍有不同,另外在实现缩放的同时也加入了根据用户输入的信息在目的图像周围加上任意颜色的边框的功能。

图像缩放原理示意图如下:

图表1 基本的任意位置缩放效果图

下面是目的图像为帧格式时加边框之后的效果:

图表2 帧格式目的图像的缩放效果图

下面是目的图像为场格式时加边框之后的效果:

图表3 场格式的目的图像缩放效果图

为了提高效率,将相同尺寸的图像直接进行拷贝,所以每种类型的转换都存在拷贝和缩放两类函数。对于源是420的图像,由于Y、U、V分量数据是分段连续的,为了提高效率,对于两倍以内

的缩小及各种尺寸的放大还提供了优化快速算法,快速算法效率为通用算法效率的3/5。

另外,由于本模块的所有算法中,都参考了Stride参数,这样每个模块只需要重点实现帧到帧的拷贝和缩放函数即可,其他类型的转换分别可以通过调用这两个函数即可实现。例如:场到场的转换可以通过调用两次帧到帧即可实现;场到帧,可以也是通过调用两次帧到帧实现,这时只需要在每次调用的时候,将目的图像的Stride改为原来的两倍即可,这时第一场就会放在目的图像的奇数行,第二场图像就会放在目的图像的偶数行;帧到场的转换也类似,将源图像的Stride改为原来的两倍,这样就可以通过,先将源图像的奇数行图像缩放到目的图像的第一场,然后将源图像的偶数行数据放在目的图像的第二场,调用两次帧到帧的缩放即可实现。

1.2 双线性缩放原理

图像的缩放很好理解,就是图像的放大和缩小。传统的绘画工具中,有一种叫做“放大尺”的绘画工具,画家常用它来放大图画。当然,在计算机上,我们不再需要用放大尺去放大或缩小图像了,把这个工作交给程序来完成就可以了。下面就来讲讲计算机怎么来放大缩小图象;在本文中,我们所说的图像都是指点阵图,也就是用一个像素矩阵来描述图像的方法,对于另一种图像:用函数来描述图像的矢量图,不在本文讨论之列。

越是简单的模型越适合用来举例子,我们就举个简单的图像:3X3 的256级灰度图,也就是高为3个象素,宽也是3个象素的图像,每个象素的取值可以是0-255,代表该像素的亮度,255代表最亮,也就是白色,0代表最暗,即黑色。假如图像的象素矩阵如下图所示(这个原始图把它叫做源图,Source):

234 38 22

67 44 12

89 65 63

这个矩阵中,元素坐标(x,y)是这样确定的,x从左到右,从0开始,y从上到下,也是从零开始,这是图象处理中最常用的坐标系,就是这样一个坐标:

---------------------->X

|

|

|

|

|

∨Y

如果想把这副图放大为4X4大小的图像,那么该怎么做呢?那么第一步肯定想到的是先把4X4的矩阵先画出来再说,好了矩阵画出来了,如下所示,当然,矩阵的每个像素都是未知数,等待着我们去填充(这个将要被填充的图的叫做目标图,Destination):

? ? ?

? ? ?

? ? ?

? ? ?

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

结果发现,得到的坐标里面竟然有小数,这可怎么办?计算机里的图像可是数字图像,象素就是最小单位了,象素的坐标都是整数,从来没有小数坐标。这时候采用的一种策略就是采用四舍五入的方法(也可以采用直接舍掉小数位的方法),把非整数坐标转换成整数,好,那么按照四舍五入的方法就得到坐标(1,0),完整的运算过程就是这样的:

(1*0.75,0*0.75)=>(0.75,0)=>(1,0)

那么就可以再填一个象素到目标矩阵中了,同样是把源图中坐标为(1,0)处的像素值38填入目标图中的坐标。

依次填完每个象素,一幅放大后的图像就诞生了,像素矩阵如下所示:

234 38 22 22

67 44 12 12

相关文档
最新文档