本文实现的是双线性插值,cubic道理一样
需要注意的是,当矩阵特别大时候,加入numba速度很快
矩阵小的话,提取numba有开销

import numba as nb
import numpy as np
import timedef interp2(x,y,img,xi,yi):"""按照matlab interp2写的加速2d插值当矩阵规模很大的时候,numba就快,矩阵规模小,则启动numba有开销原图是规整矩阵才能这么做"""# @nb.jitdef _interpolation(x,y,m,n,mm,nn,zxi,zyi,alpha,beta,img,return_img):qsx = int(m/2)qsy = int(n/2)for i in range(mm):     # 行号for j in range(nn):zsx,zsy = int(zxi[i,j]+qsx),int(zyi[i,j]+qsy)  # 左上的列坐标和行坐标zxx,zxy = int(zxi[i,j]+qsx),int(zyi[i,j]+qsy+1) # 左下的列坐标和行坐标ysx,ysy = int(zxi[i,j]+qsx+1),int(zyi[i,j]+qsy)  # 右上的列坐标和行坐标yxx,yxy = int(zxi[i,j]+qsx+1),int(zyi[i,j]+qsy+1) # 右下的列坐标和行坐标fu0v = img[zsy,zsx]+alpha[i,j]*(img[ysy,ysx]-img[zsy,zsx])fu0v1 = img[zxy,zxx]+alpha[i,j]*(img[yxy,yxx]-img[zxy,zxx])fu0v0 = fu0v+beta[i,j]*(fu0v1-fu0v)return_img[i,j] = fu0v0 return return_imgm,n = img.shape  # 原始大矩阵大小mm,nn = xi.shape # 小矩阵大小,mm为行,nn为列zxi = np.floor(xi)  # 用[u0]表示不超过S的最大整数zyi = np.floor(yi)alpha = xi-zxi   # u0-[u0]beta = yi-zyireturn_img = np.zeros((mm,nn))return_img = _interpolation(x,y,m,n,mm,nn,zxi,zyi,alpha,beta,img,return_img)return return_imgyc = 33
initimg = np.random.randint(0,255,size=(yc,yc)).astype('float')
ycb = (yc-1)/2
xx = np.linspace(-ycb,ycb,yc)
yy = np.linspace(-ycb,ycb,yc)
x,y = np.meshgrid(xx,yy)
hc = yc - 6
hcb = (hc-1)/2
uu = np.linspace(-hcb,hcb,hc)
vv = np.linspace(-hcb,hcb,hc)
u,v = np.meshgrid(uu,vv)
jianjuzhen = np.random.rand(hc,hc)
u = u - jianjuzhen
jianjuzhen = np.random.rand(hc,hc)
v = v - jianjuzhenaa = time.time()
done_img = interp2(x,y,initimg,u,v)
print(time.time()-aa)

还有一种方法

def interp2_(x,y,img,xi,yi):"""最终版 very nicex, y: 初始坐标img: 待插值图像xi, yi: 插值图像坐标使用双线性插值实现:-----------------------------| q11(x1, y1) | q12(x1, y2) |q(x,y) | q21(x2, y1) | q22(x2, y2) |-----------------------------f(x, y) = 1/(x2-x1)(y2-y1)*[f(x1,y1)*(x2-x)(y2-y))+f(x1, y2)*(x2-x)(y-y1)+ f(x2, y1)*(x-x1)(y2-y)+f(x2, y2)*(x-x1)(y-y1)](x2-x1)(y2-y1)理论上是1"""cd = len(x)img_itp = torch.ones([cd, cd])#.cuda(0)zxi = torch.floor(xi).to(torch.int16)  # 变形图坐标的左上角x坐标zxi[zxi<0]=0zxi[zxi>cd-1]=cd-1syi = torch.floor(yi).to(torch.int16)  # 变形图坐标的左上角y坐标syi[syi<0]=0syi[syi>cd-1]=cd-1yxi = torch.floor(xi).to(torch.int16)+1  # 变形图坐标的右上角x坐标yxi[yxi<0]=0yxi[yxi>cd-1]=cd-1xyi = torch.floor(yi).to(torch.int16)+1  # 变形图坐标的左下角y坐标xyi[xyi<0]=0xyi[xyi>cd-1]=cd-1for i in range(cd-1):   # 这里表示插值图像的下标for j in range(cd-1) :x2_x = yxi[j,i] - xi[j,i]x_x1 = xi[j,i] - zxi[j,i]y2_y = xyi[j,i] - yi[j,i]y_y1 = yi[j,i] - syi[j,i]# q11: img[j, i], q12: img[j, i+1], q21: img[j+1, i], # q22: img[j+1, i+1]img_itp[j, i] = (img[syi[j,i], zxi[j,i]] * y2_y * x2_x + \img[syi[j,i], yxi[j,i]] * y2_y * x_x1 + \img[xyi[j,i], zxi[j,i]] * y_y1 * x2_x + \img[xyi[j,i], yxi[j,i]] * y_y1 * x_x1 )return img_itp

上面这个经过测试完全没有问题

matlab中interp2的python实现(经matlab测试通过)相关推荐

  1. matlab中e用什么表示什么,matlab中e怎么表示

    方法/步骤 1.自然数对数 log(x) 我们在MATLAB主窗口中输入a1=log(2.7183),回车,我们可以看到a1近似为1,e约等 于2. MATLAB中 如何输入对数函数? 方法/步骤 1 ...

  2. fname什么意思matlab,matlab中f(:,1)是什么意思 matlab中f(:,:,3)是什么意思?

    导航:网站首页 > matlab中f(:,1)是什么意思 matlab中f(:,:,3)是什么意思? matlab中f(:,1)是什么意思 matlab中f(:,:,3)是什么意思? 相关问题: ...

  3. matlab的length是什么,大家好!matlab中length是什么意思?,matlab中的length表示什么?应该如何使用?...

    导航:网站首页 > 大家好!matlab中length是什么意思?,matlab中的length表示什么?应该如何使用? 大家好!matlab中length是什么意思?,matlab中的leng ...

  4. 使用matlab中PCA包进行训练集与测试集处理

    使用matlab中PCA包进行训练集与测试集处理 1. matlab中PCA包的使用与分析 2. 训练集与测试集降维处理 1. matlab中PCA包的使用与分析 [coeff, score, lat ...

  5. matlab中 y =ft(x)的意思,matlab中y=fft(x)语句的意思

    matlab傅里叶变换中fft(x,n),x,n分别是什么含义? fft(x,n)是一维快速傅里叶变换,x相当于信号,n是变换点数.离散傅里叶变换DFT的快速算法就是FFT. matlab中FFT函数 ...

  6. 范德蒙德矩阵在MATLAB中怎么表示,Python 之 Python与MATLAB 矩阵操作总结

    Python 之 Python与MATLAB 矩阵操作小结 一.线形代数理论基础 线形代数(linear algebra)是数学的一个分支,研究矩阵理论.向量空间.线性变换和有限维线形方程组等内容. ...

  7. matlab中quat2angle,RPY_Euler_Quaternion_AngleAxis角度转化:Matlab、Python、Halcon版本

    UR协作机器人和Franka机器人导出的位姿为angleVector,三个量表示,在Matlab中angleVector是四个量表示.如果是三个量的表示推荐使用Python的scipy库做转换. 一. ...

  8. matlab中quat2angle,RPY_Euler_Quaternion_AngleAxis角度转化:Matlab、Python、Halc

    RPY_Euler_Quaternion_AngleAxis角度转化:Matlab.Python.Halc RPY_Euler_Quaternion_AngleAxis角度转化:Matlab.Pyth ...

  9. matlab的magic函数,python实现类似于Matlab中的magic函数

    参考这篇文章的代码封装了一个类似Matlab中的magic函数,用来生成魔方矩阵. #!/usr/bin/env python # -*- coding: utf-8 -*- import numpy ...

最新文章

  1. php将数组最后一个单元弹出,php array_pop()数组函数将数组最后一个单元弹出(出栈)...
  2. 很用心的写了 9 道 MySQL 面试题
  3. php获取文件名称和扩展名
  4. 什么是Sentinel?它能做什么
  5. [Windows驱动开发](三)基础知识——驱动例程
  6. [蓝桥杯][2015年第六届真题]机器人塔(DFS)
  7. PyTorch命令行中执行python程序使用指定的GPU
  8. [面试]——用一行代码判断两矩形是否相交
  9. sql递归查询上级_递归的实际业务场景之MySQL 递归查询
  10. HDU 2159 完全背包
  11. 对同一元素设置overflow-x:hidden,overflow-y:visible;属性值不生效
  12. 如何正确使用TM1652驱动共阴极数码管
  13. java 代码佛像_论面向组合子程序设计方法 之九 南无阿弥陀佛
  14. Android屏幕计算公式
  15. android实现拍照及获取照片上传至接口
  16. 脱机运行scp linux,解决CentOS使用不了scp命令
  17. 同wifi,手机控制电脑以及智能家具实现代码
  18. db2实例和数据库关系
  19. 计算机应用基全部概念,《计算机应用基课程教学大纲.doc
  20. 【Day06_0423】C语言选择题

热门文章

  1. 五、angularjs在进入界面前加载数据
  2. 自作孽?统计显示360搜索7天损失368万用户
  3. LTC6268-10 4GHz 超低偏置电流 FET 输入运算放大器
  4. 索尼电动汽车 - 无人驾驶EV界“制造会跑的智能手机”
  5. IC封装尺寸信息中的BSC是什么意思?
  6. STM32CubeMX 实战教程:定时器中断实验(LL 库)
  7. 中国移动发布首款 RISC-V 内核 MCU 芯片:最高工作主频 144MHz
  8. gdb 调试+子进程+线程
  9. 我又双叒叕倒在了年初立下的flag里
  10. 偏微分符号 ∂ 的说明