1、双线性插值的原理就是根据:
已知两点可以求出直线方程,因此可以求出直线中任意一点;同样在另一条线上可以内插出另一个点;
再根据以上求出的两点求直线方程,内插出所要求得的点。
2、若在matlab中实现双线性插值,则需要注意:
上述公式的x,y坐标的范围为负无穷到正无穷,可为小数。
而对图像双线性插值时,只能为正整数,且不能超过图像的数组范围。
因此,需要将求得的x,y坐标转换到图像坐标中,参考我的另一篇博客:二维图像旋转的坐标公式推导。(需要注意的是,图像坐标转换后,图像中的线的角度没有发生变化。)
关于坐标转换,就是将数学坐标转换成图像坐标,代码:
x1=x+0.5*N; % 此时x1,y1可能不是整数,但一定是正数。
y1=-y+0.5*N;
3.若是对图像上非整数位置(坐标)进行双线性插值,则需要:坐标转换–>边界处理–>双线性插值。
关于边界处理,指的是:如果求出的坐标超过了数组(图像)的范围,则要将其赋为最近的值。
为什么下面将大于N的赋值为N-1,而不是N,是因为,双线性插值的公式中,会取插值点最近的4个点,将x1,y1分别加了1(看下面双线性插值代码),所以赋值为N时会超出数组范围。
x1(x1<1)=1; %防止有的数据为小于1的数,取整之后为0,而数组索引必须为正整数或逻辑值。
y1(y1<1)=1;
x1(x1>N)=N-1;
y1(y1>N)=N-1;
在双线性插值时,由于求出的坐标x1,y1是基于图像坐标系的,而行列号与此相反,因此,双线性插值中的行为y1,列为x1,颠倒一下位置即可。
可以参照下图运算。
以一个点进行双线性插值为例子
point=m(floor(y1),floor(x1)).*(1-u).*(1-v)+...
m(floor(y1),floor(x1)+1).*u.*(1-v)+...
m(floor(y1)+1,floor(x1)).*(1-u).*v+...
m(floor(y1)+1,floor(x1)+1).*u.*v;
此处u,v分别为x1,y1的余数。