Python一元插值interp1d

文章目录

interp1d

最常用的插值函数就是interp1d,按照字面意思理解就是插值一个一维函数。其必不可少的输入参数,就是将要被插值的函数的自变量和因变量,输出为被插值后的函数,示例如下

import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate as si
x = np.arange(0, 10, 0.1)
y = np.sin(x)
f = si.interp1d(x, y)
xnew = np.arange(0, 99)/10
ynew = f(xnew)  #调用经由interp1d返回的函数
plt.plot(x, y, 'o', xnew, ynew, '-')
plt.show()

结果为

在这里插入图片描述

而所谓插值,要求只能在特定的两个值之间插入,而对于超出定义域范围的值,是无法插入的

>>> f(15)
# 报错

在无声明的情况下,插值方法默认是线性插值linear,如有其他需求,可变更kind参数来实现,可选插值方法如下:

  • 样条插值:其0、1、2、3阶插值参数分别为zero、slinear、quadratic、cubic
  • 返回单点:next和previous用于返回上一个或下一个值
  • 最邻近插值:nearest采取向下取整;nearest-up采用向上取整。

为了对比这些不同插值算法的差异,可以生成一组数据来看一下

x = np.arange(10)
y = np.sin(x)
plt.scatter(x[1:-1],y[1:-1])

xNew = np.arange(1,9,0.1)

ks = ['zero', 'slinear', 'quadratic', 'cubic']
cs = ['r', 'g', 'b', 'gray']

for i in range(4):
    f = si.interp1d(x,y,kind=ks[i])
    plt.plot(xNew, f(xNew), c=cs[i])

plt.show()

下图中,红、绿、蓝、灰分别代表0到3次插值,可见,尽管只有10个点,但分段的二次函数已经描绘出了三角函数的形状,其插值效果还是不错的。

在这里插入图片描述

splrep

interp1d返回的是一个插值对象,而非可读数组。相比之下,splrep可以直接返回样条插值参数,更加直观。

通过splrep得到的插值参数,可以通过splev来生成插值结果。

tck = si.splrep(x,y)    # 默认三次插值
'''
tck返回值如下
(array([0., 0., 0., 0., 2., 3., 4., 5., 6., 7., 9., 9., 9., 9.]),
 array([-5.3791e-19,  7.6306e-01,  1.3851e+00,  1.6502e-01,
       -8.9345e-01, -1.1320e+00, -3.3192e-01,  1.1549e+00,
        1.1340e+00,  4.1212e-01,  0.0000e+00,  0.0000e+00,
        0.0000e+00,  0.0000e+00]),
 3)
'''
yNew = si.splev(xNew, tck)

其中,tck返回一个数组,包含三个元素,分别是插值节点、插值系数和报错信息。

在splrep中,可通过参数k来调节插值次数,取值范围是1到5,下面是测试代码,由于得到的图和interp1d的图极其相似,所以就不贴上来了。

plt.scatter(x[1:-1],y[1:-1])
for i in range(4):
    tck = si.splrep(x,y,k=i+1)
    yNew = si.splev(xNew, tck)
    plt.plot(xNew, yNew, c=cs[i])

plt.show()

如果对插值感兴趣,可以继续看这个:Python双线性插值和双三次插值

Viola-Jones算法是一种基于特征的人脸检测算法,主要使用Haar-like特征`interp1d` 是 Python 中 `scipy.interpolate` 模块中的一个函数,用于进行一维插值。它可以通过给定的数据点,返回一个可调用的函数,用于在数据点之间进行插值。 这是和级联分类器来实现。以下是一个简化的示例代码,用于示Viola-Jones算法的 `interp1d` 函数的基本语法: ```python scipy.interpolate.interp1d(x, y, kind='linear', fill_value='extrapolate') ``` 参数说明: - `x`:一维数组,表示数据点的 x 坐标人脸测步骤: ```python import cv2 # 加载Haar-like特征分类器 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 读取图像 img = cv2.imread('image.jpg') 。 - `y`:一维数组,表示数据点的 y 坐标。 - `kind`:插值方法,默认为线性插值。可以选择的方法有 `'linear'`(线性插值)、`'nearest'`(最近邻插# 将图像转换为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 检测人值)、`'zero'`(零阶插值)、`'slinear'`(一次样条插值)、`'脸 faces =_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30quadratic'`(二次样条插值)和 `'cubic'`(三次样条插值)。 - `fill_value`:指定在超出给定数据范围时的填充值。默认情况下,超出范围的点会被插值函数自动进行外推。 以下是一个简单的示例,展示如何使用 `interp)) # 在人脸位置绘制矩形框 for (x, y, w, h) in faces: cv2.rectangle1d` 进行线性插值: ```python import numpy as np from scipy.interpolate import interp1d # 定义原始数据点 x = np.array([1, 2, 3, 4, 5]) y = np.array([(img, (x, y), (x+w, y+h), (255, 0, 0), 2) # 显示结果图像 cv2.imshow('Face Detection', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述代码中,2, 4, 1, 6, 3]) # 创建插值函数 f = interp1d(x, y) # 在新的 x 值上进行插值 new_x = np.linspace(1, 5, num=50) new_y =我们首先加载了一个已经训练好的Haar-like特征分类器(`haarcascade_frontalface_default.xml f(new_x) # 打印插值结果 print(new_y) ``` 这段代码中,我们首先定义了一些`),然后读取待检测的图像并将其转换为灰度图像。接下来,我们使用原始数据点 `x` 和 `y`,然后使用 `interp1d` 函数创建了一个插值函数 `f`detectMultiScale`函数对灰度图像进行人脸检测,该函数返回检测到的人脸位置信息(矩形框的坐标和大小)。最后,我们在原图像上绘制矩形框来标记检测到`。接着,我们在新的 x 值上进行插值,并打印出插值结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值