算法之线性插值原理



线性插值法是根据已知两项有关的对应关系资料估算第三项对应的未知资料。

什么是线性插值原理,什么是双线性插值

简单比方,原来的数值序列:0,10,20,30,40

线性插值一次为:0,5,10,15,20,25,30,35,40

即认为其变化(增减)是线形的,可以在坐标图上画出一条直线

在数码相机技术中,这些数值可以代表组成一张照片的不同像素点的色彩、色度等指标。

为了方便理解,先考虑一维情况下的线性插值

对于一个数列c,我们假设c[a]到c[a+1]之间是线性变化的

那么对于浮点数x(a<=x

把这种插值方式扩展到二维情况:

对于一个二维数组c,我们假设对于任意一个浮点数i,c(a,i)到c(a+1,i)之间是线性变化的,c(i,b)到c(i,b+1)之间也是线性变化的(a,b都是整数) ,那么对于浮点数的坐标(x,y)满足(a<=x

c(x,b) = c[a+1][b]*(x-a)+c[a][b]*(1+a-x);

c(x,b+1) = c[a+1][b+1]*(x-a)+c[a][b+1]*(1+a-x);

好,现在已经知道c(x,b)和c(x,b+1)了,而根据假设c(x,b)到c(x,b+1)也是线性变化的,所以:

c(x,y) = c(x,b+1)*(y-b)+c(x,b)*(1+b-y)

这就是双线性插值。

    在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。

另一种表示方法:但增加了浮点运算,速度变慢

对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(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)
其中f(i,j)表示源图像(i,j)处的的像素值,以此类推
  这就是双线性内插值法。双线性内插值法计算量大,但缩放后图像质量高,不会出现像素值不连续的的情况。由于双线性插值具有低通滤波器的性质,使高频分量受损,所以可能会使图像轮廓在一定程度上变得模糊

编程实现时:

//先垂直方向线性插值,int array[2][2]=原图像中坐标为 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值

 t1 = (1-v)*array[0][0] + v*array[1][0];
       t2 = (1-v)*array[0][1] + v*array[1][1];

 //再水平方向线性插值
       float t=(int)((1-u)*t1 + u*t2);

 

优化:

一般来说,Su,Sv可以表示成分数的形式:

Su = ( double )Dw / Sw; Sv = ( double )Dh / Sh

  其中Dw, Dh为目标图像的宽度和高度,Sw, Sh为源图像的宽度和高度(因为都是整数,为求得浮点结果,需要进行类型转换)。

  将新的Su, Sv代入前面的变换公式和插值公式,可以导出新的插值公式:(m=u;n=v)

因为:

m = 1 – x * Sw % Dw / ( double )Dw; n = 1 – y * Sh % Dh / ( double )Dh

设:

M = Dw – x * Sw % Dw; N = Dh – y * Sh % Dh

则:

m = B / ( double )Dw; n = N / ( double )Dh

你可能感兴趣的:(算法的乐趣)