假设有一副图像A,像素为 m×n。如果要将其缩放为原来的a倍变成图像B,其像素为 a*m×a*n=M×N(*代表乘法运算),将会涉及到插值的问题,常见的插值方法有三种最邻近插值、双线性插值、双立方插值。
一、最邻近插值
如图,假设原始图像A为 4×4 的像素,缩放后的图像B为 3×3 的像素。其中A中每个像素块的值我们都已经知道,而B中每个像素块的值都不知道,只要利用图像A求出B中每个像素块的值,我们的工作就完成了。可以一个 一个 的来求,假 如要先求B中第1行,第2列的像素块值的大小 g(1,2) 的话。对于最邻近插值话很简单,找到A图像中某一个像素块的值直接给B就行,重要的是找出要把A中哪一个像素块的值给 g(1,2)。就是用下面的求法。(g(x,y)为B图像中(x,y)处的像素值,f(x,y)为A图像中(x,y)处的像素值)
直接四舍五入得
所以只要把A图像中第1行第3列的像素块的值赋值给B图像中第1行第2列的像素块即可,通过这种方式可以求出图像B中所有像素块的值。
推广到一般情况
为求B图像中位于(x,y)处的像素值,则有
a为缩放倍数,m×n为原始图像大小,M×N为缩放后图像大小
当然如果所求结果不是整数直接四舍五入就好。
双线性插值
对于最邻近插值还可以这样理解,看下图。由可以得到,图像B中的点(x,y)对应于图像A中的,假设就是下图中的H点。所谓最邻近插值,就是说图像B中(x,y)点的像素值只和离H点(H点是在图像A中)最近的像素点的值有关,也就是点(i,j)处的像素值。
而双线性插值呢,它不仅仅只是和离H点最近的像素点的值有关,而是和H点周围的4个像素点的值都有关。这4个像素点也就是(i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)。具体进行双线性插值的步骤:
1、先进行水平方向的插值,也就是利用上图中(i,j)和(i+1,j)两点的像素值求出X点的像素值;利用(i,j+1)和(i+1,j+1)两点的像素值求出Y点的像素值。(点X、Y、H在一条竖线上,即横坐标相同)
2、再进行竖直方向上的插值,也就是利用X、Y两点的像素值求出H点的像素值,也就是我们要求的图像B中(x,y)处的像素值。这应该也是为什么这种插值方法叫作双线性插值的原因了吧。
我们首先要把H点的坐标写成这这种形式(i+u,j+v),其中i、j是整数(i,j也代表图像A中的第几个像素点);u、v是小数。至于H点坐标怎么求前面说过。分别把X、Y、H点的像素值记作、、;同理、、、g(i分别代表相应四个位置的像素值。
当然,你也可以把,代入第三个式子得到一个计算公式。(*代表乘法运算)
还可以拿最开始的那个简单例子来计算一下,要求图像B中第1行第2列位置处的像素值。通过可以得到H点的坐标为(1+0.33,2+0.66),所以就是你懂得。太简单懒得写,反正记住f(x,y)是已知的,当然这里的x、y都是整数。最后求出的也就是我们要找的图像B中第1行第2列位置处的像素值。
双立方插值
未完,待续