将Matlab的interp2移植到SciPy的interp2d时遇到的问题
我正在把一段Matlab的代码改写成Python语言。在Matlab的代码中,我有这样一个函数:gt= interp2(I(:,:,i)',xi,yi,'cubic')';
,其中I
是一个RGB图像,xi
和yi
是两个形状相同的二维矩阵,用来定义x和y坐标。然后我用gt(isnan(gt))=0;
来处理边界外的值。这段代码在Matlab上运行得很好。
在Python中,我写了以下代码:gt=interpolate.interp2d(x,y,img.T,kind='cubic',fill_value=0)
,这里的x
和y
和Matlab中的xi
和yi
是一样的,而img
是一个灰度图像。不过我遇到了一个错误:"Invalid length for input z for non rectangular grid") ValueError: Invalid length for input z for non rectangular grid"
。这是什么问题呢?非常感谢。
1 个回答
在查看文档时,有几个要点需要注意:
如果
x
和y
代表的是一个规则的网格,建议使用 RectBivariateSpline。x
和y
应该是1维的向量,这和Matlab中的用法不同,它们对应于Matlab的x
和y
,而不是xi
和yi
。后者会在后面提到。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
的是这个 X
和 Y
,而不是 xi
和 yi
,后者会在后面提到。
在SciPy中,你实际上可以跳过 meshgrid
这一步,直接使用一个普通的范围,而且它会输出一个函数供你后续使用,而不是当场进行插值(注意我对 x
和 y
的定义可能有小错误,我对 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)