我正在用Python语言重写Matlab的代码。
在Matlab代码中,我有这个函数:gt= interp2(I(:,:,i)',xi,yi,'cubic')';
,其中I
是RGB图像,xi
和yi
是具有相同形状的2D矩阵,用于定义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"
。
怎么了?
非常感谢你。
答案 0 :(得分:0)
查看documentation,您应该注意以下几点:
如果x和y代表常规网格,请考虑使用 的 RectBivariateSpline 强>
x
和y
应该是1D向量,与Matlab不同,它们与Matlab的x
和y
以及 NOT <匹配/ strong> 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')';
实际上,您需要将X
和Y
传递给interpolation.interp2d而不是xi
和yi
,它们会在以后发生。< / 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)