【问题标题】:2D interpolation in PythonPython中的二维插值
【发布时间】:2019-06-02 23:51:16
【问题描述】:

MATLAB的interp2函数在Python中的等效函数是什么?

VqR = interp2(rR, fx(:), fy(:));

这是我尝试移植到 python 的 MATLAB 代码

function res = imgMeshWarp( img, flowmap )
img = im2double(img);
rR = img(:, :, 1);
rG = img(:, :, 2);
rB = img(:, :, 3);
fx = flowmap(:, :, 1); fy = flowmap(:, :, 2);
VqR = interp2(rR, fx(:), fy(:));
VqG = interp2(rG, fx(:), fy(:));
VqB = interp2(rB, fx(:), fy(:));
res = cat(3, VqR, VqG, VqB);
res = reshape(res, size(flowmap, 1), size(flowmap, 2), []);    
end

编辑 1:我正在使用 numpy.在 matlab 代码中,img 是图像,flowmap 是变形的网格。我正在尝试使用 flowmap 扭曲图像。

编辑 2:我正在添加从 matlab 翻译的 python 代码。

def image_warp(img, fm):
    img = img[:,:, ::-1]
    rR = img[:, :, 0]
    rG = img[:, :, 1]
    rB = img[:, :, 2]

    fx = fm[:, :, 0]
    fy = fm[:, :, 1]

    VqR = scipy.ndimage.map_coordinates(rR, [fx.ravel(), fy.ravel()], order=1, mode='constant', cval=np.nan).reshape(rR.shape)
    VqG = scipy.ndimage.map_coordinates(rG, [fx.ravel(), fy.ravel()], order=1, mode='constant', cval=np.nan).reshape(rG.shape)
    VqB = scipy.ndimage.map_coordinates(rB, [fx.ravel(), fy.ravel()], order=1, mode='constant', cval=np.nan).reshape(rB.shape)

    res = np.dstack((VqR, VqG, VqB))
    res = np.reshape(res, (fm.shape[0], fm.shape[1], -1))

我的问题是根据随机变形的变形网格对图像进行变形。所以我做了一个UV贴图来纹理网格。 flowmap 就是这个映射。它是通过以下方式生成的。我有一个稀疏的 uv 映射(例如,网格上的顶点 [0 0] 对应于图像的像素坐标 [0 0],即左上角)。那么问题是如何找出网格中的所有其他像素。对于每个四边形(4 个顶点),您可以通过求解齐次坐标中的最小二乘问题来计算从这些顶点到纹理图像的变换矩阵。然后对于四边形中的每个像素,我们可以将其坐标与变换矩阵相乘,得到纹理图像中的像素坐标。

【问题讨论】:

  • 这是指哪个python版本?你在用 numpy 吗?我建议您除了提及您要使用的功能外,还提供一小部分输入和输出示例。
  • @Dev-iL 我添加了一个编辑。
  • 剩余的python代码在matlab中正常工作,唯一错误的部分是这个函数,我仍然无法在python中找到这个函数的准确翻译。
  • 有人可以帮忙吗?

标签: python matlab 2d interpolation code-translation


【解决方案1】:

scipy.interpolate.interp2d 是您正在寻找的。此功能的设置略有不同。一方面,您需要定义原始 x,y 坐标。此外,根据 flowmap 的确切含义,您可能需要在那里进行调整(尽管它看起来很适合)。您的一个颜色通道可能看起来像这样:

from scipy import interpolate

dy, dx = rR.shape
f = interpolate.interp2d(np.arange(dx), np.arange(dy), rR)
VqR = f(new_x, new_y)

【讨论】:

  • 可能与您的fx 和fy 相同。我不知道这些值到底是什么,但我假设您想要计算插值的 x,y 坐标。您还必须将它们弄平。在 Python 中,您可以使用 fx.flatten()。
猜你喜欢
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
相关资源
最近更新 更多