【数字图像处理】图像的最近邻插值、双线性插值和双三次插值

news2024/11/25 10:37:18

图像最近邻插值、双线性插值和双三次插值

O ( X , Y ) O(X,Y) O(X,Y)表示 H × W H\times W H×W的原始图像, G ( X ^ , Y ^ ) G(\hat{X},\hat{Y}) G(X^,Y^)表示 H ^ × Y ^ \hat{H}\times\hat{Y} H^×Y^的目标图像。

最近邻插值

最近邻插值法令目标图像在 ( x ^ , y ^ ) (\hat{x},\hat{y}) (x^,y^)的像素值 G ( x ^ , y ^ ) G(\hat{x},\hat{y}) G(x^,y^)等于逆变换到原始图像后 ( x , y ) (x,y) (x,y) 距离其最近的点的像素值。用公式表示为:

G ( x ^ , y ^ ) = O ( round ⁡ ( x ^ ⋅ W W ^ ) , round ⁡ ( y ^ ⋅ H H ^ ) ) G(\hat{x}, \hat{y})=O\left(\operatorname{round}\left(\frac{\hat{x} \cdot W}{\hat{W}}\right), \operatorname{round}\left(\frac{\hat{y} \cdot H}{\hat{H}}\right)\right) G(x^,y^)=O(round(W^x^W),round(H^y^H))

其中 x ^ ⋅ W W ^ \frac{\hat{x}\cdot W}{\hat{W}} W^x^W y ^ ⋅ H H ^ \frac{\hat{y}\cdot H}{\hat{H}} H^y^H为逆变换; r o u n d ( ) round() round()表示四舍五入,用于得到源图像中的最近点坐标。

双线性插值


双线性插值使用的逆变换为(需要考虑对齐):

x = x ^ ( W / W ^ ) + 0.5 ( W / W ^ − 1 ) y = y ^ ( H / H ^ ) + 0.5 ( H / H ^ − 1 ) \begin{array}{l} x=\hat{x}(W / \hat{W})+0.5(W / \hat{W}-1) \\ y=\hat{y}(H / \hat{H})+0.5(H / \hat{H}-1) \end{array} x=x^(W/W^)+0.5(W/W^1)y=y^(H/H^)+0.5(H/H^1)

双线性插值是在 X X X上进行两次线性插值计算,然后在 Y Y Y方向上进行一次插值计算。首先在 X X X方向上进行两次线性插值,得到:
O ( x , y 0 ) = x 1 − x x 1 − x 0 O ( x 0 , y 0 ) + x − x 0 x 1 − x 0 O ( x 1 , y 0 ) O ( x , y 1 ) = x 1 − x x 1 − x 0 O ( x 0 , y 1 ) + x − x 0 x 1 − x 0 O ( x 1 , y 1 ) \begin{array}{l} O\left(x, y_{0}\right)=\frac{x_{1}-x}{x_{1}-x_{0}} {O}\left(x_{0}, y_{0}\right)+\frac{x-x_{0}}{x_{1}-x_{0}} {O}\left(x_{1}, y_{0}\right) \\ O\left(x, y_{1}\right)=\frac{x_{1}-x}{x_{1}-x_{0}} {O}\left(x_{0}, y_{1}\right)+\frac{x-x_{0}}{x_{1}-x_{0}} O\left(x_{1}, y_{1}\right) \end{array} O(x,y0)=x1x0x1xO(x0,y0)+x1x0xx0O(x1,y0)O(x,y1)=x1x0x1xO(x0,y1)+x1x0xx0O(x1,y1)

然后在 Y Y Y方向上进行一次线性插值,得到:
O ( x , y ) = y 1 − y y 1 − y 0 O ( x , y 0 ) + y − y 0 y 1 − y 0 O ( x , y 1 ) O(x, y)=\frac{y_{1}-y}{y_{1}-y_{0}} O\left(x, y_{0}\right)+\frac{y-y_{0}}{y_{1}-y_{0}} O\left(x, y_{1}\right) O(x,y)=y1y0y1yO(x,y0)+y1y0yy0O(x,y1)

综合起来,就是双线性插值的结果
G ( x ^ , y ^ ) = ( y 1 − y ) ( x 1 − x ) ( y 1 − y 0 ) ( x 1 − x 0 ) O ( x 0 , y 0 ) + ( y 1 − y ) ( x − x 0 ) ( y 1 − y 0 ) ( x 1 − x 0 ) O ( x 1 , y 0 ) + ( y − y 0 ) ( x 1 − x ) ( y 1 − y 0 ) ( x 1 − x 0 ) O ( x 0 , y 1 ) + ( y − y 0 ) ( x − x 0 ) ( y 1 − y 0 ) ( x 1 − x 0 ) O ( x 1 , y 1 ) \begin{aligned} G(\hat{x}, \hat{y})= & \frac{\left(y_{1}-y\right)\left(x_{1}-x\right)}{\left(y_{1}-y_{0}\right)\left(x_{1}-x_{0}\right)} {O}\left(x_{0}, y_{0}\right) \\ & +\frac{\left(y_{1}-y\right)\left(x-x_{0}\right)}{\left(y_{1}-y_{0}\right)\left(x_{1}-x_{0}\right)} O\left(x_{1}, y_{0}\right) \\ & +\frac{\left(y-y_{0}\right)\left(x_{1}-x\right)}{\left(y_{1}-y_{0}\right)\left(x_{1}-x_{0}\right)} O\left(x_{0}, y_{1}\right) \\ & +\frac{\left(y-y_{0}\right)\left(x-x_{0}\right)}{\left(y_{1}-y_{0}\right)\left(x_{1}-x_{0}\right)} O\left(x_{1}, y_{1}\right) \end{aligned} G(x^,y^)=(y1y0)(x1x0)(y1y)(x1x)O(x0,y0)+(y1y0)(x1x0)(y1y)(xx0)O(x1,y0)+(y1y0)(x1x0)(yy0)(x1x)O(x0,y1)+(y1y0)(x1x0)(yy0)(xx0)O(x1,y1)

双三次插值

如图3所示,双三次插值通过对周边16个点进行加权计算得到目标像素点的值,加权系数常采用基于BiCubic基函数的方法,该函数形式如下:

W ( d ) = { ( a + 2 ) ∣ d ∣ 3 − ( a + 3 ) ∣ d ∣ 2 + 1  for  ∣ d ∣ ≤ 1 a ∣ d ∣ 3 − 5 a ∣ d ∣ 2 + 8 a ∣ d ∣ − 4 a  for  1 < ∣ d ∣ < 2 0  otherwise  W(d)=\left\{\begin{array}{cc} (a+2)|d|^{3}-(a+3)|d|^{2}+1 & \text { for }|d| \leq 1 \\ a|d|^{3}-5 a|d|^{2}+8a|d|-4 a & \text { for } 1<|d|<2 \\ 0 & \text { otherwise } \end{array}\right. W(d)= (a+2)d3(a+3)d2+1ad35ad2+8ad4a0 for d1 for 1<d<2 otherwise 

其中 a a a通常为-0.5或-1, d d d为16个点到 ( x , y ) (x,y) (x,y)沿 X X X Y Y Y轴的距离。双三次插值通过以下公式进行计算:

G ( x ^ , y ^ ) = ∑ m = 0 3 ∑ n = 0 3 W ( x m ) ⋅ W ( y n ) ⋅ O ( x m , y n ) G(\hat{x}, \hat{y})=\sum_{m=0}^{3} \sum_{n=0}^{3} W\left(x_{m}\right) \cdot W\left(y_{n}\right) \cdot O\left(x_{m}, y_{n}\right) G(x^,y^)=m=03n=03W(xm)W(yn)O(xm,yn)

import cv2 as cv
import matplotlib.pyplot as plt
img = plt.imread('***.jpg')
img_down = cv.resize(img, None, fx=0.2, fy=0.2, interpolation=cv.INTER_NEAREST)
img_up1 = cv.resize(img, None, fx=10, fy=10, interpolation=cv.INTER_NEAREST) # 最近邻插值
img_up2 = cv.resize(img, None, fx=10, fy=10, interpolation=cv.INTER_LINEAR)  # 双线性插值
img_up3 = cv.resize(img, None, fx=10, fy=10, interpolation=cv.INTER_CUBIC)  # 双三次插值


cv.imwrite('dowm5x.jpg', img_down)
cv.imwrite('INTER_NEAREST10x.jpg', img_up1)
cv.imwrite('INTER_LINEAR10x.jpg', img_up2)
cv.imwrite('INTER_CUBIC10x.jpg', img_up3)

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

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

相关文章

代码随想录-二叉树【从中序与后序遍历序列构造二叉树】

题目 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如&#xff0c;给出 中序遍历 inorder [9,3,15,20,7]后序遍历 postorder [9,15,7,20,3] 返回如下的二叉树&#xff1a; 思路 首先回忆一下如何根据两个顺序构造一个唯一的二叉…

JavaScript前端学习大全

一、概念 JavaScript简称为JS&#xff0c;这门语言诞生主要用于完成页面的数据验证&#xff0c;因此运行在客户端&#xff0c;需要浏览器来解析JavaScript的代码。是世界上最流行的脚本语言。JavaScript 是一种让网页变得有趣和动态的编程语言。比如&#xff0c;当你在网页上点…

Java的编程之旅44——学生信息管理系统

目录 1.MVC设计模式初探 文件结构的搭建 2.Student类用来初始化学生信息 3.主函数里的两个功能 1.调用初始化学生信息的功能 2.输出欢迎界面功能 4.Global类中方法的编写 5.StuPage类&#xff0c;StuCtrl类&#xff0c;StuModel类中方法的编写 1.查询功能 selStu方法的…

蓝桥杯真题:单词分析

import java.util.Scanner; //1:无需package //2: 类名必须Main, 不可修改 public class Main{public static void main(String[]args) {Scanner sannernew Scanner(System.in);String strsanner.nextLine();int []anew int [26];for(int i0;i<str.length();i) {a[str.charA…

使用vite创建一个react18项目

一、vite是什么&#xff1f; vite 是一种新型前端构建工具&#xff0c;能够显著提升前端开发体验。它主要由两部分组成&#xff1a; 一个开发服务器&#xff0c;它基于原生 ES 模块提供了丰富的内建功能&#xff0c;如速度快到惊人的模块热更新&#xff08;HMR&#xff09;。 …

iOS苹果签名共享签名是什么以及如何获取?

哈喽&#xff0c;大家好呀&#xff0c;咕噜淼淼又来和大家见面啦&#xff0c;最近有很多朋友都来向我咨询共享签名iOS苹果IPA共享签名是什么&#xff0c;针对这个问题&#xff0c;淼淼来解答一下大家的疑惑并告诉大家iOS苹果ipa共享签名需要如何获取。 现在苹果签名在市场上的…

CSS(二)---【常见属性、复合属性使用】

零.前言 本篇文章主要阐述CSS常见属性、复合属性&#xff0c;更多前置知识请见作者其它文章&#xff1a; CSS(一)---【CSS简介、导入方式、八种选择器、优先级】-CSDN博客 1.CSS属性 CSS的属性有上百个&#xff0c;但是我们并不需要全部学习&#xff0c;只要我们学习一部分…

二叉树 - 栈 - 计数 - leetcode 331. 验证二叉树的前序序列化 | 中等难度

题目 - 点击直达 leetcode 331. 验证二叉树的前序序列化 | 中等难度1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理方法1&#xff1a;栈方法2&#xff1a;计数 3. 时间复杂度 3. 代码实现方法1&#xff1a;栈方法2&#xff1a;计数 leetcode 331. 验证二…

通俗易懂的JMeter调试错误全集

一、前言 在使用jmeter做接口测试的过程中大家是不是经常会遇到很多问题&#xff0c;但是无从下手&#xff0c;不知道从哪里开始找起&#xff0c;对于初学者而言这是一个非常头痛的事情。这里总结出以下方法。 二、通过查看运行日志调试问题 写好脚本后&#xff0c;可以先试…

HarmonyOS实战开发-为应用添加运行时权限

介绍 通过AbilityAccessCtrl动态向用户申请“允许不同设备间的数据交换”的权限&#xff0c;使用设备管理实例获取周边不可信设备列表。 说明&#xff1a; 查询周边不可信设备之前&#xff0c;请确保本设备与周边设备未进行配对。如果已配对&#xff0c;则恢复出厂设置之后重新…

税务知识竞赛活动方案

为了提高税务工作人员的业务技能和知识&#xff0c;现在全市范围开展税务知识竞赛&#xff0c;希望通过“以赛促学”&#xff0c;在税务系统掀起一场税务知识学习热潮。下面是本次竞赛的活动方案。 1、第一轮&#xff1a;争分夺秒。选择题或判断题&#xff0c;每位参赛选手按编…

LiDAR和Camera融合的BEV感知算法-BEVFusion

0. 简述 本次给大家讲解一篇非常经典的融合工作叫 BEVFusion&#xff0c;我们依旧从算法动机&开创性思路、主体结构、损失函数以及性能对比四个方面展开 BEVFusion 有两篇文章&#xff0c;本次主要讲解的是阿里和北大的&#xff1a;BEVFusion: A Simple and Robust LiDAR-…

Docker容器与虚拟化技术:OpenEuler 部署 Docker UI

目录 一、实验 1.环境 2.OpenEuler 部署 docker-compose-ui 2.OpenEuler 部署 docker ui 3.使用cpolar内网穿透 二、问题 1.docker run -w 的作用 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 192.168…

MQ

目录 MQ优点 异步 解耦 削峰填谷 mq的缺点 MQ常见的几种模式 Kafka、ActiveMQ、RabbitMQ、RocketMQ 区别 MQ优点 mq是一种常见的中间件&#xff0c;在项目中经常用到&#xff0c;它具有异步、解耦、削峰填谷的作用。 异步 比如下单流程&#xff0c;A服务—>B服务&a…

SiameseRPN原理详解(个人学习笔记)

参考资源&#xff1a; 视觉目标跟踪SiamRPNSiameseRPN详解CVPR2018视觉目标跟踪之 SiameseRPN 目录&#xff09; 1. 模型架构1.1 Siamese Network1.2 RPN 2. 模型训练2.1 损失函数2.2 端到端训练2.3 正负样本选择 3. 跟踪阶段总结 SiamRPN是在SiamFC的基础上进行改进而得到的一…

FreeRTOS_day3:2024/4/2

1.总结任务调度算法之间的区别&#xff0c;重新实现一遍任务调度算法的代码。 (1)抢占式调度&#xff1a;高优先级任务可以打断低优先级任务&#xff0c;用于任务优先级不同的任务 (2)时间片轮转&#xff1a;相同优先级的任务&#xff0c;分配相同的时间片(一般为 1ms)&#x…

解决GNU Radio+USRP实现OFDM收发在接收端存在误码问题

文章目录 前言一、OFDM 收发流程1、OFDM 收端流程2、OFDM 收端流程 二、问题所在1、find_trigger_signal 函数解读2、general_work 函数3、问题所在 三、修改源码四、运行结果1、频谱2、传输数据测试 五、调试小技巧六、资源自取 前言 在使用 GNU Radio 时使用官方例程搭建 GN…

游戏引擎之高级动画技术

一、动画混合 当我们拥有各类动画素材&#xff08;clips&#xff09;时&#xff0c;要将它们融合起来成为一套完整的动画。 最经典的例子就是从走的动画自然的过渡到跑的动画。 1.1 线性插值 不同于上节课的LERP&#xff08;同一个clip内不同pose之间&#xff09;&#xff…

学习使用echats因xAxis值过多,可以滚动的柱状图解决方案

学习使用echats因xAxis值过多&#xff0c;可以滚动的柱状图解决方案 效果图柱状图代码关键代码 效果图 柱状图代码 function echarts() {// 基于准备好的dom&#xff0c;初始化echarts实例var myChart echarts.init(document.getElementById(echart4));let xaxisData [1, 2,…