Scipy中2D插值存在问题

6

在我的应用程序中,数据是在扭曲网格上采样的,我想将其重新采样到非扭曲网格上。为了测试这一点,我编写了这个程序,其中包括了扭曲的示例和一个简单函数作为数据:

from __future__ import division

import numpy as np
import scipy.interpolate as intp
import pylab as plt

# Defining some variables:

quadratic = -3/128
linear = 1/16
pn = np.poly1d([quadratic, linear,0])

pixels_x = 50
pixels_y = 30
frame = np.zeros((pixels_x,pixels_y))

x_width= np.concatenate((np.linspace(8,7.8,57) , np.linspace(7.8,8,pixels_y-57)))

def data(x,y):
    z = y*(np.exp(-(x-5)**2/3) + np.exp(-(x)**2/5) + np.exp(-(x+5)**2))
    return(z)

# Generating grid coordinates

yt = np.arange(380,380+pixels_y*4,4)
xt = np.linspace(-7.8,7.8,pixels_x)
X, Y = np.meshgrid(xt,yt)
Y=Y.T
X=X.T

Y_m = np.zeros((pixels_x,pixels_y))
X_m = np.zeros((pixels_x,pixels_y))

# generating distorted grid coordinates:    

for i in range(pixels_y):
    Y_m[:,i] = Y[:,i] - pn(xt)
    X_m[:,i] = np.linspace(-x_width[i],x_width[i],pixels_x)


# Sample data:
for i in range(pixels_y):
    for j in range(pixels_x):
        frame[j,i] = data(X_m[j,i],Y_m[j,i])


Y_m = Y_m.flatten()
X_m = X_m.flatten()
frame = frame.flatten()
##
Y = Y.flatten()
X = X.flatten()
ipf = intp.interp2d(X_m,Y_m,frame)
interpolated_frame = ipf(xt,yt)

在这个时候,我有两个问题:
  1. 代码可以运行,但是出现以下警告:

    警告:由于B样条系数的数量已经超过了数据点m的数量,无法再添加更多的结点。可能的原因是s或者m太小。(fp>s) kx,ky=1,1 nx,ny=54,31 m=1500 fp=0.000006 s=0.000000

此外,一些插值伪影也会出现,我认为它们与警告有关 - 你们知道我错在哪里吗?
  1. 对于我的实际应用,帧需要大约500 * 100,但是当这样做时,我得到一个MemoryError - 除了将帧拆分成几个部分之外,还有其他方法可以帮助解决这个问题吗?
谢谢!
3个回答

4
这个问题很可能与在interp2d内部使用bisplrepbisplev有关。文档提到它们使用一个平滑因子s=0.0,如果需要更多的控制,则应直接使用bisplrepbisplev。相关文档提到s应该在(m-sqrt(2*m),m+sqrt(2*m))之间找到,其中m是用于构造样条线的点数。我遇到了类似的问题,当我直接使用bisplrepbisplev时,发现问题得到了解决,其中s只是可选项。

但这是线性插值,为什么要称为样条的节点? - SBFRF
如何使用bisplrep和bisplev在x.y域之外进行外推? - giammi56

1

-1

1
抱歉,那样做没有帮助 - mpl_toolkits.basemap.interp 仅用于将一个矩形网格插值到另一个矩形网格。我的输入网格不符合这个条件。 - Dzz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接