matlab中interp2的python实现(经matlab测试通过)
本文实现的是双线性插值,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测试通过)相关推荐
- matlab中e用什么表示什么,matlab中e怎么表示
方法/步骤 1.自然数对数 log(x) 我们在MATLAB主窗口中输入a1=log(2.7183),回车,我们可以看到a1近似为1,e约等 于2. MATLAB中 如何输入对数函数? 方法/步骤 1 ...
- fname什么意思matlab,matlab中f(:,1)是什么意思 matlab中f(:,:,3)是什么意思?
导航:网站首页 > matlab中f(:,1)是什么意思 matlab中f(:,:,3)是什么意思? matlab中f(:,1)是什么意思 matlab中f(:,:,3)是什么意思? 相关问题: ...
- matlab的length是什么,大家好!matlab中length是什么意思?,matlab中的length表示什么?应该如何使用?...
导航:网站首页 > 大家好!matlab中length是什么意思?,matlab中的length表示什么?应该如何使用? 大家好!matlab中length是什么意思?,matlab中的leng ...
- 使用matlab中PCA包进行训练集与测试集处理
使用matlab中PCA包进行训练集与测试集处理 1. matlab中PCA包的使用与分析 2. 训练集与测试集降维处理 1. matlab中PCA包的使用与分析 [coeff, score, lat ...
- matlab中 y =ft(x)的意思,matlab中y=fft(x)语句的意思
matlab傅里叶变换中fft(x,n),x,n分别是什么含义? fft(x,n)是一维快速傅里叶变换,x相当于信号,n是变换点数.离散傅里叶变换DFT的快速算法就是FFT. matlab中FFT函数 ...
- 范德蒙德矩阵在MATLAB中怎么表示,Python 之 Python与MATLAB 矩阵操作总结
Python 之 Python与MATLAB 矩阵操作小结 一.线形代数理论基础 线形代数(linear algebra)是数学的一个分支,研究矩阵理论.向量空间.线性变换和有限维线形方程组等内容. ...
- matlab中quat2angle,RPY_Euler_Quaternion_AngleAxis角度转化:Matlab、Python、Halcon版本
UR协作机器人和Franka机器人导出的位姿为angleVector,三个量表示,在Matlab中angleVector是四个量表示.如果是三个量的表示推荐使用Python的scipy库做转换. 一. ...
- matlab中quat2angle,RPY_Euler_Quaternion_AngleAxis角度转化:Matlab、Python、Halc
RPY_Euler_Quaternion_AngleAxis角度转化:Matlab.Python.Halc RPY_Euler_Quaternion_AngleAxis角度转化:Matlab.Pyth ...
- matlab的magic函数,python实现类似于Matlab中的magic函数
参考这篇文章的代码封装了一个类似Matlab中的magic函数,用来生成魔方矩阵. #!/usr/bin/env python # -*- coding: utf-8 -*- import numpy ...
最新文章
- php将数组最后一个单元弹出,php array_pop()数组函数将数组最后一个单元弹出(出栈)...
- 很用心的写了 9 道 MySQL 面试题
- php获取文件名称和扩展名
- 什么是Sentinel?它能做什么
- [Windows驱动开发](三)基础知识——驱动例程
- [蓝桥杯][2015年第六届真题]机器人塔(DFS)
- PyTorch命令行中执行python程序使用指定的GPU
- [面试]——用一行代码判断两矩形是否相交
- sql递归查询上级_递归的实际业务场景之MySQL 递归查询
- HDU 2159 完全背包
- 对同一元素设置overflow-x:hidden,overflow-y:visible;属性值不生效
- 如何正确使用TM1652驱动共阴极数码管
- java 代码佛像_论面向组合子程序设计方法 之九 南无阿弥陀佛
- Android屏幕计算公式
- android实现拍照及获取照片上传至接口
- 脱机运行scp linux,解决CentOS使用不了scp命令
- 同wifi,手机控制电脑以及智能家具实现代码
- db2实例和数据库关系
- 计算机应用基全部概念,《计算机应用基课程教学大纲.doc
- 【Day06_0423】C语言选择题