BI(Bilinear interpolation)双线性插值实现上采样

在深度学习中 上采样是将图像放大

如上图所示 要求放大后的图像坐标(2,1)处的像素值 要找到目标图像中对应的原图像素 需要与扩大前和扩大后的边长比相乘得到一个坐标(1.5,0.75) 对应原图中没有一个像素点是重合的 蓝色框框的像素值与红色框框的四个点的像素值有关 相关的计算方法就需要用到双线性插值

学双线性插值前需要学习一下单线性插值:

单线性插值

在二维坐标系下 有两个已知点(x0,y0)和(x1,y1) 现在插入了一个值x 需要求x处的y值

根据初中学过的知识(斜率公式)可以得到:

联系到图像处理:

p就是插入像素的像素值

双线性插值

如图 插入的点是红色的(x,y)

已知的有4个点 为灰色的(x1,y1) (x2,y1) (x1,y2) (x2,y2) 对应的像素值为P11,P21,P12,P22

注意P不是坐标系的Z轴 只是便于观察

要求的是(x,y)处的像素值P

沿x轴方向的平面:

就是图中的这一部分:

可以进行一次单线性插值得到P1处的像素值

以此类推得到x2处的像素值:

得到了P1,P2之后 就可以沿y轴方向 再进行一次单线性插值得到P处的像素值

将P1,P2带入得:

化简过程:

根据红色圈住的四个点 可以得到一个关系:

代入到上面的式子可以发现分母全都变成1了

具体含义:

式子中的(y2-y)的值都是相同的 所以与这个无关 P11后面的(x2-x)可以理解为x2与x之间的距离 进一步可以理解为是权重 如果(x2-x)越大 那么所求P点的像素值就越接近于P11处的像素值

所以可以将(x2-x)看作是W1:

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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值