文章目录
一.双线性插值
假设源图像大小为mxn,目标图像为axb。那么两幅图像的边长比分别为:m/a和n/b。注意,通常这个比例不是整数,编程存储的时候要用浮点型。目标图像的第(i,j)个像素点(i行j列)可以通过边长比对应回源图像。其对应坐标为(im/a,jn/b)。显然,这个对应坐标一般来说不是整数,而非整数的坐标是无法在图像这种离散数据上使用的。双线性插值通过寻找距离这个对应坐标最近的四个像素点,来计算该点的值(灰度值或者RGB值)。如果你的对应坐标是(2.5,4.5),那么最近的四个像素是(2,4)、(2,5)、(3,4),(3,5)。
-
单线性插值
已知中P1点和P2点,坐标分别为(x1, y1)、(x2, y2),要计算 [x1, x2] 区间内某一位置 x 在直线上的y值根据初中的知识,2点求一条直线公式(这是双线性插值所需要的唯一的基础公式:
y − y 1 x − x 1 = y 2 − y 1 x 2 − x 1 \frac{y-y_{1}}{x-x_{1}}=\frac{y_{2}-y_{1}}{x_{2}-x_{1}} x−x1y−y1=x2−x1y2−y1
经过简单整理成下面的格式:
y = x 2 − x x 2 − x 1 y 1 + x − x 1 x 2 − x 1 y 2 y=\frac{x_{2}-x}{x_{2}-x_{1}} y_{1}+\frac{x-x_{1}}{x_{2}-x_{1}} y_{2} y=x2−x1x2−xy1+x2−x1x−x1y2
这里没有写成经典的AX+B的形式,因为这种形式从权重的角度更好理解。
首先看分子,分子可以看成x与x1和x2的距离作为权重,这也是很好理解的,P点与P1、P2点符合线性变化关系,所以P离P1近就更接近P1,反之则更接近P2。
现在再把公式中的分式看成一个整体,原式可以理解成y1与y2是加权系数,如何理解这个加权,要返回来思考一下,咱们先要明确一下根本的目的:咱们现在不是在求一个公式,而是在图像中根据2个点的像素值求未知点的像素值。这样一个公式是不满足咱们写代码的要求的。
现在根据实际的目的理解,就很好理解这个加权了,y1与y2分别代表原图像中的像素值,上面的公式可以写成如下形式:
f
(
P
)
=
x
2
−
x
x
2
−
x
1
f
(
P
1
)
+
x
−
x
1
x
2
−
x
1
f
(
P
2
)
f(P)=\frac{x_{2}-x}{x_{2}-x_{1}} f\left(P_{1}\right)+\frac{x-x_{1}}{x_{2}-x_{1}} f\left(P_{2}\right)
f(P)=x2−x1x2−xf(P1)+x2−x1x−x1f(P2)
2. 双线性插值
已知Q11(x1,y1)、Q12(x1,y2)、Q21(x2,y1)、Q22(x2,y2),求其中点P(x,y)的值。
前面介绍过双线性插值是分别在两个方向计算了共3次单线性插值,如图所示,先在x方向求2次单线性插值,获得R1(x, y1)、R2(x, y2)两个临时点,再在y方向计算1次单线性插值得出P(x, y)(实际上调换2次轴的方向先y后x也是一样的结果)。
-
x方向单线性插值 直接带入前一步单线性插值最后的公式
f ( R 1 ) = x 2 − x x 2 − x 1 f ( Q 11 ) + x − x 1 x 2 − x 1 f ( Q 21 ) f ( R 2 ) = x 2 − x x 2 − x 1 f ( Q 12 ) + x − x 1 x 2 − x 1 f ( Q 22 ) f\left(R_{1}\right)=\frac{x_{2}-x}{x_{2}-x_{1}} f\left(Q_{11}\right)+\frac{x-x_{1}}{x_{2}-x_{1}} f\left(Q_{21}\right) \\ f\left(R_{2}\right)=\frac{x_{2}-x}{x_{2}-x_{1}} f\left(Q_{12}\right)+\frac{x-x_{1}}{x_{2}-x_{1}} f\left(Q_{22}\right) f(R1)=x2−x1x2−xf(Q11)+x2−x1x−x1f(Q21)f(R2)=x2−x1x2−xf(Q12)+x2−x1x−x1f(Q22)
-
y方向单线性插值
f ( P ) = y 2 − y y 2 − y 1 f ( R 1 ) + y − y 1 y 2 − y 1 f ( R 2 ) f(P)=\frac{y_{2}-y}{y_{2}-y_{1}} f\left(R_{1}\right)+\frac{y-y_{1}}{y_{2}-y_{1}} f\left(R_{2}\right) f(P)=y2−y1y2−yf(R1)+y2−y1y−y1f(R2)
将第一步结果带入第二步
f ( x , y ) = f ( Q 11 ) ( x 2 − x 1 ) ( y 2 − y 1 ) ( x 2 − x ) ( y 2 − y ) + f ( Q 21 ) ( x 2 − x 1 ) ( y 2 − y 1 ) ( x − x 1 ) ( y 2 − y ) + f ( Q 12 ) ( x 2 − x 1 ) ( y 2 − y 1 ) ( x 2 − x ) ( y − y 1 ) f(x, y)=\frac{f\left(Q_{11}\right)}{\left(x_{2}-x_{1}\right)\left(y_{2}-y_{1}\right)}\left(x_{2}-x\right)\left(y_{2}-y\right)+\frac{f\left(Q_{21}\right)}{\left(x_{2}-x_{1}\right)\left(y_{2}-y_{1}\right)}\left(x-x_{1}\right)\left(y_{2}-y\right)+\frac{f\left(Q_{12}\right)}{\left(x_{2}-x_{1}\right)\left(y_{2}-y_{1}\right)}\left(x_{2}-x\right)\left(y-y_{1}\right) f(x,y)=(x2−x1)(y2−y1)f(Q11)(x2−x)(y2−y)+(x2−x1)(y2−y1)f(Q21)(x−x1)(y2−y)+(x2−x1)(y2−y1)f(Q12)(x2−x)(y−y1)
回顾一下上面双线性插值对应关系的图,不难发现,在计算中有这样的关系:
x 2 = x 1 + 1 ; y 2 = y 1 + 1 x_{2}=x_{1}+1 ; y_{2}=y_{1}+1 x2=x1+1;y2=y1+1
那么上面的公式中的分母全都为0,如下:
f ( x , y ) = f ( Q 11 ) ( x 2 − x ) ( y 2 − y ) + f ( Q 21 ) ( x − x 1 ) ( y 2 − y ) + f ( Q 12 ) ( x 2 − x ) ( y − y 1 ) + f ( Q 22 ) ( x − x 1 ) ( y − y 1 ) f(x, y)=f\left(Q_{11}\right)\left(x_{2}-x\right)\left(y_{2}-y\right)+f\left(Q_{21}\right)\left(x-x_{1}\right)\left(y_{2}-y\right)+f\left(Q_{12}\right)\left(x_{2}-x\right)\left(y-y_{1}\right)+f\left(Q_{22}\right)\left(x-x_{1}\right)\left(y-y_{1}\right) f(x,y)=f(Q11)(x2−x)(y2−y)+f(Q21)(x−x1)(y2−y)+f(Q12)(x2−x)(y−y1)+f(Q22)(x−x1)(y−y1)
在有些资料中,会写成权重的形式,上面的展开式是下面的权重表达式的正确求法
f ( x , y ) = f ( Q 11 ) w 11 + f ( Q 21 ) w 21 + f ( Q 12 ) w 12 + f ( Q 22 ) w 22 f(x, y)=f\left(Q_{11}\right) w_{11}+f\left(Q_{21}\right) w_{21}+f\left(Q_{12}\right) w_{12}+f\left(Q_{22}\right) w_{22} f(x,y)=f(Q11)w11+f(Q21)w21+f(Q12)w12+f(Q22)w22
这种权重的表达式也不难理解,观察一下可以发现每个点的权重都和待求点和对角点的距离有关,比如
3.双线性插值的优化
原始公式:
src − x = des − x ∗ src − w / des − w \operatorname{src}{-}x=\operatorname{des}{-}x * \operatorname{src}{-}w / \operatorname{des}{-}w\ src−x=des−x∗src−w/des−w
src − y = des − y ∗ src − h / des − h \operatorname{src}{-}y=\operatorname{des}{-}y * \operatorname{src}{-}h / \operatorname{des}{-}h src−y=des−y∗src−h/des−h