Python双线性插值和双三次插值
文章目录
- 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} [MLRMLLMRRMRL]
点(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.最近邻插值 越是简单的模型越适合用来举例子,我们就举个简单的图像:3X3 的256级灰度图,也就是高为3个象素,宽也是3个象素的图像,每个象素的取值可以是 0-255,代表该像素的亮度,255代表 ...
- 【opencv】最近邻插值、双线性插值、双三次插值(三次样条插值)
目录 1. 最近邻插值 2. 双线性插值 1)简单理解 2)一般性 3. 双三次插值(三次样条插值) 总结 1. 最近邻插值 举个简单例子:一个3×33 \times 33×3 的单通道图像,如下 如 ...
- 图像常用的插值算法:最近邻插值、双线性插值和双三次插值算法
图像常用的插值算法 最近邻插值算法 双线性插值算法 双三次插值(bicubic)算法 三种插值算法的优缺点 插值算法是图像缩放中的一项基本且重要的算法:在图像缩放中,输出图像像素点坐标可能对应输入图像 ...
- js 双线性插值 双三次插值法 实现
js 双线性插值 双三次插值法 实现 介绍 双线性插值 原理 双三次插值法 原理 js实现 介绍 在网页中利用canvas进行绘图时,遇到一个问题,原始的数据分辨率很小,而图片要放大到整个网页,所以需 ...
- 计算机视觉基础---图像处理(几何变换)cpp+python
2.1 简介 该部分将对基本的几何变换进行学习,几何变换的原理大多都是相似,只是变换矩阵不同,因此,我们以最常用的平移和旋转为例进行学习.在深度学习领域,我们常用平移.旋转.镜像等操作进行数据增广:在 ...
- 手写数字图片数据之python读取保存、二值化、灰度化图片+opencv处理图片的方法
python 读取.保存.二值化.灰度化图片+opencv处理图片的方法 进行手写数字的图片预测的时候碰到了这样的问题. 先说说处理图片有三种方式 一.matplotlib 二.PIL 三.openc ...
- 毕业设计之 - 题目:基于机器视觉的试卷批改系统 - opencv python 视觉识别
文章目录 0 简介 1 项目背景 2 项目目的 3 系统设计 3.1 目标对象 3.2 系统架构 3.3 软件设计方案 4 图像预处理 4.1 灰度二值化 4.2 形态学处理 4.3 算式提取 4.4 ...
- Python 图像处理实用指南:1~5
原文:Hands-On Image Processing with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集],采用译后编辑(MT ...
最新文章
- 《英语语法新思维初级教程》学习笔记(一)名词短语
- jQuery 插件---hotkeys快捷键(热键).
- Ardino基础教程 20_红外遥控
- 关于ios phone APP生命周期的一点理解
- oracle rac常用的网络检查命令
- Java基础知识强化之网络编程笔记25:Android网络通信之 Future接口介绍(Java程序执行超时)...
- Springboot初次学习
- android微信支付坑,微信支付踏坑之旅
- .NET平台4.0 发布网站流程及出错总结
- @程序员,入门爬虫看这一篇就够了!
- 【Linux】awk处理变量
- Pandas学习导图
- asp.net MVC Views-----Controller传递数据方法
- css3-伪元素与伪类
- 计算机辅助编程可分为,计算机辅助编程的特点及类型
- c html中让图片反色,图片反色.html
- SolidWorks二次开发经验总结
- 不知道考研那些书比较好么?我来推荐~~~(一)
- 裸金属服务器能降级虚拟机不,弹性裸金属服务器的八大特征
- Crossbar技术冲破网络容量瓶颈