将Matlab的interp2移植到SciPy的interp2d时遇到的问题

1 投票
1 回答
6507 浏览
提问于 2025-04-18 05:59

我正在把一段Matlab的代码改写成Python语言。在Matlab的代码中,我有这样一个函数:gt= interp2(I(:,:,i)',xi,yi,'cubic')';,其中I是一个RGB图像,xiyi是两个形状相同的二维矩阵,用来定义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

在查看文档时,有几个要点需要注意:

  1. 如果 xy 代表的是一个规则的网格,建议使用 RectBivariateSpline

  2. xy 应该是1维的向量,这和Matlab中的用法不同,它们对应于Matlab的 xy,而不是 xiyi。后者会在后面提到。

  3. SciPy会返回一个函数,供你后续进行插值使用。而Matlab则是立即返回插值后的向量。

你在Matlab中使用过这个,但隐含地假设了

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

所以实际上你需要传递给 interpolation.interp2d 的是这个 XY,而不是 xiyi,后者会在后面提到。

在SciPy中,你实际上可以跳过 meshgrid 这一步,直接使用一个普通的范围,而且它会输出一个函数供你后续使用,而不是当场进行插值(注意我对 xy 的定义可能有小错误,我对 arange 不是很熟悉):

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

然后当你想进行插值时:

gt = f(xi, yi)

撰写回答