文章目录

  • python二维数组的插值
  • 基本原理

python二维数组的插值

通过scipy.interpolate中的griddata可以进行针对坐标网格的二维插值,其调用方法为

griddata(points, values, xi, method='linear', fill_value=nan, rescale=False)

points, values构成了用于插值的原始数据,xi为插值的坐标格点,method为插值方法,fill_value为超出插值范围时的填充值。

griddata有三种插值方法,分别是线性插值、三次插值和临近插值。接下来借用官网文档的例程,来对比一下这三种不同的插值方案

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
# 插值函数
def func(x, y):return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2rng = np.random.default_rng()
pts = rng.random((1000, 2))
values = func(pts[:,0], pts[:,1])xs, ys = np.indices([100,100])/100
zs = func(xs, ys)grids = {}
keys = ["nearest", "linear", "cubic"]
for key in keys:grids[key] = griddata(pts, values, (xs,ys), method=key)fig = plt.figure()
ax = fig.add_subplot(2,2,1)
ax.imshow(zs.T, extent=(0,1,0,1), origin='lower')
plt.scatter(pts[:,0], pts[:,1], marker='.', c='black')
ax.set_title('Original')
plt.axis('off')for i,key in zip([2,3,4], keys):ax = fig.add_subplot(2,2,i,projection='3d')ax.plot_surface(xs, ys, grids[key])ax.set_title(key)plt.show()

效果如下

可以看到,三次插值最为光滑,线性插值次之,邻近插值则没有光滑性可言。

基本原理

之所以出现这种差别,当然是插值的原理不同所致。

所谓临近插值,就是选择距离最近的点作为插值点,以一维情况为例,若待插值序列为

x 10 20 30 40 50 60 70 80
y a b c d e f g h

那么在[10,15)[10,15)[10,15)这个区间中,所有插值点的值都将是10,相当于是0次插值。下图中,红、绿、蓝、灰分别代表0到3次插值,可见,尽管只有10个点,但分段的二次函数已经描绘出了三角函数的形状,其插值效果还是不错的。


0次插值在二维情况下是临近点插值,这很好理解,那么线性插值变成双线性插值就有些复杂,毕竟在一维数组中,插入一个点,会在左右各有一个最相近的点,由这两个点可以连成一条直线,从而完成某种近似的线性拟合。

但在二维的待插值网格中,插入一点,那么这个点的周围会有4个临近点,而一个平面只需要三个点,所以不能用平面来类比直线。

一般在双线性插值中,比较常用的方案类似于权重法,即通过距离来判定某个点的权重来进行计算。
在矩阵中,索引坐标是规整的整数,现有一浮点型的点(x,y)(x,y)(x,y),则距离其左下角最近的坐标格点为

xL=⌊x⌋yL=⌊y⌋x_L=\lfloor x\rfloor\quad y_L=\lfloor y\rfloor xL​=⌊x⌋yL​=⌊y⌋

记矩阵为MMM,则矩阵中对应的值为

M(xL,yL)M(x_L, y_L) M(xL​,yL​)

记xR=xL+1,yR=yL+1x_R=x_L+1, y_R=y_L+1xR​=xL​+1,yR​=yL​+1,则可得到(x,y)(x,y)(x,y)附近的四个点的坐标

[M(xL,yR)M(xR,yR)M(xL,yL)M(xR,yL)]\begin{bmatrix} M(x_L,y_R)&M(x_R,y_R)\\ M(x_L,y_L)&M(x_R,y_L)\\ \end{bmatrix} [M(xL​,yR​)M(xL​,yL​)​M(xR​,yR​)M(xR​,yL​)​]

记作

[MLRMRRMLLMRL]\begin{bmatrix} M_{LR}&M_{RR}\\ M_{LL}&M_{RL}\\ \end{bmatrix} [MLR​MLL​​MRR​MRL​​]

点(x,y)(x,y)(x,y)在这四个点中间,相当于分别受到这四个点的影响,即

M(x,y)=∑Mij∣(x−xiˉ)(y−yjˉ)∣i,j∈{L,R}M(x,y)=\sum M_{ij}\vert(x-x_{\bar i})(y-y_{\bar j})\vert\quad i,j\in\{L,R\} M(x,y)=∑Mij​∣(x−xiˉ​)(y−yjˉ​​)∣i,j∈{L,R}

其中,Lˉ=R,Rˉ=L\bar L=R, \bar R=LLˉ=R,Rˉ=L,即对于左下角xL,yLx_L,y_LxL​,yL​而言,其对(x,y)(x,y)(x,y)的影响正比于(x,y)(x,y)(x,y)距离其右上方的点的距离。当(x,y)(x,y)(x,y)和(xL,yL)(x_L, y_L)(xL​,yL​)重合时,∣(x−xR)(y−yR)∣=1\vert(x-x_{R})(y-y_R)\vert=1∣(x−xR​)(y−yR​)∣=1。

由于矩阵是规整的,所以∣(x−xiˉ)∣=1−∣(x−xi)∣\vert(x-x_{\bar i})\vert=1-\vert(x-x_i)\vert∣(x−xiˉ​)∣=1−∣(x−xi​)∣,则上式可以写为

M(x,y)=∑Mij(1−∣x−xi∣)(1−∣y−yj∣)M(x,y)=\sum M_{ij}(1-\vert x-x_i \vert)(1-\vert y-y_j\vert) M(x,y)=∑Mij​(1−∣x−xi​∣)(1−∣y−yj​∣)

Python双线性插值和双三次插值相关推荐

  1. 图像插值-双线性插值与双三次插值

    在现实生活中,我们经常会遇到把图像进行放大.几何空间变换的情况等等,这些操作都需要在源图像和目标图像之间建立一个映射规则,使得两图像像素坐标之间建立起一种对应关系,从而为目标图像的每一个像素赋值. 从 ...

  2. 最近邻插值、双线性插值、双三次插值

    1.最近邻插值 越是简单的模型越适合用来举例子,我们就举个简单的图像:3X3 的256级灰度图,也就是高为3个象素,宽也是3个象素的图像,每个象素的取值可以是 0-255,代表该像素的亮度,255代表 ...

  3. 【opencv】最近邻插值、双线性插值、双三次插值(三次样条插值)

    目录 1. 最近邻插值 2. 双线性插值 1)简单理解 2)一般性 3. 双三次插值(三次样条插值) 总结 1. 最近邻插值 举个简单例子:一个3×33 \times 33×3 的单通道图像,如下 如 ...

  4. 图像常用的插值算法:最近邻插值、双线性插值和双三次插值算法

    图像常用的插值算法 最近邻插值算法 双线性插值算法 双三次插值(bicubic)算法 三种插值算法的优缺点 插值算法是图像缩放中的一项基本且重要的算法:在图像缩放中,输出图像像素点坐标可能对应输入图像 ...

  5. js 双线性插值 双三次插值法 实现

    js 双线性插值 双三次插值法 实现 介绍 双线性插值 原理 双三次插值法 原理 js实现 介绍 在网页中利用canvas进行绘图时,遇到一个问题,原始的数据分辨率很小,而图片要放大到整个网页,所以需 ...

  6. 计算机视觉基础---图像处理(几何变换)cpp+python

    2.1 简介 该部分将对基本的几何变换进行学习,几何变换的原理大多都是相似,只是变换矩阵不同,因此,我们以最常用的平移和旋转为例进行学习.在深度学习领域,我们常用平移.旋转.镜像等操作进行数据增广:在 ...

  7. 手写数字图片数据之python读取保存、二值化、灰度化图片+opencv处理图片的方法

    python 读取.保存.二值化.灰度化图片+opencv处理图片的方法 进行手写数字的图片预测的时候碰到了这样的问题. 先说说处理图片有三种方式 一.matplotlib 二.PIL 三.openc ...

  8. 毕业设计之 - 题目:基于机器视觉的试卷批改系统 - opencv python 视觉识别

    文章目录 0 简介 1 项目背景 2 项目目的 3 系统设计 3.1 目标对象 3.2 系统架构 3.3 软件设计方案 4 图像预处理 4.1 灰度二值化 4.2 形态学处理 4.3 算式提取 4.4 ...

  9. Python 图像处理实用指南:1~5

    原文:Hands-On Image Processing with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集],采用译后编辑(MT ...

最新文章

  1. 《英语语法新思维初级教程》学习笔记(一)名词短语
  2. jQuery 插件---hotkeys快捷键(热键).
  3. Ardino基础教程 20_红外遥控
  4. 关于ios phone APP生命周期的一点理解
  5. oracle rac常用的网络检查命令
  6. Java基础知识强化之网络编程笔记25:Android网络通信之 Future接口介绍(Java程序执行超时)...
  7. Springboot初次学习
  8. android微信支付坑,微信支付踏坑之旅
  9. .NET平台4.0 发布网站流程及出错总结
  10. @程序员,入门爬虫看这一篇就够了!
  11. 【Linux】awk处理变量
  12. Pandas学习导图
  13. asp.net MVC Views-----Controller传递数据方法
  14. css3-伪元素与伪类
  15. 计算机辅助编程可分为,计算机辅助编程的特点及类型
  16. c html中让图片反色,图片反色.html
  17. SolidWorks二次开发经验总结
  18. 不知道考研那些书比较好么?我来推荐~~~(一)
  19. 裸金属服务器能降级虚拟机不,弹性裸金属服务器的八大特征
  20. Crossbar技术冲破网络容量瓶颈

热门文章

  1. php think框架,ThinkPHP框架基础知识
  2. ROM定制开发入门-第三方ROM发展现状
  3. spark+carbondata使用
  4. java实现图片上插入文字并保存
  5. opencv-图像人脸识别和视频人脸识别
  6. 成员信息 c语言,C语言工会成员信息管理系统.doc
  7. php,mysql的简历_PHP+MySQL简历模板下载管理系统
  8. Java初学者入门简介
  9. SpringBoot配置文件数据库密码加密
  10. 有知道深圳艾奕康(以前叫茂尔盛)、新钶信息系统公司、梦网科技的吗?