代码之家  ›  专栏  ›  技术社区  ›  craq

如何用python裁剪和插值图像的一部分[复制]

  •  1
  • craq  · 技术社区  · 7 年前

    我已经用过 interp2 在Matlab中,例如下面的代码,这是@rayryeng在中的答案的一部分: Three dimensional (3D) matrix interpolation in Matlab :

    d = size(volume_image)
    [X,Y] = meshgrid(1:1/scaleCoeff(2):d(2), 1:1/scaleCoeff(1):d(1));
    for ind = z
        %Interpolate each slice via interp2   
        M2D(:,:,ind) = interp2(volume_image(:,:,ind), X, Y);   
    end
    

    尺寸示例:

    The image size is 512x512 and the number of slices is 133. So:
    volume_image(rows, columns, slices in 3D dimenson) : 512x512x133 in 3D dimenson
    X: 288x288
    Y: 288x288
    scaleCoeff(2): 0.5625
    scaleCoeff(1): 0.5625
    z = 1 up to 133 ,hence z: 1x133
    ind: 1 up to 133
    M2D(:,:,ind) finally is 288x288x133 in 3D dimenson
    

    aslo,matlabs syntax for size:(rows,columns,slices in 3rd dimenson)和python syntax for size:(slices in 3rd dim,rows,columns)。 但是,在将Matlab代码转换为Python代码之后发生了一个错误, ValueError: Invalid length for input z for non rectangular grid :

    for ind in range(0, len(z)+1):
        M2D[ind, :, :] = interpolate.interp2d(X, Y, volume_image[ind, :, :]) # ValueError: Invalid length for input z for non rectangular grid
    

    怎么了?非常感谢。

    0 回复  |  直到 7 年前
        1
  •  2
  •   Cris Luengo    7 年前

    在MATLAB中, interp2 作为参数:

    result = interp2(input_x, input_y, input_z, output_x, output_y)
    

    您只使用后三个参数,前两个参数假定为 input_x = 1:size(input_z,2) input_y = 1:size(input_z,1) .

    在蟒蛇中, scipy.interpolate.interp2 完全不同:它接受Matlab函数的前3个输入参数,并返回一个可以调用以获取插值的对象:

    f = scipy.interpolate.interp2(input_x, input_y, input_z)
    result = f(output_x, output_y)
    

    按照文档中的示例,我得到如下内容:

    from scipy import interpolate
    x = np.arange(0, volume_image.shape[2])
    y = np.arange(0, volume_image.shape[1])
    f = interpolate.interp2d(x, y, volume_image[ind, :, :])
    xnew = np.arange(0, volume_image.shape[2], 1/scaleCoeff[0])
    ynew = np.arange(0, volume_image.shape[1], 1/scaleCoeff[1])
    M2D[ind, :, :] = f(xnew, ynew)
    

    [代码未测试,如果有错误请通知我。]

        2
  •  0
  •   craq    7 年前

    你可能对 scipy.ndimage.zoom . 如果从一个规则网格插值到另一个规则网格,它比 scipy.interpolate.interp2d .

    请参见以下示例的答案: https://stackoverflow.com/a/16984081/1295595

    你可能想要这样的东西:

    import scipy.ndimage as ndimage
    M2D = ndimage.zoom(volume_image, (1, scaleCoeff[0], scaleCoeff[1])