超分之最近邻插值、线性插值、双线性插值、双三次插值原理

news2024/9/20 10:26:13

文章目录

    • 插值与图像插值
    • 不同的插值方法
      • 最近邻域插值(Nearest Neighbor Interpolation)
    • 线性插值 (Linear Interpolation)
      • 双线性插值 (Bilinear Interpolation)
    • 双三次插值 (Bicubic Interpolation)

插值与图像插值

  • 插值:利用已知数据去预测位置数据。
  • 图像插值:给定一个像素点,根据它周围像素点的信息来对该像素点的值进行预测。

  图像插值问题类似于拟合问题,二者均为函数逼近或数值逼近的重要组成部分。但是两者的在于:对于给定的函数,插值:要求离散点“坐落在”函数曲线上从而满足约束;而 拟合:则希望离散点尽可能地 “逼近” 函数曲线。

图像插值示例(三倍放大):
  对于原图像的坐标点 (红色实心点),其在新图像上都能确定一一对应的坐标点 (红色实心点)。而对于新图像中因放大而的多出坐标点 (蓝色圈叉),则在原图像中找不到对应点了。
  插值技术就是通过某些规则/规范/约束(特定的拟合函数),获取这些多出坐标点的像素值。在这里插入图片描述
一维示例

  • ( x i − 1 , f ( x i − 1 ) ) 、 ( x i , f ( x i ) ) 、 ( x i + 1 , f ( x i + 1 ) ) (x_{i-1}, f(x_{i-1}))、(x_i,f(x_{i}))、(x_{i+1},f(x_{i+1})) (xi1,f(xi1))(xi,f(xi))(xi+1,f(xi+1)):已知的三个离散点坐标
  • f ( x ) f(x) f(x):插值算法的约束条件。
    如果想得到更密集、更精细的点,则可以给定坐标 x 1 x^1 x1 ,根据插值约束 f ( x ) f(x) f(x)得到对应的函数值 f ( x 1 ) f(x^1) f(x1)
    在这里插入图片描述
    总而言之,不同的插值方式,就是通过给定不同的插值函数约束,来得到不同的插值结果。

不同的插值方法

最近邻域插值(Nearest Neighbor Interpolation)

  • 一维示意图
    一维的最近邻插值的示意图
      坐标轴上各点 x i − 1 , x i , x i + 1 . . . x_{i-1},x_{i},x_{i+1} ... xi1xixi+1...两两对半等分间隔 (红色虚线划分),从而非边界的各坐标点都有一个等宽的邻域,并根据每个坐标点的值构成一个类似分段函数的函数约束,从而使各插值坐标点的值等同于所在邻域原坐标点的值。

  • 二维示意图
    在这里插入图片描述
       ( x 0 , y 0 ) 、 ( x 0 , y 1 ) 、 ( x 1 , y 0 ) 、 ( x 1 , y 1 ) (x_0, y_0)、(x_0, y_1)、(x_1, y_0)、(x_1, y_1) (x0,y0)(x0,y1)(x1,y0)(x1,y1)都是原图像上的坐标点,灰度值分别对应为 Q11、Q12、Q21、Q22。而灰度值未知的插值点 (x, y),根据最近邻插值方法的约束,其与坐标点 (x0, y0) 位置最接近 (即位于 (x0, y0) 的邻域内),故插值点 (x, y) 的灰度值 P = Q11。

  • 简而言之
    最近邻于插值:根据周围至少一个已知像素点,未知像素点x距离哪个已知像素点最近,他的像素值就是离已知像素点的像素值。
    在这里插入图片描述

线性插值 (Linear Interpolation)

  • 一维示意图
    在这里插入图片描述
      坐标轴上各点 x i − 1 , x i , x i + 1 . . . x_{i-1},x_i,x_{i+1} ... xi1xixi+1...的值“两两直接相连”为线段,从而构成了一条连续的约束函数。而插值坐标点例如 x,根据约束函数其值应为 f(x)。

  • 二维示意图
    在这里插入图片描述
       ( x 0 , y 0 ) 、 ( x 1 , y 1 ) (x_0, y_0)、(x_1, y_1) (x0,y0)(x1,y1)都是原图像上的坐标点,灰度值分别对应为 y0 和 y1。而灰度值未知的插值点 x,在 ( x 0 , y 0 ) 、 ( x 1 , y 1 ) (x_0, y_0)、(x_1, y_1) (x0,y0)(x1,y1)构成的一次函数上,其灰度值 y 即为:
    y = y 0 + ( x − x 0 ) y 1 − y 0 x 1 − x 0 y = y_0 + (x - x_0)\frac{y_1-y_0}{x_1-x_0} y=y0+(xx0)x1x0y1y0

  • 简而言之
    线性插值:根据周围至少两个已知像素点,来构造一个线性函数,将未知像素点x带入,从而求出该未知像素点的像素值。

双线性插值 (Bilinear Interpolation)

  • 定性斜视示意图
    在这里插入图片描述
      坐标轴上 ( x 0 , y 0 ) 、 ( x 0 , y 1 ) 、 ( x 1 , y 0 ) 、 ( x 1 , y 1 ) (x_0, y_0)、(x_0, y_1)、(x_1, y_0)、(x_1, y_1) (x0,y0)(x0,y1)(x1,y0)(x1,y1)均为原图像上的像素坐标点,灰度值分别对应为 f ( x 0 , y 0 ) 、 f ( x 0 , y 1 ) 、 f ( x 1 , y 0 ) 、 f ( x 1 , y 1 ) f(x_0, y_0)、f(x_0, y_1)、f(x_1, y_0)、f(x_1, y_1) f(x0,y0)f(x0,y1)f(x1,y0)f(x1,y1)。而灰度值未知的插值点 (x, y),根据双线性插值法的约束:

    1. 先由 ( x 0 , y 0 ) 和 ( x 0 , y 1 ) (x_0, y_0) 和 (x_0, y_1) (x0,y0)(x0,y1)在 y 轴向作一维线性插值得到 像素点 ( x 0 , y ) (x_0, y) (x0,y)的像素值 f ( x 0 , y ) f(x_0, y) f(x0,y)、由像素坐标点 ( x 1 , y 0 ) 和 ( x 1 , y 1 ) (x_1, y_0) 和 (x_1, y_1) (x1,y0)(x1,y1) 在 y 轴向作一维线性插值得到 像素点 ( x 1 , y ) (x_1, y) (x1,y)的像素值 f ( x 1 , y ) f(x_1, y) f(x1,y)
    2. 再由 ( x 0 , y ) 和 ( x 1 , y ) (x_0, y) 和 (x_1, y) (x0,y)(x1,y)在 x 轴向作一维线性插值得到插值点 ( x , y ) (x, y) (x,y) 的像素值 f ( x , y ) f(x, y) f(x,y)( 一维线性插值先作 x 轴向再作 y 轴向,得到的结果完全相同,仅为顺序先后的区别)
  • 二维定量俯视示意图
    在这里插入图片描述

这里: 一维线性插值先作 x 轴向再作 y 轴向

  1. 先由像素坐标点 ( x 0 , y 0 ) 和 ( x 1 , y 0 ) (x_0, y_0) 和 (x_1, y_0) (x0,y0)(x1,y0)在 x轴向作一维线性插值得到 像素点 ( x , y 0 ) (x, y_0) (x,y0)的像素值 f ( x 0 , y ) f(x_0, y) f(x0,y)
    f ( x , y 0 ) = x 1 − x x 1 − x 0 f ( x 0 , y 0 ) + x − x 0 x 1 − x 0 f ( x 1 , y 0 ) f(x, y_0) = \frac{x_1 - x}{x_1 - x_0}f(x_0, y_0) + \frac{x - x_0}{x_1 - x_0}f(x_1, y_0) f(x,y0)=x1x0x1xf(x0,y0)+x1x0xx0f(x1,y0)
    由像素坐标点 ( x 0 , y 1 ) 和 ( x 1 , y 1 ) (x_0, y_1) 和 (x_1, y_1) (x0,y1)(x1,y1) 在 x 轴向作一维线性插值得到 像素点 ( x , y 1 ) (x, y_1) (x,y1)的像素值 f ( x 1 , y ) f(x_1, y) f(x1,y):
    f ( x , y 1 ) = x 1 − x x 1 − x 0 f ( x 0 , y 1 ) + x − x 0 x 1 − x 0 f ( x 1 , y 1 ) f(x, y_1) = \frac{x_1 - x}{x_1 - x_0}f(x_0, y_1) + \frac{x - x_0}{x_1 - x_0}f(x_1, y_1) f(x,y1)=x1x0x1xf(x0,y1)+x1x0xx0f(x1,y1)
  2. 再由 ( x , y 0 ) 和 ( x , y 1 ) (x, y_0) 和 (x, y_1) (x,y0)(x,y1)在 y 轴向作一维线性插值得到插值点 ( x , y ) (x, y) (x,y) 的像素值 f ( x , y ) f(x, y) f(x,y)
    f ( x , y ) = y 1 − y y 1 − y 0 f ( x , y 0 ) + y − y 0 y 1 − y 0 f ( x , y 1 ) f(x, y) = \frac{y_1 - y}{y_1 - y_0}f(x, y_0) + \frac{y - y_0}{y_1 - y_0}f(x, y_1) f(x,y)=y1y0y1yf(x,y0)+y1y0yy0f(x,y1)
  • 简而言之
    线性插值:根据周围至少四个已知像素点,先将四个像素点两两在x轴作线性插值,得到未知像素y轴方向的两个像素值,然后将其在y轴作线性插值,最终得到目标像素点的像素值
    在这里插入图片描述

双三次插值 (Bicubic Interpolation)

  插值点 (x, y) 的像素值 f(x, y) 通过矩形网格中 最近的十六个采样点的加权平均 得到,而 各采样点的权重由该点到待求插值点的距离确定,此距离包括 水平和竖直 两个方向上的距离。

  • 二维俯视示意图
    在这里插入图片描述
      设待求插值点坐标为 (i+u, j+v),已知其周围的 16 个像素坐标点 (网格) 的灰度值,还需要计算 16 个点各自的权重。
      以像素坐标点 (i, j) 为例,因为该点在 y 轴和 x 轴方向上与待求插值点 (i+u, j+v) 的距离分别为 u 和 v,所以的权重为 w(u) × w(v),其中 w(·) 是插值权重核 (可以理解为定义的权重函数)。同理可得其余 15 个像素坐标点各自的权重。那么,待求插值点 (i+u, j+v) 的灰度值 f(i+u, j+v) 将通过如下计算得到:
    f ( i + u , j + v ) = − A × B × C f(i+u, j+v) =- A × B × C f(i+u,j+v)=A×B×C
    其中,各项由向量或矩阵表示:
    d1
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    插值权重核W(·)为:
    W ( x ) = { ( a + 2 ) ∣ x ∣ 3 − ( a + 3 ) ∣ x ∣ 3 + 1 f o r   ∣ x ∣ ⩽ 1 a ∣ x ∣ 3 − 5 a ∣ x ∣ 2 + 8 a ∣ x ∣ − 4 a f o r   1 < ∣ x ∣ < 2 0 o t h e r w i s e , a 通常取 − 0.5 W(x)=\begin{cases} (a+2)|x|^3 - (a+3)|x|^3 + 1 & for \ |x| \leqslant 1\\ a|x|^3 - 5a|x|^2 + 8a|x| - 4a & for \ 1<|x|<2 \\ 0 & otherwise \end{cases},a通常取-0.5 W(x)= (a+2)x3(a+3)x3+1ax35ax2+8ax4a0for x1for 1<x<2otherwisea通常取0.5

当a = -0.5时, W(·)为:
W ( x ) = { 1.5 ∣ x ∣ 3 − 2.5 ∣ x ∣ 3 + 1 f o r   ∣ x ∣ ⩽ 1 − 0.5 ∣ x ∣ 3 + 2.5 ∣ x ∣ 2 − 4 ∣ x ∣ + 2 f o r   1 < ∣ x ∣ < 2 0 o t h e r w i s e , a 通常取 − 0.5 W(x)=\begin{cases} 1.5|x|^3 - 2.5|x|^3 + 1 & for \ |x| \leqslant 1\\ -0.5|x|^3 +2.5|x|^2 -4|x| +2 & for \ 1<|x|<2 \\ 0 & otherwise \end{cases},a通常取-0.5 W(x)= 1.5∣x32.5∣x3+10.5∣x3+2.5∣x24∣x+20for x1for 1<x<2otherwisea通常取0.5

在这里插入图片描述
参考链接:

双三次插值算法(bicubic interpolation)与图形学和计算方法的关系

【图像处理】详解 最近邻插值、线性插值、双线性插值、双三次插值

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

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

相关文章

Redis面试都卷到C语言去了。。。

Redis 面试都卷到 C 去了。有个小伙伴在前两天找松哥模面的时候如是说到。 是啊&#xff0c;没办法&#xff0c;自从 Java 八股文这个概念被提出来并且逐步在 Java 程序员中强化之后&#xff0c;现在各种各样的八股文手册&#xff0c;有免费的有付费的&#xff0c;琳琅满目。 …

实验11 编写子程序《汇编语言》- 王爽

1. 需求 编写一个子程序&#xff0c;将包含任意字符&#xff0c;以 0 结尾的字符串中的小写字母转变成大写字母&#xff0c;描述如下。 名称&#xff1a;letterc 功能&#xff1a;将以 0 结尾的字符串中的小写字母转变成大写字母 参数&#xff1a;ds:di 指向字符串首地址 …

快速排序模版

1.霍尔法 #include <iostream> using namespace std; int partition(int *arr,int left,int right){int pivotIndexleft;while(left<right){while(left<right && arr[right]>arr[pivotIndex]){right--;}while(left<right && arr[left]<a…

新160个crackme - 040-DaNiEl-RJ.1

运行分析 需要破解Name和Serial PE分析 Delphi程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida搜索字符串&#xff0c;找到关键字符串进入 对关键函数进行动调分析&#xff0c;注释和变量重命名如上还需要破解sub_4036E8 通过对比sub_4036E8函数的返回值和Nam…

python面向对象—封装、继承、多态

封装 当定义为私有成员变量时&#xff0c;引用或者打印都不可行。 私有成员对于类对象没有办法直接使用&#xff0c;但是我们类中其他成员却是可以访问这些私有成员的。 封装总结&#xff1a; 私有成员的定义我们已经了但是有什么实际的意义吗&#xff1f; 继承 继承表示&…

系规学习第19天

1.知识管理流程的目标是将运维生产过程中产生的各类信息所包含的知识最大限度地提取、保留&#xff0c;通过评审后加以应用&#xff0c;包括&#xff1a;实现知识共享&#xff0c;实现知识转化&#xff0c;避免知识流失&#xff0c;提高运维响应速度和质量&#xff0c;挖掘、分…

scrapy--图片管道-ImagesPipeline

免责声明:本文仅做演示与分享~ 目录 介绍 ImagesPipeline pipelines.py items.py zz.py settings.py 介绍 scrapy 还提供了处理图片、视频、音频等媒体文件的插件&#xff0c;如&#xff1a; - scrapy-images&#xff1a;用于下载和处理图片 - scrapy-video&#xff1…

<C++> 二叉树进阶OJ题

目录 1. 二叉树创建字符串 2. 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先 3. 二叉树搜索树转换成排序双向链表 4. 根据一棵树的前序遍历与中序遍历构造二叉树 5. 根据一棵树的中序遍历与后序遍历构造二叉树 6. 二叉树的前序遍历&#xff0c;非递归迭代实现 7. 二…

13.全志H3-底板测试和测试记录

上面是我的微信和QQ群&#xff0c;欢迎新朋友的加入。 前段时间&#xff0c;做了一个H3的双DDR方案&#xff0c;记录一下测试过程。 1.硬件速率检测 1.取掉SD卡&#xff0c;不接调试串口&#xff0c;按住复位按键&#xff0c;上电 设备管理器会弹出USB设备&#xff0c;打开硬…

Python|日志记录详解(1)

引言 作为一名Python程序员&#xff0c;记录程序运行时的关键信息是一种有益的做法&#xff0c;这有助于深入理解你的代码。这种记录行为被称作日志记录&#xff0c;它是一个非常实用的工具&#xff0c;是编程工具箱中不可或缺的一部分。日志记录能够帮助你捕捉到在开发过程中可…

哈里和梅根的批评者似乎并不理解“不可征服运动会”的全球影响力

哈里王子和梅根马克尔的批评者似乎无法理解为什么这对夫妇继续像王室之旅一样环游世界。答案很简单&#xff1a;不可征服运动会。苏塞克斯夫妇通过这项体育赛事获得了成功&#xff0c;它为“国际受伤、受伤和生病的军人和女性提供了康复之路”。各国正在争夺未来运动会的主办权…

Photoshop用户必备:PS全套插件分享(PS插件全家桶)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 PS全套插件 📒🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 你是否时常为Photoshop中复杂的操作流程感到困扰,渴望拥有一把钥匙,能瞬间解锁设计效率与创意的新世界?今天,我将给大家分享一款让众多设计师梦寐以求的…

Elasticsearch用法

&#x1f4a5; 该系列属于【SpringBoot基础】专栏&#xff0c;如您需查看其他SpringBoot相关文章&#xff0c;请您点击左边的连接 目录 一、初识elasticsearch 1. 安装Elasticsearch和Kibana 2. 倒排索引 3. IK分词器 4. 基础概念 二、索引库操作 1. Mapping映射属性 2…

IM项目:进阶版即时通讯项目---语音识别和验证码服务

文章目录 语音识别基本功能模块划分流程图实现逻辑解析proto文件 验证码服务 本篇主要是对于该项目的语音识别和验证码服务模块的一个梳理&#xff0c;项目会直接使用部分封装好的内容&#xff0c;可以查看前面的文档或在本文档中进行查看和学习 由于这两个模块非常相似&#…

模型 卡茨管理模型

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。技术、人际、概念&#xff1a;管理技能三支柱。 1 卡茨管理模型的应用 1.1 产品经理能力模型&#xff1a;基于卡茨管理模型的应用 在现代企业管理中&#xff0c;产品经理的角色越来越受到重视。根据…

HTML简单了解和基础知识记录

参考视频 html的用途 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;&#xff0c;用来显示网页的文字和框架结构&#xff0c;可以认为是网页的骨架。 标签/元素 用于定义文字图片连接等&#xff0c;分…

超简单Java邮件发送-为你的小程序实现邮箱验证码登录

本项目基于Apache Commons Email for Jakarta开发。 超简单实现邮箱发送&#xff0c;并以此扩展出邮箱验证码功能(请读者扩展实现)。 构建工具&#xff1a;Maven 演示邮箱&#xff1a;outlook 准备 请确保你的邮箱开启了SMTP服务&#xff0c;并获取相关参数&#xff0c;类似…

51单片机——模块化编程

1、模块化编程介绍 传统方式编程&#xff1a;所有的函数均放在main.c里&#xff0c;若使用的模块比较多&#xff0c;则一个文件内会有很多的代码&#xff0c;不利于代码的组织和管理&#xff0c;而且很影响编程者的思路。 模块化编程&#xff1a;把各个模块的代码放在不同的.…

诊断知识:agedDTCLimit的使用

文章目录 前言agedDTCLimit的定义agedDTCLimit的使用图解agedDTCLimit总结 前言 ECU中的存储空间一般无法将所有的DTC同时记录故障数据&#xff0c;所以故障发生之后记录的数据&#xff0c;需要在一段时间后未出现故障则自动清除&#xff0c;以保证新的故障出现时&#xff0c;…