如何在Python中对PIL图像进行双线性插值?

4 投票
1 回答
3719 浏览
提问于 2025-04-17 03:36

我在Python中使用Image模块读取了一张图片,并将其转换成了一个numpy数组,代码如下...

       im=Image.open(infile)

       imdata = scipy.misc.fromimage(im)

处理后,我得到的不是整数坐标,而是真实值。需要注意的是,这是一张RGB图片。我想要得到的颜色值是经过双线性插值计算的结果。图像处理中有一个方法可以做到这一点。

     im.getPixel(x,y)

我不确定我们是否可以将真实值作为坐标使用。

如果我们在numpy数组中进行操作,可以进行双线性插值,但如果我没理解错的话,这样做会对每个通道分别处理???

谢谢

1 个回答

6

你说得对,getPixel 这个函数只接受整数坐标。

如果你不介意速度慢一点的话,可以自己实现线性插值:

def lerp(a, b, coord):
    if isinstance(a, tuple):
        return tuple([lerp(c, d, coord) for c,d in zip(a,b)])
    ratio = coord - math.floor(coord)
    return int(round(a * (1.0-ratio) + b * ratio))

def bilinear(im, x, y):
    x1, y1 = int(floor(x)), int(floor(y))
    x2, y2 = x1+1, y1+1
    left = lerp(im.getpixel((x1, y1)), im.getpixel((x1, y2)), y)
    right = lerp(im.getpixel((x2, y1)), im.getpixel((x2, y2)), y)
    return lerp(left, right, x)

一个健壮的 bilinear 实现还应该检查坐标是否超出了图像的边界。

撰写回答