(四)线性插值

这篇具有很好参考价值的文章主要介绍了(四)线性插值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


欢迎访问个人网络日志🌹🌹知行空间🌹🌹文章来源地址https://www.toymoban.com/news/detail-664109.html


1.线性插值

线性插值是指使用连接两个已知点的直线来确定同在这个直线上的未知点值的方法。

图片来自于线性插值
线性插值法,MachineLearning,线性代数,矩阵,算法

如上图,已知坐标 ( x 0 , y 0 ) , ( x 1 , y 1 ) (x_0, y_0),(x_1,y_1) (x0,y0),(x1,y1),要求区间 [ x 0 , x 1 ] [x_0, x_1] [x0,x1]中间一个x位置在直线上的值,使用线性插值的方法如下,两点式直线方程可写为:

x − x 0 x 1 − x 0 = y − y 0 y 1 − y 0 \frac{x-x_0}{x_1-x_0}=\frac{y-y_0}{y_1-y_0} x1x0xx0=y1y0yy0

记方程左右的等值为 α \alpha α,则可得 α = x − x 0 x 1 − x 0 \alpha=\frac{x-x_0}{x_1-x_0} α=x1x0xx0,

y = ( 1 − α ) y 0 + α y 1 y=(1-\alpha)y_0+\alpha y_1 y=(1α)y0+αy1

上式可用来计算 y y y。实际上当 x ∉ [ x 0 , x 1 ] x\notin[x_0,x_1] x/[x0,x1] α ∉ [ 0 , 1 ] \alpha\notin[0,1] α/[0,1]时,上式仍然可以使用,这种情况下,这种方法叫作线性外插

2.双线性插值

知道线性插值后,双线性插值,又称双线性内插,就是在两条线上分别进行一次线性插值,等到两个中间点,再对中间点进行一次线性插值得到的,如下图:

图片来自双线性插值
线性插值法,MachineLearning,线性代数,矩阵,算法

现在函数值是和 ( x , y ) (x,y) (x,y)相关的二维函数, z = f ( x , y ) z=f(x, y) z=f(x,y), 可将上图当成是沿z轴方向的俯视图, Q 11 , Q 12 , Q 21 , Q 22 Q_{11}, Q_{12}, Q_{21}, Q_{22} Q11,Q12,Q21,Q22是已知的四个点,双线性插值所做的事情即根据这四个点求中间点 P P P的值,上图中

f ( Q 11 ) = f ( x 1 , y 1 ) f ( Q 12 ) = f ( x 1 , y 2 ) f ( Q 21 ) = f ( x 2 , y 1 ) f ( Q 22 ) = f ( x 2 , y 2 ) \begin{matrix} f(Q_{11}) = f(x_1, y_1) \\ f(Q_{12}) = f(x_1, y_2) \\ f(Q_{21}) = f(x_2, y_1) \\ f(Q_{22}) = f(x_2, y_2) \end{matrix} f(Q11)=f(x1,y1)f(Q12)=f(x1,y2)f(Q21)=f(x2,y1)f(Q22)=f(x2,y2)

求P需先求中间点 R 1 , R 2 R_1,R_2 R1,R2, R 1 R_1 R1可根据 Q 11 , Q 12 Q_{11},Q_{12} Q11,Q12用线性插值公式来求, R 2 R_2 R2可根据 Q 21 , Q 22 Q_{21},Q_{22} Q21,Q22用线性插值公式来求。

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 ) \begin{matrix} f(R_1)=\frac{x_2-x}{x_2-x_1}f(Q_{11}) + \frac{x-x_1}{x_2-x1}f(Q_{21}) \\ f(R_2)=\frac{x_2-x}{x_2-x_1}f(Q_{12}) + \frac{x-x_1}{x_2-x1}f(Q_{22}) \end{matrix} f(R1)=x2x1x2xf(Q11)+x2x1xx1f(Q21)f(R2)=x2x1x2xf(Q12)+x2x1xx1f(Q22)

得到 R 1 , R 2 R_1,R_2 R1,R2后,对这两点再应用线性插值即可求 P P P,

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(R_1) + \frac{y-y_1}{y_2-y_1}f(R_2) f(P)=y2y1y2yf(R1)+y2y1yy1f(R2)

3.示例

3.1 双线性插值求像素点的值

已知 ( 2 , 2 ) , ( 2 , 3 ) , ( 3 , 2 ) , ( 3 , 3 ) (2,2),(2,3),(3,2),(3,3) (2,2),(2,3),(3,2),(3,3)四个像素点的值分别为 20 , 15 , 30 , 40 20,15,30,40 20,15,30,40,用双线性插值求其中间点 P ( 2.6 , 2.4 ) P(2.6,2.4) P(2.6,2.4)的像素值的过程如下,

图片来自双线性插值
线性插值法,MachineLearning,线性代数,矩阵,算法

f ( R 1 ) = 0.4 × 20 + 0.6 × 30 = 26 f ( R 2 ) = 0.4 × 15 + 0.6 × 40 = 30 f ( P ) = 0.6 × 26 + 0.4 × 30 = 27.6 ≈ 28 \begin{matrix} f(R_1) = 0.4 \times 20 + 0.6 \times 30 = 26 \\ f(R_2) = 0.4\times15+0.6\times40 = 30 \\ f(P)=0.6\times26+0.4\times30 = 27.6 \approx 28 \end{matrix} f(R1)=0.4×20+0.6×30=26f(R2)=0.4×15+0.6×40=30f(P)=0.6×26+0.4×30=27.628

3.2与OpneCV Resize方法做比较

使用OpenCVresize方法,插值方法选择双线性插值。将3x3的图像使用双线性插值resize2x2
使用OpenCV计算的结果为:

img = np.array([[30, 20, 10],
 [10, 40, 60],
 [20, 30, 40]], dtype=np.uint8)
img = cv2.resize(img, (2,2), cv2.INTER_LINEAR)
print(img)
# [[25 23]
#  [21 42]]

手动计算双线性插值过程,需先将resize后大小为2x2destination图像对应的点再还原到source源图像上去,然后才能在原图像上应用双线性插值,这里将目标图像点映射到源图像上的坐标计算公式为:
X = ( d s t X + 0.5 ) × s r c W i d t h d s t W i d t h − 0.5 Y = ( d s t Y + 0.5 ) × s r c H e i g h t d s t H e i g h t − 0.5 \begin{matrix} X = (dstX + 0.5) \times \frac{srcWidth}{dstWidth} - 0.5 \\ Y = (dstY + 0.5) \times \frac{srcHeight}{dstHeight} - 0.5 \end{matrix} X=(dstX+0.5)×dstWidthsrcWidth0.5Y=(dstY+0.5)×dstHeightsrcHeight0.5

  • dstX 是resize后图像上的像素点坐标
  • srcWidth/srcHeight源图像宽高,dstWidth/dstHeight resize后图像的宽高

这个公式可以写成:
s r c X + 0.5 d s t X + 0.5 = s r c W i d t h d s t W i d t h \frac{srcX + 0.5}{dstX + 0.5} = \frac{srcWidth}{dstWidth} dstX+0.5srcX+0.5=dstWidthsrcWidth
可理解成将resize后每个像素点中心和原图上对应点开始一半像素的位置对齐。

计算过程为:

图片来自双线性插值
线性插值法,MachineLearning,线性代数,矩阵,算法

可见与OpenCV resize函数使用INTER_LINEAR方法时的结果相同。

上述原图坐标和resize后图像坐标的映射方式等同于TORCH.NN.FUNCTIONAL.INTERPOLATE函数align_corners=False时的场景,

import torch
import torch.nn.functional as F

t = torch.tensor(img, dtype=torch.float).reshape(1,1,3,3)
it0 = F.interpolate(t, size=2, mode = 'bilinear')
print(it0)
# tensor([[[[25.0000, 23.1250],
#           [21.2500, 41.8750]]]])
it0 = F.interpolate(t, size=2, mode = 'bilinear', align_corners=True)
print(it0)
# tensor([[[[30., 10.],
#           [20., 40.]]]])

关于align_corners参数的介绍可参考(三)TORCH.NN.FUNCTIONAL.INTERPOLATE使用说明。

其他

关于双线性插值,可以将上述公式 f ( P ) f(P) f(P)展开成 f ( Q i j ) f(Q_{ij}) f(Qij)的加权和,其物理含义可借助下图表示:

图片来自于RoI Pooling 与 RoI Align 的区别
线性插值法,MachineLearning,线性代数,矩阵,算法


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


参考资料

  • 1.https://blog.csdn.net/qq_37541097/article/details/112564822?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164784799816780255299039%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=164784799816780255299039&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-1-112564822.nonecase&utm_term=%E5%8F%8C%E7%BA%BF%E6%80%A7&spm=1018.2226.3001.4450#t4
  • 2.https://zhuanlan.zhihu.com/p/161540817

到了这里,关于(四)线性插值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数学建模笔记】【第三讲】拉格朗日插值法,牛顿插值法,分段三次埃尔米特插值法及其MATLAB实践

    温馨提示:本文共有3748字,阅读并理解全文大概需要15-20分钟 数模比赛中,常常需要根据已知的函数点进行数据、模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就 需要使用一些数学的方法,“模拟产生”一些新的但又比较靠谱的值来满足

    2024年02月05日
    浏览(44)
  • 【数值分析】拉格朗日插值法与牛顿插值法的C++实现

    设函数 y = f ( x ) displaystylecolor{red}y=f(x) y = f ( x ) 在区间 [ a , b ] displaystylecolor{red}[a,b] [ a , b ] 上有定义,且 a ≤ x 0 x 1 ⋯ x n ≤ b displaystylecolor{red}a ≤x_0x_1dotsx_n ≤b a ≤ x 0 ​ x 1 ​ ⋯ x n ​ ≤ b ,已知在 x 0 … x n displaystylecolor{red}x_0dots x_n x 0 ​ … x n ​ 点处的值分别为

    2024年02月06日
    浏览(50)
  • openCV实战-系列教程5:边缘检测(Canny边缘检测/高斯滤波器/Sobel算子/非极大值抑制/线性插值法/梯度方向/双阈值检测 )、原理解析、源码解读 ?????OpenCV实战系列总目录

    打印一个图片可以做出一个函数: Canny是一个科学家在1986年写了一篇论文,所以用自己的名字来命名这个检测算法,Canny边缘检测算法这里写了5步流程,会用到之前《openCV实战-系列教程》的内容。  使用高斯滤波器,以平滑图像,滤除噪声。 计算图像中每个像素点的梯度强

    2024年02月11日
    浏览(50)
  • 算法--插值法

    插值法是一种数学方法,主要用于通过已知的离散数据来估算未知值。常见的插值法有线性插值、最近邻插值、双线性插值和双三次插值。以下是其基本原理和应用: 线性插值:假设在两个已知数据点之间,数据的变化是线性的,因此可以通过已知的两点的坐标来计算经过这

    2024年01月18日
    浏览(42)
  • 基于Matlab的插值问题(Lagrange插值法、三次插值多项式)

    要求 1、 利用Lagrange插值公式 L n ( x ) = ∑ k = 0 n ( ∏ i = 0 , i ≠ k n x − x i x k − x i ) y k {L_n}(x) = sumlimits_{k = 0}^n {left( {prodlimits_{i = 0,i ne k}^n {frac{{x - {x_i}}}{{{x_k} - {x_i}}}} } right)} {y_k} L n ​ ( x ) = k = 0 ∑ n ​ ( i = 0 , i  = k ∏ n ​ x k ​ − x i ​ x − x i ​ ​ ) y k ​ 编写出

    2024年02月07日
    浏览(44)
  • 数学建模之插值法

    数模比赛中,常常需要根据已知的函数点进行数据、模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,“ 模拟产生 ”一些新的但又比较靠谱的值来满足需求,这就是插值的作用。 那什么是插值法? 插值法又可以分

    2024年02月03日
    浏览(47)
  • 浅谈拉格朗日插值法

    好像FFT要用到,所以就学习一手 版题 其意义在于: 理解一下: 就是把一个足球踢出去,假设球始终在一个平面上飞行,它的轨迹就可以抽象为 (f(x)) (假设这个函数至于时间有关) 现在你有一些照片,所以你可以得到某几个时间点球的位置,想要还原出这个函数 (f(x)) 的

    2023年04月25日
    浏览(38)
  • 上采样(最近邻插值、双线性插值法、反池化、转置卷积)

    一般图像分割的时候,需要对图像进行像素级别的分类,因此在卷积提取到抽象特征后需要通过上采样将feature map还原到原图大小,在FCN和U-net等网络中都提到了上采样的操作,这里会一些上采样的方法进行总结。 最简单的图像缩放算法就是最近邻插值,也称作零阶插值,就

    2024年02月05日
    浏览(64)
  • 数学建模学习笔记(一):插值法

    本文主要内容是分享博主在学习MATLAB插值与拟合过程中的一些笔记与见解,并记录使用代码实现的过程 一维插值问题可描述为:已知函数在 x 0 , x 1 , … , x n x_0,x_1,…,x_n x 0 ​ , x 1 ​ , … , x n ​ 处的值 y 0 , y 1 , … , y n y_0,y_1,…,y_n y 0 ​ , y 1 ​ , … , y n ​ ,求简单函数 p (

    2024年02月06日
    浏览(53)
  • Matlab图像处理-灰度插值法

    最近邻法 最近邻法是一种最简单的插值算法,输出像素的值为输入图像中与其最邻近的采样点的像素值。是将 ( u 0 , v 0 ) (u_0,v_0) 点最近的整数坐标 u , v (u,v) 点的灰度值取为 ( u 0 , v 0 ) (u_0,v_0) 点的灰度值。 在 ( u 0 , v 0 ) (u_0,v_0) 点各相邻像素间灰度变化较小时,这种方法是一

    2024年02月10日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包