首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图1D Lanczos插值

图1D Lanczos插值
EN

Stack Overflow用户
提问于 2022-08-04 21:32:32
回答 1查看 110关注 0票数 0

假设我们有以下几点:

代码语言:javascript
复制
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插值来插值每一个点,例如:

代码语言:javascript
复制
lanczos_interpolation = lanczos_interpolation(x, y)
xs = np.linspace(0, 10, 100)
interpolated_xs = lanczos_interpolation(xs)

如何实现lanczos_interpolation?我已经看过interpolate.interp1d了,但是lanczos没有.

我想要的是如果绘制成图的话(提供的例子是双线性插值):

EN

回答 1

Stack Overflow用户

发布于 2022-08-04 22:06:18

这是OpenCV Lanczos插值。

编辑:打开的CV内插图像,所以实际上它推断数据,因为起始点是像素,而图像有更多的像素,因为它有较小的像素,它的像素超出了原来的范围:

例如,在该图像上,最初有2个像素,但是如果要求OpenCV插值到20个较小的像素,则图像的每一侧将有5个额外的像素。这就是为什么插值不匹配的原因。

不幸的是,这意味着这种方法不能在任意坐标的点之间进行插值。原来的点必须有一个不断的分离。

这段代码做了一个肮脏的近似,因为不能保证像素完全匹配:

代码语言:javascript
复制
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()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73242404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档