双线性插值计算手动实现以及原理

双线性插值计算手动实现以及原理

  • 代码
  • 原理

代码

先贴代码吧,原理其实也比较简单,看代码基本也就理解了,时间太晚了,原理后续再补吧。

import torch
from torch.nn import functional as F
import numpy as np
from itertools import product
import warnings
warnings.filterwarnings('ignore')
def data_gen(in_wh,out_wh):in_w,in_h = in_whout_w,out_h = out_whinp = torch.range(0,in_h*in_w-1,1).reshape(1,1,in_h, in_w)new_h = torch.linspace(-1, 1, out_h).view(-1, 1).repeat(1, out_w)new_w = torch.linspace(-1, 1, out_w).repeat(out_h, 1)grid = torch.cat((new_w.unsqueeze(2), new_h.unsqueeze(2)), dim=2)#+2/5# print(grid.shape)grid = grid.unsqueeze(0).clip(-1,1)return inp,grid
def torch_interp(in_wh,out_wh):'''torch 插值'''inp,grid = data_gen(in_wh,out_wh)print(inp)outp = F.grid_sample(inp, grid=grid, align_corners=True)# print(outp)return outp
def my_interp(in_wh,out_wh):'''手动实现的插值计算'''inp,grid = data_gen(in_wh,out_wh)in_w,in_h = in_whp_h = 2/(in_h-1)#计算h方向上每一份的长度p_w = 2/(in_w-1)#计算w方向上每一份的长度p_ = np.array([p_w,p_h])#合并inp = inp[0,0,:,:]grid = grid[0]out = np.zeros((grid.shape[0],grid.shape[1]))#初始化输出模板for (_i,_j) in product(range(grid.shape[0]),range(grid.shape[1])):maps = (grid[_i,_j]).cpu().numpy()interp_start = (maps+1)//p_#计算插值的起始点offset = (maps+1)%p_#计算距离起始点的偏移量interp_start = interp_start.astype(np.int32)# print(interp_start)w, pix = [], []for j,i in [(0,0),(0,1),(1,0),(1,1)]:w.append(abs((i*p_[0]-offset[0])*(p_[1]*j-offset[1]))/(p_[0]*p_[1]))#双线性插值的面积计算interp_start_ = interp_start+np.array([i,j])#计算插值的四个点中的某一个interp_start_[0]=interp_start_[0].clip(0,in_w-1)#控制不超出原图像边界interp_start_[1]=interp_start_[1].clip(0,in_h-1)pix.append(inp[interp_start_[1]][interp_start_[0]])w = np.array(w)pix = np.array(pix[::-1])interp_val = round((w*pix).sum(),3)out[_i,_j]=interp_valreturn out
#原始输入
in_wh = 9, 9
#目标输出
out_wh =5, 2
a = torch_interp(in_wh,out_wh)
b = my_interp(in_wh,out_wh)
print(a,b)

结果:

tensor([[[[ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.],[ 9., 10., 11., 12., 13., 14., 15., 16., 17.],[18., 19., 20., 21., 22., 23., 24., 25., 26.],[27., 28., 29., 30., 31., 32., 33., 34., 35.],[36., 37., 38., 39., 40., 41., 42., 43., 44.],[45., 46., 47., 48., 49., 50., 51., 52., 53.],[54., 55., 56., 57., 58., 59., 60., 61., 62.],[63., 64., 65., 66., 67., 68., 69., 70., 71.],[72., 73., 74., 75., 76., 77., 78., 79., 80.]]]])
(tensor([[[[ 0.,  2.,  4.,  6.,  8.],[72., 74., 76., 78., 80.]]]]),array([[ 0.,  2.,  4.,  6.,  8.],[72., 74., 76., 78., 80.]]))

自己试了几组数据,结果均与torch一致。
在这里插入图片描述

原理

先简要说一下原理吧
在线性插值的情况下:
在这里插入图片描述

假设AB=AD/2,那么B的坐标等于(1-0.5)×A+0.5×D= 3.5
那么C点坐标等于(1-0.6)×A+0.6×D=3.8
那么在双线性插值的情况下,
增加了一个维度
在这里插入图片描述

E的像素值等于e = (D×a+B×c+A×d+C×b)/(A+B+C+D)
其中ABCD表示对应区域的面积

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式linux学习之arm开发板移植ssh

1.下载源码 (1)zlib 下载网址:http://www.zlib.net/fossils/ 教程中版本选择的是: zlib-1.2.11.tar.gz (2)openssl下载网址:https://www.openssl.org/source/mirror.html 教程中版本选择的是: openssl-1.1…

仿真数据和实测数据的时频变换

目录 1.仿真数据2.实测数据3.地震信号数据4.语音数据 1.仿真数据 2.实测数据 3.地震信号数据 4.语音数据

嵌入式Linux开发实操(十九):Nand Flash驱动的实现

前言: nand flash从硬件连接上看,如下图,有专用接口,数据线有8或16根。 Nand Flash按每个存储单元Cell内存储比特个数不同可分为 SLC(Single-Level Cell存储1个比特)、MLC(Multi-Level Cell存储2个比特) 、 TLC(Triple-Level Cell存储3个比特)、QLC(Quad-Level C…

vue3【详解】选项式 API 实现逻辑复用

抽离逻辑代码到一个函数函数命名约定为 useXxxx格式 ( React Hooks 也是 )在 setup 中引用 useXxx 函数 演示代码:实时获取鼠标的坐标 逻辑封装 useMousePosition.js // 导入 ref, onMounted, onUnmounted import { ref, onMounted, onUnmounted } from "vue…

HarmonyOS开发案例:【视频播放器】

介绍 基于video、swiper和slider组件,实现简单的视频播放器,可支持海报轮播、视频播放等功能。 相关概念 [video组件]:视频播放组件。[swiper组件]:滑动容器,提供切换子组件显示的能力。[slider组件]:滑…

代码随想录算法训练营第五十九天 | 503. 下一个更大元素 II、42. 接雨水

代码随想录算法训练营第五十九天 | 503. 下一个更大元素 II、42. 接雨水 503. 下一个更大元素 II题目解法 42. 接雨水题目解法 感悟 503. 下一个更大元素 II 题目 解法 题解链接 使用两个size class Solution { public:vector<int> nextGreaterElements(vector<in…

电磁兼容(EMC):静电放电(ESD)抗扰度试验深度解读(五)

静电放电过程是一个很复杂的过程&#xff0c;下面比对人体持金属对产品放电和静电发生器对产品进行接触放电过程的详细分解说明。 1. 人持金属对产品放电过程 人对产品所产生的静电放电&#xff0c;会发生下面一系列的事件&#xff1a; 1&#xff09;当手持金属片接近产品的…

面试十八、容器适配器

容器适配器是一种特殊类型的容器&#xff0c;它们提供了一种不同于常规容器的接口和行为。容器适配器通常是建立在其他容器之上&#xff0c;通过改变接口或添加限制来满足特定的需求或解决特定的问题。 在 C 中&#xff0c;标准库提供了三种常见的容器适配器&#xff1a; 栈&am…

fastgpt、dify功能分析比较

目录 前言 一、dify、fastgpt是什么&#xff1f; 二、同场pk 1.大模型接入 2.chat&#xff08;最简应用&#xff09; 3.发布应用 4.知识库 5.workflow 6.其他 三、一些point记录 总结 前言 现在都开始AI应用开发&#xff0c;何谓AI应用&#xff0c;起码要和AI大模型…

Robbins-Monro(RM)算法【随机近似】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实践—GridWorld 第…

一招下载transformers真不用网上那些教程(我试了1*mol多次才知道)

pip很多是2 然而&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;…

stable diffusion Temporal-kit和EbSynth视频转动画学习笔记

1、打开stable diffsuion webui 点击Temporal-kit 页签&#xff0c;再点击预处理pre-processing,上传视频 在工作目录下得到拆分的关键帧,在input目录里 打开图生图&#xff0c;输入正反描述词&#xff0c;其他配置如下 批量生成图片&#xff0c;找到最满意的那一张&#xff0…