5.11 双线性插值的图像缩放算法的研究与实现
一、引言
数字图像处理的对象因其涉及到社会的各个领域,倍受到越来越多的关注,而图像缩放作为数
字图像处理中的基本操作尤为重要,在社会的很多领域都需要对图像进行放大和缩小。利用 VC++的
MFC 类库中的 StretchBlt 函数可以很容易的实现图像放大和缩小,但是当放大或缩小的比率比较大
时就容易出现失真现象,因此必须进行改进。本文提出了一种双线性插值算法,用以改进图像的缩
放质量。
二、空间变换
图像的空间变换,也称几何变换或几何运算,包括图像的平移、旋转、镜像变换、转置、缩放
等。几何运算可改变图像中各物体之间的空间关系,这种运算可以被看成是将各物体在图像内移动。
空间变换可如下表示:设(u,v)为源图像上的点,(x,y)为目标图像上的点,则空间变换就是将
源图像上(u,v)处的颜色值与目标图像上(x,y)处的颜色对应起来。
(u,v) ---------------- (x,y)
并具有以下关系:
x=X(u,v),y=Y(u,v) (即由(u,v)计算对应点(x,y) ) (1.1)
或
u=U(x,y),v=V(x,y) (即由(x,y)反求对应点(u,v) )(1.2)其中 X(u,v)、Y(u,v)、U(x,
y)、V(x,y)均为变换。由(1.1)对应的变换称作向前映射法也叫像素移交法,而由(1.2)对应的变换
称作向后映射法也叫像素填充法,向后映射法是向前映射法的逆。
对于向前映射法来说,由于许多输入像素可能映射到输出图像的边界之外,所以,向前映射法
有些浪费,而且每个输出像素的灰度值可能要由许多输入像素的灰度值来决定,因此要涉及多次运
算。如果空间变换中包括缩小处理,则会有四个以上的输入像素来决定输出像素的灰度值;如果含
有放大处理,则一些输出像素可能被漏掉。而向后映射算法是逐像素、逐行地产生输出图像。每个
像素的灰度级由最多四个像素参与的插值所惟一确定,虽然向后映射法比向前映射法要复杂,但是
向后映射法对于一般的应用却具有更为现实的意义。本文就是采取了向后映射法来实现图像缩放的。
三.双线性插值
最简单的插值算法是最邻近插值,也称为零阶插值。它输出的像素灰度值就等于距离它映射到的
位置最近的输入像素的灰度值,最邻近插值算法简单,在许多情况下都能得到令人满意的结果,但
是当图像中包含像素之间灰度级有变化的细微结构时,最邻近算法会在图像中产生人为加工的痕迹。
双线性插值算法计算量比零阶插值大,但缩放后图像质量高,不会出现像素值不连续的情况,这样
就可以获得一个令人满意的结果。
双线性插值是利用了需要处理的原始图像像素点周围的四个像素点的相关性,通过双线性算法计
算得出的。对于一个目的坐标,通过向后映射法得到其在原始图像的对应的浮点坐标(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) ×v×f(i,j+1)+u×(1-v) ×f(i+1,j)+u×v×f(i+1,j+1),
其中 f(i,j)表示源图像(i,j)处的像素值,以此类推,这就是双线性内插值法。
如图 1 所示,已知(0,0)、(0,1)、(1,0)、(1,1)四点的灰度,可以由相邻像素的灰度值 f(0,0)和
f(1,0) 在 X 方向上线性插值求出(x,0)的灰度 f(x,0),由另外两个相邻像素 f(0,1)和 f(1,1)在 X 方
向上线性插值可求出(x,1)的灰度 f(x,1),最后由 f(x,0)、f(x,1)在 Y 方向上进行线性插值就可以得
到(x,y)的灰度 f(x,y)。
评论1