Python 为给定索引插入图像

Python 为给定索引插入图像,python,image,numpy,scipy,interpolation,Python,Image,Numpy,Scipy,Interpolation,我有一个大约8000x9000大小的图像作为一个numpy矩阵。我还有一个numpy 2xn矩阵中的索引列表。这些索引是分数,也可能超出图像大小。我需要对图像进行插值,并找到给定索引的值。如果索引超出范围,我需要为它们返回numpy.nan。目前我正在做如下的for循环 def interpolate_image(image: numpy.ndarray, indices: numpy.ndarray) -> numpy.ndarray: """ :param image

我有一个大约8000x9000大小的图像作为一个numpy矩阵。我还有一个numpy 2xn矩阵中的索引列表。这些索引是分数,也可能超出图像大小。我需要对图像进行插值,并找到给定索引的值。如果索引超出范围,我需要为它们返回
numpy.nan
。目前我正在做如下的for循环

def interpolate_image(image: numpy.ndarray, indices: numpy.ndarray) -> numpy.ndarray:
    """

    :param image:
    :param indices: 2xN matrix. 1st row is dim1 (rows) indices, 2nd row is dim2 (cols) indices
    :return:
    """
    # Todo: Vectorize this
    M, N = image.shape
    num_indices = indices.shape[1]
    interpolated_image = numpy.zeros((1, num_indices))
    for i in range(num_indices):
        x, y = indices[:, i]
        if (x < 0 or x > M - 1) or (y < 0 or y > N - 1):
            interpolated_image[0, i] = numpy.nan
        else:
            # Todo: Do Bilinear Interpolation. For now nearest neighbor is implemented
            interpolated_image[0, i] = image[int(round(x)), int(round(y))]
    return interpolated_image

现在,我已经实现了最近邻插值。scipy interp2d没有最近邻。如果库函数是最近邻函数(这样我就可以比较了),那就好了。如果没有,那也可以

看起来像是
scipy.interpolate.RectBivariateSpline
将实现以下功能:

来自scipy.interpolate导入矩形双变量样条线
图像=#如给定
指数=#如给定
样条线=矩形二元样条线(numpy.arange(M),numpy.arange(N),图像)
插值=样条曲线(指数[0],指数[1],网格=假)
这会得到插值,但不会在需要插值的地方给出
nan
。您可以在
中找到它,其中

nans=numpy.zeros(插值.shape)+numpy.nan

x_in_界=(0非常感谢。在此期间,我的代码发生了一些变化。我正在进行原点转移等工作。现在,直接应用您的代码,给出了所有NaN。我将尝试正确设置并检查。之后我将接受答案。非常感谢!不知怎的,原始图像中的
NaN
造成了问题。
插值
是all
nan
s。相反,如果我将图像中的所有
nan
s替换为
0
-1
,则它可以工作。
image1=numpy.where(numpy.isnan(图像),-1,图像)
知道为什么吗?或者如何在这个插值中使用
nan
s?不清楚使用
nan
插值意味着什么-毕竟,它不是一个数字。我认为用零替换原始图像中的
nan
值是有意义的,尽管这可能取决于它们存在的原因。我正在实现全景。所以,我需要叠加图像。在每个像素上,如果存在两个或更多图像,那么我需要取它们的平均值。现在每个图像大小都可以变化。所以,我所做的是将所有图像放入一个足够大的矩阵中。在一个像素上,如果图像不存在,我将用
nan
表示它,以便稍后我可以执行
numpy.nanmean
f = interpolate.interp2d(numpy.arange(image.shape[0]), numpy.arange(image.shape[1]), image, kind='linear')
interp_image_vect = f(indices[:,0], indices[:,1])
RuntimeError: Cannot produce output of size 73156608x73156608 (size too large)