双线性插值(Bilinear Interpolation)

一.双线性插值

假设源图像大小为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)。

  1. 单线性插值
    已知中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}} xx1yy1=x2x1y2y1

经过简单整理成下面的格式:

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=x2x1x2xy1+x2x1xx1y2

这里没有写成经典的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)=x2x1x2xf(P1)+x2x1xx1f(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也是一样的结果)。

  1. 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)=x2x1x2xf(Q11)+x2x1xx1f(Q21)f(R2)=x2x1x2xf(Q12)+x2x1xx1f(Q22)

  2. 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)=y2y1y2yf(R1)+y2y1yy1f(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)=(x2x1)(y2y1)f(Q11)(x2x)(y2y)+(x2x1)(y2y1)f(Q21)(xx1)(y2y)+(x2x1)(y2y1)f(Q12)(x2x)(yy1)

回顾一下上面双线性插值对应关系的图,不难发现,在计算中有这样的关系:

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)(x2x)(y2y)+f(Q21)(xx1)(y2y)+f(Q12)(x2x)(yy1)+f(Q22)(xx1)(yy1)

在有些资料中,会写成权重的形式,上面的展开式是下面的权重表达式的正确求法

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\ srcx=desxsrcw/desw 

src ⁡ − y = des ⁡ − y ∗ src ⁡ − h / des ⁡ − h \operatorname{src}{-}y=\operatorname{des}{-}y * \operatorname{src}{-}h / \operatorname{des}{-}h srcy=desysrch/desh

Bilinear interpolation双线性插值)是一种用于在离散数据点之间进行插值的方法。它通过在两个方向上进行线性插值来估计未知点的值。这种插值方法常用于图像处理和计算机图形学中。 双线性插值的原理是基于两个相邻的数据点之间的线性插值。首先,根据给定的坐标找到四个最近的数据点,然后在水平和垂直方向上进行线性插值,以获得未知点的值。 以下是一个使用双线性插值的示例代码[^1]: ```python import numpy as np def bilinear_interpolation(x, y, points): x1, y1 = points[0] x2, y2 = points[1] q11 = points[2] q12 = points[3] q21 = points[4] q22 = points[5] f = 1 / ((x2 - x1) * (y2 - y1)) value = f * ( q11 * (x2 - x) * (y2 - y) + q21 * (x - x1) * (y2 - y) + q12 * (x2 - x) * (y - y1) + q22 * (x - x1) * (y - y1) ) return value # 示例数据点 points = np.array([ [0, 0, 1, 3, 2, 4], [0, 1, 6, 8, 7, 9] ]) # 插值点坐标 x = 0.5 y = 0.5 # 进行双线性插值 result = bilinear_interpolation(x, y, points) print("Interpolated value:", result) ``` 这段代码中,我们定义了一个`bilinear_interpolation`函数,它接受插值点的坐标和四个最近的数据点的值作为输入。然后,根据双线性插值的公式计算出插值点的值,并返回结果。 在上面的示例中,我们使用了一个简单的二维数组作为示例数据点,然后对坐标为(0.5, 0.5)的点进行双线性插值。最后,输出插值点的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AoDeLuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值