图像缩放算法较多,下面仅以最邻近插值算法和双线性插值算法作介绍。
如下图1所示,表示原始图像和缩放以后的图像。
图1 图像缩放(原始图像à缩放图像)
图像缩放就是将原始图像中的点经过某一算法映射到目标图像的点的行为,即要找到目标图像中的点p1对应在原始图像中点p0,简单而言就是找点p0。
假设:
- 原始图像src的分辨率为(srcW * srcH);
- 目标图像dst的分辨率为(dstW * dstH)。
那么:
原始图像宽与目标图像宽的比例
原始图像高与目标图像高的比例
由
所以,原始图像中的点p0的坐标求出分别为x0, y0(可能含有小数)。
最邻近插值
原理
由上述推导过程可以求得原始图像中的点p0(x0, y0),但是,在此过程可以看出,该点的坐标值可能含有小数,所以,我们必须采取一定方法(如:四舍五入)来舍弃小数部分,从而取得整数表示的像素点坐标, 该过程即为最邻近插值方法。
优缺点
最邻近插值简单且直观,但得到的图像质量不高,特别在图像放大后可能产生明显锯齿。
双线性插值
原理
如图2所示,最邻近插值是当求得p0后,直接找其邻近的点p1, p2, p3, p4中的一个的像素值作为目标点的像素;而双线性插值,则是根据p0点与周围4点(p1, p2, p3, p4)距离关系计算目标点的像素值。
图2 双线性插值坐标图示
通过计算得到的原始点为p0(x0, y0),则其4周的点分别为:
x0的可能取值为:sx1 = (int)x0, sx2 = sx1 + 1
y0的可能取值为:sy1 = (int)y0, sy2 = sy1 + 1
图2中:
s1 = y0 – sy1
s2 = sx2 – x0
s3 = 1.0 – s1
s4 = 1.0 – s2
假设p1, p2, p3, p4的像素值分别为v1, v2, v3, v4,
则双线性插值计算p0点像素值v0公式为:
v0 = v1*s1*s4 + v2*s1*s2 + v3*s2*s3 + v4*s3*s4
优缺点
- 双线性内插值法计算量大,但缩放后图像质量高,不会出现像素值不连续的的情况。
- 双线性插值具有低通滤波器的性质,使高频分量受损,所以可能会使图像轮廓在一定程度上变得模糊。
三次卷积法
原理
在双线性插值中,考虑计算得到的点p0(x0, y0)周围4个点的距离关系来取得像素值;而在三次卷积法中,考虑点p0(x0, y0)的周围的16邻点。
假设:
由上述计算得到的点p0(x0, y0)的像素值表示为
其中:
i为x0整数部分,u为x0的小数部分;
j为y0的整数部分,v为y0的小数部分。
则可表示为:
其中:
S(x)是对的逼近(pi是圆周率—π)
优缺点
三次卷积法能够克服最邻近插值和双线性插值两种算法的不足,计算精度高,但计算亮大。