假设我们有以下几点:
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [2, 3, 5.5, 6.5, 5, 4, 5, 7.5, 8, 7]

现在,我们希望使用lanczos插值来插值每一个点,例如:
lanczos_interpolation = lanczos_interpolation(x, y)
xs = np.linspace(0, 10, 100)
interpolated_xs = lanczos_interpolation(xs)如何实现lanczos_interpolation?我已经看过interpolate.interp1d了,但是lanczos没有.
我想要的是如果绘制成图的话(提供的例子是双线性插值):

发布于 2022-08-04 22:06:18
这是OpenCV Lanczos插值。
编辑:打开的CV内插图像,所以实际上它推断数据,因为起始点是像素,而图像有更多的像素,因为它有较小的像素,它的像素超出了原来的范围:
例如,在该图像上,最初有2个像素,但是如果要求OpenCV插值到20个较小的像素,则图像的每一侧将有5个额外的像素。这就是为什么插值不匹配的原因。

不幸的是,这意味着这种方法不能在任意坐标的点之间进行插值。原来的点必须有一个不断的分离。
这段代码做了一个肮脏的近似,因为不能保证像素完全匹配:
import numpy as np
import matplotlib.pyplot as plt
import cv2
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [2, 3, 5.5, 6.5, 5, 4, 5, 7.5, 8, 7]
img = np.array([y])
parts = 100
xs = np.linspace(1, 10, parts)
resized = cv2.resize(img, (int(parts*(1+1/len(y))), 1),
interpolation=cv2.INTER_LANCZOS4)[0]
plt.scatter(x, y)
plt.plot(xs, resized[int(parts/(2*len(y))):int(parts/(2*len(y)))+parts])
plt.show()

https://stackoverflow.com/questions/73242404
复制相似问题