双线性插值算法的详细总结

2023-11-08

原文出处:http://blog.csdn.net/xjz18298268521/article/details/51220576

最近在做视频拼接的项目,里面用到了图像的单应性矩阵变换,在最后的图像重映射,由于目标图像的坐标是非整数的,所以需要用到插值的方法,用的就是双线性插值,下面的博文主要是查看了前辈的博客对双线性插值算法原理进行了一个总结,在这里也感谢一些大牛的博文。

http://www.cnblogs.com/linkr/p/3630902.html

http://www.cnblogs.com/funny-world/p/3162003.html

双线性插值

      假设源图像大小为mxn,目标图像为axb。那么两幅图像的边长比分别为:m/a和n/b。注意,通常这个比例不是整数,编程存储的时候要用浮点型。目标图像的第(i,j)个像素点(i行j列)可以通过边长比对应回源图像。其对应坐标为(i*m/a,j*n/b)。显然,这个对应坐标一般来说不是整数,而非整数的坐标是无法在图像这种离散数据上使用的。双线性插值通过寻找距离这个对应坐标最近的四个像素点,来计算该点的值(灰度值或者RGB值)。

  若图像为灰度图像,那么(i,j)点的灰度值的数学计算模型是:

f(x,y)=b1+b2x+b3y+b4xy

其中b1,b2,b3,b4是相关的系数。关于其的计算过程如下如下:

      如图,已知Q12,Q22,Q11,Q21,但是要插值的点为P点,这就要用双线性插值了,首先在x轴方向上,对R1和R2两个点进行插值,这个很简单,然后根据R1和R2对P点进行插值,这就是所谓的双线性插值。

clip_image001

 

附:维基百科--双线性插值:

      双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。

假如我们想得到未知函数 f 在点 P=\left( x, y\right) 的值,假设我们已知函数 f 在 Q_{11} = \left( x_1, y_1 \right) Q_{12} = \left( x_1, y_2 \right) Q_{21} = \left( x_2, y_1 \right) , 及 Q_{22} = \left( x_2, y_2 \right)  四个点的值。

首先在 x 方向进行线性插值,得到

 f(R_1) \approx \frac{x_2-x}{x_2-x_1} f(Q_{11}) + \frac{x-x_1}{x_2-x_1} f(Q_{21}) \quad\mbox{Where}\quad R_1 = (x,y_1),
 f(R_2) \approx \frac{x_2-x}{x_2-x_1} f(Q_{12}) + \frac{x-x_1}{x_2-x_1} f(Q_{22}) \quad\mbox{Where}\quad R_2 = (x,y_2).

然后在 y 方向进行线性插值,得到

 f(P) \approx \frac{y_2-y}{y_2-y_1} f(R_1) + \frac{y-y_1}{y_2-y_1} f(R_2).

这样就得到所要的结果 f \left( x, y \right),

 f(x,y) \approx \frac{f(Q_{11})}{(x_2-x_1)(y_2-y_1)} (x_2-x)(y_2-y) + \frac{f(Q_{21})}{(x_2-x_1)(y_2-y_1)} (x-x_1)(y_2-y)
  + \frac{f(Q_{12})}{(x_2-x_1)(y_2-y_1)} (x_2-x)(y-y_1) + \frac{f(Q_{22})}{(x_2-x_1)(y_2-y_1)} (x-x_1)(y-y_1).

如果选择一个坐标系统使得 f 的四个已知点坐标分别为 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那么插值公式就可以化简为

 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) xy.

或者用矩阵运算表示为

 f(x,y) \approx \begin{bmatrix}1-x & x \end{bmatrix} \begin{bmatrix}f(0,0) & f(0,1) \\f(1,0) & f(1,1) \end{bmatrix} \begin{bmatrix}1-y \\y \end{bmatrix}

这种插值方法的结果通常不是线性的,线性插值的结果与插值的顺序无关。首先进行 y 方向的插值,然后进行 x 方向的插值,所得到的结果是一样的。

opencv和Matlab中的双线性插值

   这部分的前提是,你已经明白什么是双线性插值并且在给定源图像和目标图像尺寸的情况下,可以用笔计算出目标图像某个像素点的值。当然,最好的情况是你已经用某种语言实现了网上一大堆博客上原创或转载的双线性插值算法,然后发现计算出来的结果和matlab、openCV对应的resize()函数得到的结果完全不一样。

那这个究竟是怎么回事呢?

其实答案很简单,就是坐标系的选择问题,或者说源图像和目标图像之间的对应问题。

按照网上一些博客上写的,源图像和目标图像的原点(0,0)均选择左上角,然后根据插值公式计算目标图像每点像素,假设你需要将一幅5x5的图像缩小成3x3,那么源图像和目标图像各个像素之间的对应关系如下:

只画了一行,用做示意,从图中可以很明显的看到,如果选择右上角为原点(0,0),那么最右边和最下边的像素实际上并没有参与计算,而且目标图像的每个像素点计算出的灰度值也相对于源图像偏左偏上。

那么,让坐标加1或者选择右下角为原点怎么样呢?很不幸,还是一样的效果,不过这次得到的图像将偏右偏下。

最好的方法就是,两个图像的几何中心重合,并且目标图像的每个像素之间都是等间隔的,并且都和两边有一定的边距,这也是matlab和openCV的做法。如下图:

如果你不懂我上面说的什么,没关系,只要在计算对应坐标的时候改为以下公式即可,

int x=(i+0.5)*m/a-0.5

int y=(j+0.5)*n/b-0.5

代替

int x=i*m/a

int y=j*n/b

利用上述公式,将得到正确的双线性插值结果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

双线性插值算法的详细总结 的相关文章

  • ffmpeg推流收流 1920*1080视频 花屏

    自己用ffmpeg推流 然后再收流 小分辨率没有问题 当分辨率为1920 1080时 出现花屏现象 尤其是码率高时 现象更加明显 尝试各种办法 最后用下面的办法解决 在ffmpeg源码udp c中 define UDP MAX PKT SI
  • Ubuntu22.04配置静态IP-网关-DNS

    要在Ubuntu系统中配置网络 可以通过以下步骤进行操作 1 打开终端 可以使用 Ctrl Alt T 快捷键打开终端 或者从应用程序菜单中找到 终端 2 检查网络接口 输入以下命令检查当前系统中的网络接口列表 ifconfig a 接口列
  • 贝叶斯网络python实战(以泰坦尼克号数据集为例,pgmpy库)

    文章目录 贝叶斯网络简介 贝叶斯推断思路 贝叶斯网络 贝叶斯网络的实现 应用步骤 泰坦尼克数据集背景介绍 模型结构搭建 模型参数构建 贝叶斯估计器 推理 自动设计网络结构 gt 使用结构学习方法 模型保存 先验 练手数据集 Binary C
  • 三大排序算法

    目录 大O和推导过程 冒泡排序 冒泡排序的思路 冒泡排序的实现 冒泡排序的效率 O N 选择排序 选择排序的思路 选择排序实现 选择排序的效率 O N 插入排序 插入排序的思路 插入排序的实现 插入排序的效率 O N 大O和推导过程 公司规
  • 2023美赛C题:预测Wordle结果-思路详解及参考代码

    一 题目解析 总体来看与去年的C题比较相似 唯一一道有数据 不需要自己额外找 的题目 选题人估计也最多 本质是数据分析题目 需要建立预测模型 分类模型 特征挖掘等 相对来说出思路比较简单 想出彩比较难 所以在分析建模时一定要多维度思考 不然
  • spring三级缓存解决循环依赖

    一 循环依赖 简单说就是 A类中有B属性 B类中有A属性 创建A对象时发现有B属性 就开始创建B对象 此时时又发现B对象中有A属性 又要创建A对象 产生循环依赖现象 示例图 二 Spring解决循环依赖 使用缓存解决循环依赖的流程图 spr
  • 计算机高级应用大赛,理工学院成功开展第三届计算机应用技能竞赛之高级OFFCIE应用大赛...

    为提升学生计算机办公软件应用技能 进一步激发学生的学习兴趣 11月21日下午 理工学院第三届计算机应用技能竞赛之高级OFFCIE应用大赛在A5401 A5403 A5411三个机房成功举行 323名学生报名参加此次竞赛 竞赛分为Word E
  • 嵌入式Linux(五)—嵌入式C语言(运算符2)

    目录 逻辑结构 类型修饰符 auto register 补充 内存和寄存器的关系 Static 静态 Extern 外部申明 Const Volatile 运算符 算数运算操作 逻辑运算 或 与 位运算 移位 赋值运算 内存访问 逻辑结构
  • Windows 网络编程

    Winsock是Windows下网络编程的规范 该规范是Windows下得到广泛应用的 开放的 支持多种协议的网络编程接口 在MFC中MS为套接口 提供了相应的类CAsyncSocket和CSocket CAsyncSocket提供基于异步
  • securecrt破解版64位

    securecrt 破解版是一款支持SSH1和SSH2的终端仿真程序 这个程序能够在windows系统中登陆UNIX或Linux的服务器主机并且还能进行管理设置 是一款非常强大的ssh传输软件 是用于连接运行包括Windows UNIX和V
  • 激发新动能 多地发力数字经济

    发力数字经济 地方正紧锣密鼓展开新一轮规划部署 近期 云南 陕西 江苏 江西等多地出台相关举措 明确未来几年数字经济核心产业发展目标 并进一步完善资金 人才等配套政策 相关专家表示 发展数字经济是把握新一轮科技革命和产业变革新机遇的战略选择
  • 学习日记——时钟温湿计_Demo

    程序例程 如果成功接入则进入SNTP初始化 如果连接时候wifi错误或者是密码错误进入微信智能配网 以上步骤和微信智能配网相同 增加了SNTP初始化这一步 配网成功也执行SNTP初始化 SNTP初始化执行完毕之后每隔一秒种获取网络时间 并且
  • 【解决】控制台解析preview和response数据不一致,并使用transformResponse修改响应数据

    问题 控制台解析preview和response数据不一致 比如 id 1246000001606460673 会被默认解析成 id 1246000001606460700 在Preview 预览功能 中 控制台会把发送过来的json数据自
  • C++ 性能优化篇四《优化字符串的使用:案例研究》

    只有少数人才能触摸到魔法琴弦 string 可是聒噪的名声却企图击败他们 悲哀于那些从来都不歌唱的人们 死亡时却要带着他们的音乐陪葬 奥利弗 温德尔 霍姆斯 1 无声 1858 C 的 std string 类模板是 C 标 准 库 中 使
  • 转贴:华为 SmartAX MT800 固件升级(升级为VC100R004C01B010)并开启路由全过程(2004年8月7日更新) [精华]

    http bbs pcshow net cgi bin threaded show cgi tid 350483777 h 1 bpg 1 age 1 请认真的看上面的文章 如果软件版本低的话 要升级 1为升级工具 2为升级的软件包 升级之
  • 正式发布!中国首个LF Edge捐赠项目Baetyl 2.2发布

    Baetyl作为中国首个加入LFEdge基金会的边缘计算项目 自2019年由百度捐赠以来 在开放中立的社区环境中得到不断的支持与发展 在众多活跃的贡献者的努力下 Baetyl实现了更多具有挑战性的功能 正式升级为Baetyl v2 2版本
  • 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。

    定义栈的数据结构 请在该类型中实现一个能够得到校的最小元素的min函数 在该栈中 调用pop push 及min的时间复杂度都是0 1 param

随机推荐

  • pyqt5 QGraphicsView内缩放显示的图像

    from PyQt5 QtWidgets import QApplication QGraphicsView QGraphicsScene QGraphicsItem QGraphicsPixmapItem from PyQt5 QtCor
  • log4j-slf4j-impl cannot be present with log4j-to-slf4j 之类的问题,解决maven依赖冲突

    如题所示 本文主要用户解决maven的依赖冲突 并提供通用的解决方案 先放错误 SLF4J Class path contains multiple SLF4J bindings SLF4J Found binding in jar fil
  • 【Android】Room新手快速入门

    Room是什么 Room是Google推出的一款android平台上的ORM数据库框架 它类似于GreenDao 但比GreenDao更加简洁高效 是官方推荐使用的数据库框架 引入Gradle依赖 Room api androidx roo
  • 私有仓库修改docker.json报错

    我试了目前网上所有方法都不行自己摸索了很久 提供一种解决方案 找到你的阿里云镜像加速器 重新把配置阿里云镜像的那几行linux代码 再执行一次 然后紧接着马上去 etc docker daemon json加你的私有仓库http配置 再重启
  • NUC980开源项目31-can总线调试

    上面是我的微信和QQ群 欢迎新朋友的加入 以CAN0为例 在内核中配置 文件系统支持 重新烧录 启动 正常挂载 CAN终端测试 查看CAN接口 root myir ls sys class net can0 eth0 lo usb0 wla
  • docker部署fisco bcos区块链浏览器

    首先你要搭建一个myql数据库 理论上mariadb也支持 并创建一个数据库 再建个账号给区块链浏览器使用 如 CREATE DATABASE fisco CHARACTER SET utf8mb4 COLLATE utf8mb4 bin
  • [Excel VBA]如何自动关闭MsgBox?

    本文译至 http itpro nikkeibp co jp atcl column 15 090100207 090700150 VBA的MsgBox函数 直到用户点击按钮前都会继续显示 经过指定时间后自动关闭的MsgBox 可以使用Wi
  • 中高级程序员需求技能

    初级 中级 1 团队精神和协作能力 把它作为基本素质 并不是不重要 恰恰相反 这是程序员应该具备的最基本的 也是最重要的安身立命之本 把高水平程序员说成独行侠的都是在呓语 任何个人的力量都是有限的 即便如linus这样的天才 也需要通过组成
  • Unity发送Post请求

    using System Collections using System Text using UnityEngine using UnityEngine Networking public class PostMsg MonoBehav
  • CSDN竞赛第34期题解

    CSDN竞赛第34期题解 1 题目名称 最优利润值 你在读的经营课程上 老师布置了一道作业 在一家公司的日常运营中 是会对一些商品的价格走势根据一些经验和数据 进行预估 并据此进行决策 例如 假设某商品每天的价格都有可能变动 我们要做的就是
  • 从URL取值传给后端

    从URL传值给后端 http 127 0 0 1 8080 blog content html id 8 点击浏览文章详情 跳转至详情页面 从 url 中拿出文章 id 传给后端 首先拿到url 然后判断是否有值 从问号后面取值 param
  • 【Qt-11】http通信(Get同步收发)

    Qt 9 HTTP请求 post方式 WXG1011的博客 CSDN博客 QT 6 QWebApp服务器搭建及使用 qtwebapp WXG1011的博客 CSDN博客 写在前面 在上面两篇博文的基础上 继续迭代功能 上面两篇博客已实现QW
  • 谈Delphi编程中资源文件的应用

    一 初级应用篇 资源文件一般为扩展名为res的文件 在VC中资源文件用得非常普遍 但Delphi在其联机帮助中对资源文件没作什么介绍 其实利用其自带的资源编译工具BRCC32 EXE 一般位于 Delphi BIN目录下 我们完全可以做出跟
  • StringBuilder和StringBuffer&String的区别,以及它的基本用法

    StringBuilder在java5中引入 算的上是一个StringBuffer的一个用于单线程的版本 StringBuilder用于拼接字符串 用法跟StringBuffer差不多 都是创建一个字符缓存区 不用像String一样每增加一
  • JVM Tenured space is exhausted

    使用Android Studio命令gradlew assembleRelease打包apk 遇到了JVM Tenured space is exhausted的错误 网上查询后原因是JVM分配内存不足 需要在项目下的grade prope
  • 期货和股票的区别在哪里

    期货和股票的区别在哪里 股票与期货有什么区别 1 概念不同 股票是股份公司发行的所有权凭证 是各个股东作为持股凭证的一种有价证券 而期货属于一种标准化可交易合约 一种到期必须执行的合约 2 交易场所不同 股票是需要在证券交易所进行交易的 例
  • Netty实战(一)Nett的概念及体系结构

    Nett的概念及体系结构 第一章 Java网络编程 1 1 Java NIO 1 2 选择器 第二章 Netty是什么 2 1 Netty简介 2 2 Netty的特性 2 2 1 设计 2 2 2 易于使用 2 2 3 性能 2 2 4
  • 读取文件最后N行

    转自 http www zuidaima com share 1550463669226496 htm 指定行数 可以获取到从这行到文件尾的所有行 分享自大熊 源文件 读取最后10行结果 代码下载地址 http www zuidaima c
  • C++的智能指针unique_ptr、shared_ptr和weak_ptr

    C 的智能指针是一种特殊的指针类型 它能够自动管理内存资源 避免常见的内存泄漏和多次释放等问题 C 11引入了三种主要的智能指针 unique ptr shared ptr和weak ptr 目录 unique ptr shared ptr
  • 双线性插值算法的详细总结

    原文出处 http blog csdn net xjz18298268521 article details 51220576 最近在做视频拼接的项目 里面用到了图像的单应性矩阵变换 在最后的图像重映射 由于目标图像的坐标是非整数的 所以需