线性插值法是根据已知两项有关的对应关系资料估算第三项对应的未知资料。编程
什么是线性插值原理,什么是双线性插值数组
简单比方,原来的数值序列:0,10,20,30,40函数
线性插值一次为:0,5,10,15,20,25,30,35,40优化
即认为其变化(增减)是线形的,能够在坐标图上画出一条直线spa
在数码相机技术中,这些数值能够表明组成一张照片的不一样像素点的色彩、色度等指标。数学
为了方便理解,先考虑一维状况下的线性插值变量
对于一个数列c,咱们假设c[a]到c[a+1]之间是线性变化的原理
那么对于浮点数x(a<=x<a+1),c(x)=c[a+1]*(x-a)+c[a]*(1+a-x);扩展
把这种插值方式扩展到二维状况:float
对于一个二维数组c,咱们假设对于任意一个浮点数i,c(a,i)到c(a+1,i)之间是线性变化的,c(i,b)到c(i,b+1)之间也是线性变化的(a,b都是整数) ,那么对于浮点数的坐标(x,y)知足(a<=x<a+1,b<=y<b+1),咱们能够先分别求出c(x,b)和c(x,b+1):
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