将Matlab interp2移植到SciPy interp2d的问题

时间:2014-05-09 14:33:59

标签: python matlab numpy scipy interpolation

我正在用Python语言重写Matlab的代码。 在Matlab代码中,我有这个函数:gt= interp2(I(:,:,i)',xi,yi,'cubic')';,其中I是RGB图像,xiyi是具有相同形状的2D矩阵,用于定义x和y坐标。 在我为gt(isnan(gt))=0;设置边界之外的值之后。 这个功能在Matlab上完美运行。

在Python中,我编写了以下代码:gt=interpolate.interp2d(x,y,img.T,kind='cubic',fill_value=0),其中xy与Matlab中的xiyi相同,并且img是灰度图像。 无论如何,我得到以下异常:"Invalid length for input z for non rectangular grid") ValueError: Invalid length for input z for non rectangular grid"。 怎么了? 非常感谢你。

1 个答案:

答案 0 :(得分:0)

查看documentation,您应该注意以下几点:

  1.   

    如果x和y代表常规网格,请考虑使用   的 RectBivariateSpline

  2. xy应该是1D向量,与Matlab不同,它们与Matlab的xy以及 NOT <匹配/ strong> xiyi。那些晚些时候来了。

  3. SciPy将返回一个稍后用于插值的函数。 Matlab立即重新调整插值向量。

  4. 您已在Matlab中使用它,但隐含地假设

    [X, Y] = meshgrid(1:size(I,1), 1:size(I,2))
    gt= interp2(X, Y, I(:,:,i)',xi,yi,'cubic')';
    

    实际上,您需要将XY传递给interpolation.interp2d而不是xiyi,它们会在以后发生。< / p>

    在SciPy中,您实际上可以跳过meshgrid步骤并使用正常范围,但它也会输出一个函数,而不是在现场执行插值(注意我的{定义中可能存在小错误) {1}}和x,我不熟悉y):

    arange

    然后当你想进行插值时:

    x = arange(1, img.shape[0]+1)
    y = arange(1, img.shape[1]+1)
    f = interpolation.interp2d(x, y, img.T)