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

时间:2011-10-03 17:15:34

标签: python image interpolation

我已经使用Image模块在python中读取了一个图像,并将其转换为numpy数组,如下所示......

       im=Image.open(infile)

       imdata = scipy.misc.fromimage(im)

处理后,我得到的不是整数坐标而是实际值。重要的是要注意它是一个rgb图像。我想将颜色值作为双线性插值。图像中有一种方法

     im.getPixel(x,y)

我不确定是否可以将实际值作为坐标。

如果我们在numpy数组中进行,我们可以进行双线性插值,但如果我是正确的话,它将对每个通道分开???

由于

1 个答案:

答案 0 :(得分:5)

你是对的,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的强大实现还包括检查坐标何时离开图像的边界。