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

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

  • 代码
  • 原理

代码

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

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_wh
    out_w,out_h = out_wh
    inp = 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_wh
    p_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_val
    return 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表示对应区域的面积

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣经典150题第三十六题:旋转图像

目录 力扣经典150题第三十六题:旋转图像引言题目详解解题思路代码实现示例演示复杂度分析总结扩展阅读 力扣经典150题第三十六题:旋转图像 引言 本篇博客介绍了力扣经典150题中的第三十六题:旋转图像。题目要求将给定的 n n 二维矩阵顺时针…

玩转 AIGC!使用 SD-WebUI 实现从文本到图像转换

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 基于大家…

“AI 程序员入职系列”第二弹:如何利用通义灵码光速改写项目编程语言?

通义灵码入职阿里云云原生团队后,已经展示过 Ta 生成单元测试和自动生成代码的强大实力。今天,阿里云后端工程师云徊将从项目开发的实际需求出发,演示通义灵码在开发工作中可提供的帮助。 通义灵码在 Git 开发项目中起到了哪些作用&#xff…

小白必备:Python必须掌握的十大模块,建议收藏!

前言 Python 是一种高级、解释型和通用动态编程语言,侧重于代码的可读性。 它在许多组织中使用,因为它支持多种编程范例。 它还执行自动内存管理。 它是世界上最受欢迎的编程语言之一。 这是有很多原因的: 这很容易学习。它超级多才多艺。…

Jenkins 构建踩坑经历

SourceLink.Create.CommandLine.targets(30,5): error : unable to convert OriginUrl: 打开报错“SourceLink.Create.CommandLine.targets”文件所在编辑此文件,找到30行 修改如下

浮动的4个案例详解:网易云音乐列表/导航,淘宝banner区,文字环绕

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生,一枚程序媛,感谢关注。回复 “前端基础题”,可免费获得前端基础 100 题汇总,回复 “前端工具”,可获取 Web 开发工具合…

如何在Windows10中管理自动维护?这里有详细步骤

为了使你的Windows操作系统和应用程序保持最新状态并保持良好的健康,有必要定期进行Windows维护。 ​快速的方法是启动自动维护,这样Windows就可以每天自动运行维护任务,包括软件更新、安全扫描和系统诊断。本文介绍了一个在Windows10中管理…

Arthas介绍及使用技巧

文章目录 简介能做什么? 使用下载并启动arthas选择应用 java 进程退出 arthas 常用查看命令帮助查看 dashboard通过 thread 命令来获取到线程的栈通过 jad 来反编译 Classwatch 查看方法出入参、sc 搜索类: 查看已加载类所在的包monitor 方法执行监控trace 方法内调…

HTML 如何实现一个带间隙的圆环

实际效果&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5e634cedded9424d96fbe6d46f34f61a.png#pic_center 代码实现&#xff1a; HTML部分&#xff1a; <svg width"500" height"500" viewBox"0 0 100 100">&…

VideoComposer: Compositional Video Synthesis with Motion Controllability

decompose videos into three distinct types of conditions: textual conditions, spatial conditions, temperal conditions 条件的内容&#xff1a; a. textual condition: coarse grained visual content and motions, 使用openclip vit-H/14的text encoder b. spatial co…

Gradle的Tasks显示不全

前言&#xff1a; 在修改了app级别的build.gradle或者project的buid.gradle之后&#xff0c;在androidstudio的gradle中没有看到配置的task。原因是需要打开gradle的配置项 1.修改位置&#xff1a; 2.将划红线的这项配置的对勾去掉&#xff0c;然后点击”大象“同步

世界读书日:探索阅读的多样性样性——漫画、图解、图形化立体图书

在当今信息爆炸的时代&#xff0c;阅读已经不再局限于传统的书籍形式。随着科技的发展和文化的多样化&#xff0c;人们可以通过多种形式来获取知识和享受阅读的乐趣。从漫画、图解到图形化立体图书&#xff0c;每一种形式都有其独特的魅力&#xff0c;适合不同类型的读者和学习…

机器人实验室CNRS-AIST JRL, IRL介绍

一、背景 作为搞机器人方向的学生&#xff0c;必须时常关注国际上顶尖实验室的研究成果&#xff0c;以免自己做的方向out&#xff0c;除了大家耳熟能详的Boston Dynamics&#xff0c;还有许多非常厉害的机器人实验室值得我们关注&#xff0c;如日本的CNRS-AIST JRL, IRL实验室…

认识产品经理

一、合格的产品经理 1、什么是产品 解决某个问题的东西&#xff0c;称为产品 键盘可以打字&#xff0c;想喝水了可以用水壶&#xff0c;在超市想找一款扫把会有导购员服务 产品有颜色、大小等等区别&#xff0c;也有有形和无形的区别 2、什么是产品经理 想清楚怎么设计产品…

c++ - 类与对象 - explicit关键字 | static成员 | 友元 | 内部类 | 匿名对象

文章目录 一、 explicit关键字二、static成员三、友元四、内部类五、匿名对象 一、 explicit关键字 1、隐式类型转换 再进行隐式类型转换是会产生一个临时变量tmp,再用临时变量进行赋值。 如&#xff1a; double d 1.2; //再用 d 给 i 进行赋值时&#xff0c;会进行隐式类型…

【Web】AFCTF 2021 题解(部分)

目录 BABY_CSP search secret google authenticator 随便做做&#xff0c;环境是NSS上的 BABY_CSP CSP绕过_script-src self-CSDN博客 CSP指令值 *&#xff1a; 星号表示允许任何URL资源&#xff0c;没有限制&#xff1b; self&#xff1a; 表示仅允许来自同源&#xff…

数据结构-循环队列和循环双端队列的多角度实现

文章目录 1. 循环队列的数组形式实现2. 循环队列的链表实现3. 循环双端队列的数组形式实现4. 循环双端队列的链表实现 在力扣的题面如下 1. 循环队列的数组形式实现 其实循环队列的数组形式只有下面要注意的点,只要掌握了下面的这几点,代码层面上就没有什么问题了 用数组模拟的…

了解 Unity AI:从初学者到高级的综合指南

游戏中的AI是什么? 游戏中的人工智能是指利用人工智能技术使视频游戏中的非玩家角色和实体智能地行动、做出决策、对游戏环境做出反应,并提供引人入胜的动态游戏体验。什么是NPC? NPC 代表“非玩家角色”。NPC 是视频游戏、角色扮演游戏中不受人类玩家控制的角色。它们是计算…

Git 新手快速入门教程

一、什么是 Git 1. 何为版本控制 版本控制是一种记录文件变化的系统&#xff0c;可以跟踪文件的修改历史&#xff0c;并允许用户在不同版本之间进行比较、恢复或合并。它主要用于软件开发过程中管理代码的变更&#xff0c;但也可以应用于任何需要跟踪文件变更的场景。 版本控…

【学习笔记二十一】EWM仓库两步拣配配置及操作展示

一、EWM两步拣配配置 1.定义两步拣配的WPT ①第一步:标准WPT2020,目标仓位是2010两步拣配的仓位,并创建存储类型2010的两步拣配的仓位 ②第二步,标准WPT2010,目标仓位9020发货区和发货的仓位 2.定义确定仓库处理类型的控制标识 3.确定仓库处理类型 4.仓库编码级别需要允…