双线性插值(Bilinear interpolation)原理推导

news2024/9/22 13:28:12

文章目录

    • 参考资料
    • 前言
    • 推导
      • 先x方向,后y方向
      • 先y方向,后x方向
    • 简化后的双线性插值
    • 双线性插值的一阶导

参考资料

  • https://en.wikipedia.org/wiki/Bilinear_interpolation

前言

双线性插值,又称为双线性内插。在数学上,双线性插值是对线性插值在二维直角网格上的扩展,用于对双变量函数(例如 x 和 y)进行插值。其核心思想是在x,y两个方向分别进行一次线性插值。

线性插值可以查看 之前的博客文章。

推导

假如我们想得到未知函数 f f f 在点 P = ( x , y ) P=(x, y) P=(x,y) 的值,假设我们已知函数 f f f Q 11 = ( x 1 , y 1 ) , Q 12 = ( x 1 , y 2 ) , Q 21 = ( x 2 , y 1 ) Q_{11}=\left(x_1, y_1\right) , Q_{12}=\left(x_1, y_2\right) , Q_{21}=\left(x_2, y_1\right) Q11=(x1,y1)Q12=(x1,y2)Q21=(x2,y1) Q 22 = ( x 2 , y 2 ) Q_{22}=\left(x_2, y_2\right) Q22=(x2,y2) 四个点的值。

先x方向,后y方向

首先在 x x x 方向进行线性插值 (即 x x x变, y y y不变),得到
f ( x , y 1 ) ≈ x 2 − x x 2 − x 1 f ( Q 11 ) + x − x 1 x 2 − x 1 f ( Q 21 ) , f ( x , y 2 ) ≈ x 2 − x x 2 − x 1 f ( Q 12 ) + x − x 1 x 2 − x 1 f ( Q 22 ) . \begin{aligned} & f\left(x, y_1\right) \approx \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(x, y_2\right) \approx \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) . \end{aligned} f(x,y1)x2x1x2xf(Q11)+x2x1xx1f(Q21),f(x,y2)x2x1x2xf(Q12)+x2x1xx1f(Q22).
然后在 y y y 方向进行线性插值,得到
f ( x , y ) ≈ y 2 − y y 2 − y 1 f ( x , y 1 ) + y − y 1 y 2 − y 1 f ( x , y 2 ) = y 2 − y y 2 − y 1 ( x 2 − x x 2 − x 1 f ( Q 11 ) + x − x 1 x 2 − x 1 f ( Q 21 ) ) + y − y 1 y 2 − y 1 ( x 2 − x x 2 − x 1 f ( Q 12 ) + x − x 1 x 2 − x 1 f ( Q 22 ) ) = 1 ( x 2 − x 1 ) ( y 2 − y 1 ) ( 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 ) ) = 1 ( x 2 − x 1 ) ( y 2 − y 1 ) [ x 2 − x x − x 1 ] [ f ( Q 11 ) f ( Q 12 ) f ( Q 21 ) f ( Q 22 ) ] [ y 2 − y y − y 1 ] . \begin{aligned} f(x, y) & \approx \frac{y_2-y}{y_2-y_1} f\left(x, y_1\right)+\frac{y-y_1}{y_2-y_1} f\left(x, y_2\right) \\ & =\frac{y_2-y}{y_2-y_1}\left(\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)\right)+\frac{y-y_1}{y_2-y_1}\left(\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)\right) \\ & =\frac{1}{\left(x_2-x_1\right)\left(y_2-y_1\right)}\left(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)\right) \\ & =\frac{1}{\left(x_2-x_1\right)\left(y_2-y_1\right)}\left[x_2-x \quad x-x_1\right]\left[\begin{array}{ll} f\left(Q_{11}\right) & f\left(Q_{12}\right) \\ f\left(Q_{21}\right) & f\left(Q_{22}\right) \end{array}\right]\left[\begin{array}{l} y_2-y \\ y-y_1 \end{array}\right] . \end{aligned} f(x,y)y2y1y2yf(x,y1)+y2y1yy1f(x,y2)=y2y1y2y(x2x1x2xf(Q11)+x2x1xx1f(Q21))+y2y1yy1(x2x1x2xf(Q12)+x2x1xx1f(Q22))=(x2x1)(y2y1)1(f(Q11)(x2x)(y2y)+f(Q21)(xx1)(y2y)+f(Q12)(x2x)(yy1)+f(Q22)(xx1)(yy1))=(x2x1)(y2y1)1[x2xxx1][f(Q11)f(Q21)f(Q12)f(Q22)][y2yyy1].

先y方向,后x方向

首先在 y y y 方向进行线性插值 (即 y y y变, x x x不变),得到
f ( x 1 , y ) ≈ y 2 − y y 2 − y 1 f ( Q 11 ) + y − y 1 y 2 − y 1 f ( Q 12 ) , f ( x 2 , y ) ≈ y 2 − y y 2 − y 1 f ( Q 21 ) + y − y 1 y 2 − y 1 f ( Q 22 ) . \begin{aligned} & f\left(x_1, y\right) \approx \frac{y_2-y}{y_2-y_1} f\left(Q_{11}\right)+\frac{y-y_1}{y_2-y_1} f\left(Q_{12}\right), \\ & f\left(x_2, y\right) \approx \frac{y_2-y}{y_2-y_1} f\left(Q_{21}\right)+\frac{y-y_1}{y_2-y_1} f\left(Q_{22}\right) . \end{aligned} f(x1,y)y2y1y2yf(Q11)+y2y1yy1f(Q12),f(x2,y)y2y1y2yf(Q21)+y2y1yy1f(Q22).
然后在 x x x 方向进行线性插值,得到
f ( x , y ) ≈ x 2 − x x 2 − x 1 f ( x 1 , y ) + x − x 1 x 2 − x 1 f ( x 2 , y ) = x 2 − x x 2 − x 1 ( y 2 − y y 2 − y 1 f ( Q 11 ) + y − y 1 y 2 − y 1 f ( Q 12 ) ) + x − x 1 x 2 − x 1 ( y 2 − y y 2 − y 1 f ( Q 21 ) + y − y 1 y 2 − y 1 f ( Q 22 ) ) = 1 ( x 2 − x 1 ) ( y 2 − y 1 ) ( 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 ) ) = 1 ( x 2 − x 1 ) ( y 2 − y 1 ) [ x 2 − x x − x 1 ] [ f ( Q 11 ) f ( Q 12 ) f ( Q 21 ) f ( Q 22 ) ] [ y 2 − y y − y 1 ] . \begin{aligned} f(x, y) & \approx \frac{x_2-x}{x_2-x_1} f\left(x_1, y\right)+\frac{x-x_1}{x_2-x_1} f\left(x_2, y\right) \\ & =\frac{x_2-x}{x_2-x_1}\left(\frac{y_2-y}{y_2-y_1} f\left(Q_{11}\right)+\frac{y-y_1}{y_2-y_1} f\left(Q_{12}\right)\right)+\frac{x-x_1}{x_2-x_1}\left(\frac{y_2-y}{y_2-y_1} f\left(Q_{21}\right)+\frac{y-y_1}{y_2-y_1} f\left(Q_{22}\right)\right) \\ & =\frac{1}{\left(x_2-x_1\right)\left(y_2-y_1\right)}\left(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)\right) \\ & =\frac{1}{\left(x_2-x_1\right)\left(y_2-y_1\right)}\left[x_2-x \quad x-x_1\right]\left[\begin{array}{ll} f\left(Q_{11}\right) & f\left(Q_{12}\right) \\ f\left(Q_{21}\right) & f\left(Q_{22}\right) \end{array}\right]\left[\begin{array}{l} y_2-y \\ y-y_1 \end{array}\right] . \end{aligned} f(x,y)x2x1x2xf(x1,y)+x2x1xx1f(x2,y)=x2x1x2x(y2y1y2yf(Q11)+y2y1yy1f(Q12))+x2x1xx1(y2y1y2yf(Q21)+y2y1yy1f(Q22))=(x2x1)(y2y1)1(f(Q11)(x2x)(y2y)+f(Q21)(xx1)(y2y)+f(Q12)(x2x)(yy1)+f(Q22)(xx1)(yy1))=(x2x1)(y2y1)1[x2xxx1][f(Q11)f(Q21)f(Q12)f(Q22)][y2yyy1].

可见,无论哪个方向先进行插值,双线性插值的结果是一样的。

简化后的双线性插值

如果选择一个坐标系统使得 f f f 的四个已知点坐标分别为 ( x 1 , y 1 ) = ( 0 , 0 ) 、 ( x 1 , y 2 ) = ( 0 , 1 ) 、 ( x 2 , y 1 ) = ( 1 , 0 ) (x_1,y_1)=(0,0) 、(x_1,y_2)=(0,1) 、(x_2,y_1)=(1,0) (x1,y1)=(0,0)(x1,y2)=(0,1)(x2,y1)=(1,0) ( x 2 , y 2 ) = ( 1 , 1 ) (x_2,y_2)=(1,1) (x2,y2)=(1,1) ,那么插值公式就可以化简为
f ( x , y ) ≈ f ( 0 , 0 ) ( 1 − x ) ( 1 − y ) + f ( 1 , 0 ) x ( 1 − y ) + f ( 0 , 1 ) ( 1 − x ) y + f ( 1 , 1 ) x y ≈ [ 1 − x x ] [ f ( 0 , 0 ) f ( 0 , 1 ) f ( 1 , 0 ) f ( 1 , 1 ) ] [ 1 − y y ] \begin{aligned} f(x, y) &\approx f(0,0)(1-x)(1-y)+f(1,0) x(1-y)+f(0,1)(1-x) y+f(1,1) x y \\ & \approx\left[\begin{array}{ll} 1-x & x \end{array}\right]\left[\begin{array}{ll} f(0,0) & f(0,1) \\ f(1,0) & f(1,1) \end{array}\right]\left[\begin{array}{c} 1-y \\ y \end{array}\right] \end{aligned} f(x,y)f(0,0)(1x)(1y)+f(1,0)x(1y)+f(0,1)(1x)y+f(1,1)xy[1xx][f(0,0)f(1,0)f(0,1)f(1,1)][1yy]

双线性插值的一阶导

在进行code reading 时,发现有时候会需要计算插值后的结果在x,y方向上的一阶导,因此,这里也给出双线性插值的一阶导。

f ( x , y ) f(x,y) f(x,y) x x x方向上的一阶导:
∂ f ∂ x = 1 ( x 2 − x 1 ) ( y 2 − y 1 ) [ − 1 1 ] [ f ( Q 11 ) f ( Q 12 ) f ( Q 21 ) f ( Q 22 ) ] [ y 2 − y y − y 1 ] . \frac{\partial f}{\partial x}=\frac{1}{\left(x_2-x_1\right)\left(y_2-y_1\right)}\left[-1 \quad 1\right]\left[\begin{array}{ll} f\left(Q_{11}\right) & f\left(Q_{12}\right) \\ f\left(Q_{21}\right) & f\left(Q_{22}\right) \end{array}\right]\left[\begin{array}{l} y_2-y \\ y-y_1 \end{array}\right] . xf=(x2x1)(y2y1)1[11][f(Q11)f(Q21)f(Q12)f(Q22)][y2yyy1].

f ( x , y ) f(x,y) f(x,y) y y y方向上的一阶导:

∂ f ∂ y = 1 ( x 2 − x 1 ) ( y 2 − y 1 ) [ x 2 − x x − x 1 ] [ f ( Q 11 ) f ( Q 12 ) f ( Q 21 ) f ( Q 22 ) ] [ − 1 1 ] . \frac{\partial f}{\partial y}=\frac{1}{\left(x_2-x_1\right)\left(y_2-y_1\right)}\left[x_2-x \quad x-x_1\right]\left[\begin{array}{ll} f\left(Q_{11}\right) & f\left(Q_{12}\right) \\ f\left(Q_{21}\right) & f\left(Q_{22}\right) \end{array}\right]\left[\begin{array}{l} -1 \\ 1 \end{array}\right] . yf=(x2x1)(y2y1)1[x2xxx1][f(Q11)f(Q21)f(Q12)f(Q22)][11].

简化后:

∂ f ∂ x = [ − 1 , 1 ] [ f ( 0 , 0 ) f ( 0 , 1 ) f ( 1 , 0 ) f ( 1 , 1 ) ] [ 1 − y y ] \frac{\partial f}{\partial x}=[-1,1]\left[\begin{array}{ll} f(0,0) & f(0,1) \\ f(1,0) & f(1,1) \end{array}\right]\left[\begin{array}{c} 1-y \\ y \end{array}\right] xf=[1,1][f(0,0)f(1,0)f(0,1)f(1,1)][1yy]

∂ f ∂ y = [ 1 − x , x ] [ f ( 0 , 0 ) f ( 0 , 1 ) f ( 1 , 0 ) f ( 1 , 1 ) ] [ − 1 1 ] \frac{\partial f}{\partial y}=[1-x, x]\left[\begin{array}{ll} f(0,0) & f(0,1) \\ f(1,0) & f(1,1) \end{array}\right]\left[\begin{array}{c} -1 \\ 1 \end{array}\right] yf=[1x,x][f(0,0)f(1,0)f(0,1)f(1,1)][11]

c++实现参考如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/494339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatGPT的对手,Claude注册教程

完美替代chatGPT!Claude注册教程及浅浅的测评 注册 slack 访问地址:https://slack.com/ 点击使用电子邮件注册 建议使用Google邮箱进行登录, 当然使用Google邮箱登录需要使用魔法 登录成功后 创建Slack工作区 我的邀请链接 https://join.…

Ae:绘画工具 - 描边选项

在 Ae 中使用绘画工具(画笔工具、仿制图章工具及橡皮擦工具)时,都会在时间轴面板的绘画 Paint效果中添加“描边选项” Stroke Options,不同的工具有一些不同的属性。 描边选项里的属性主要用于绘画描边之后的调整,并可…

【Leetcode -405.数字转换为十六进制数 - 409.最长回文串】

Leetcode Leetcode -405.数字转换为十六进制数Leetcode - 409.最长回文串 Leetcode -405.数字转换为十六进制数 题目:给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。 注意 : 十六进制中所有…

flask+opencv+实时滤镜(原图、黑白、怀旧、素描)

简介:滤镜,主要是用来实现图像的各种特殊效果。图像滤镜用于改变图像的视觉效果,使其具有特定的风格。下面是这三种滤镜的详细说明: 1、黑白(Grayscale):黑白滤镜将彩色图像转换为灰度图像&…

全景丨0基础学习VR全景制作,平台篇第17章:热点功能-视频

大家好,欢迎观看蛙色VR官方——后台使用系列课程! 功能说明 应用场景 热点,指在全景作品中添加各种类型图标的按钮,引导用户通过按钮产生更多的交互,增加用户的多元化体验。 视频热点,即点击热点后弹出一个…

Camtasia2023全新版下载安装使用教程

Camtasia2023是一款功能强大的屏幕录制和视频编辑软件。它可以帮助用户轻松地记录电脑屏幕上的任何操作,并可以将录制的视频进行编辑和制作成高质量的视频教程、演示文稿、培训课程等。 Camtasia具有直观的界面和易于使用的工具,包括添加文本、音频、动…

qt程序设置同时只能运行一个,避免重复打开

qt程序设置同时只能运行一个,避免重复打开 [1] qt程序设置同时只能运行一个,避免重复打开[2] Qt 桌面软件防止重新启动一、创建互斥量二、使用QLockFile 创建锁定文件,通过能否锁定来判断是否已经有程序启动。三、使用 系统信号量 QSystemSem…

基于ATECLOUD的航电系统可灵活扩展自动化测试平台

随着电子技术的发展,航电系统在飞机整机中的重要性飞速提升。据统计,近年来航电系统在飞机出厂成本中的比例直线上升,航电系统研发成本已占飞机研制总成本的近30%,并保持着持续扩大的趋势。测试保障作为航电产业链至关重要的一环&…

一起学 WebGL:绘制图片

大家好,我是前端西瓜哥。之前讲解了如何用 WebGL 绘制红色三角形,今天西瓜哥带大家来学习如何将图片绘制到画布上的技术:纹理映射(texture mapping)。 本文为系列文章中的一篇,请先阅读: 《一起…

25000 字详解 23 种设计模式(多图 + 代码)

25000 字详解 23 种设计模式(多图 代码) 目录 创建型模式结构型模式行为型模式总结 前言 一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混。 设计…

记录一次docker容器引起的时间相差8h的问题

一、背景 系统打印日志时间小8h,部分插入mysql的日期却大8h,简直诡异。 测试时间是上午10:05 经过排查,mysql设置的时区,链接url设置的时区都是ok的。而且有其他服务时间正常,故排除MySQL的问题。 二、排查 2.1 查…

AIGPT中文版(无需魔法,直接使用)不愧是生活工作的好帮手。

AIGPT AIGPT是一款非常强大的人工智能技术的语言处理工具软件,它具有 AI绘画 功能、AI写作、写论文、写代码、哲学探讨、创作等功能,可以说是生活和工作中的好帮手。 我们都知道使用ChatGPT是需要账号以及使用魔法的,其中的每一项对我们初学…

09-Vue技术栈(TodoList案例)

目录 1、前期准备2、组件化编码流程3、拆分静态组件3.1 app组件3.2 TodoList组件3.2.1 TodoItem组件 3.3 TodoFooter组件 4、实现动态组件5、实现交互5.1 渲染页面5.2 添加功能5.3 勾选or取消勾选一个todo5.4 删除一个todo5.5 渲染TodoFooter底部内容5.6 全选or取消全选5.7清除…

软考算法-排序篇-下

排序篇 一:故事背景二:冒泡排序2.1 概念2.2 画图表示2.3 代码实现2.4 总结提升 三:快速排序3.1 概念3.2 画图表示3.3 代码实现3.4 总结提升 四:归并排序4.1 概念4.2 画图表示4.3 代码实现4.4 总结提升 五:基数排序5.1 …

第二章——进程与线程(上)

上船不思岸上人,下船不提船上事 文章目录 2.1.1 进程的概念,组成,特征知识总览进程的概念进程的组成——PCB程序是如何运行的进程的组成进程的特征知识回顾 2.1.2 进程的状态与转换,进程的组织知识总览创建态,就绪态运…

《花雕学AI》用Edge和chrome浏览器体验GPT-4智能聊天的神奇免费插件,Sider – 聊天机器人的新选择

你有没有想过和人工智能聊天?你有没有想过用浏览器就能和GPT-4这样的先进的聊天机器人对话?如果你有这样的想法,那么你一定要试试Sider这个神奇的免费插件。 Sider(Sider – AI Sidebar)是一款基于ChatGPT的智能侧边栏…

零基础小白学5G网络优化技术,最常陷入的怪圈有哪些?

“赛道”这个词是自媒体最喜欢谈的,因为生活里面处处是赛道。从上小学选择哪个中学,高考选择哪个专业,大学毕业选择哪个行业...... 一开始就选对赛道的人,少之又少,都是需要经历和试错才可以。面对行业和工作这个赛道&…

豪取BAT!超详细暑期实习算法面经(非科班无论文)

面试锦囊之面经分享系列,持续更新中 赶紧后台回复"面试"加入讨论组交流吧 写在前面 本人基本情况:211本硕,本科电子信息工程,硕士通信与信息系统,典型的非科班,无论文,两段实习经历…

UNIX系统调用和库函数(详细讲解)

什么是系统调用? 所有的操作系统都提供多种服务的入口点,由此程序向内核请求服务。各种版本的 UNIX 实现都提供良好定义、数量有限、直接进入内核的入口点,这些入口点被称为系统调用(system call,见图1-1) Research UNX 系统第7版提供了约5…

复古视觉大闸蟹创意海报设计

一、新建画布1500*2300像素,分辨率72 二、把文案要求拖入新建的画布中,更改文字颜色,然后打组命名为文案 三、拖入一个大闸蟹到画面当中,点击视图,新建一个居中的参考线,750居中 四、给画面添加一个背景&am…