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

3
我使用Image模块在Python中读取了一张图片,并将其转换为numpy数组,如下所示...
       im=Image.open(infile)

       imdata = scipy.misc.fromimage(im)

处理后,我得到的不是整数坐标,而是实数值。需要注意的是这是一张RGB图像。我想得到双线性插值的颜色值。在图像库中有这样一种方法。

     im.getPixel(x,y)

我不确定我们能否将实际值作为坐标。

如果我们在numpy数组中进行操作,可以进行双线性插值,但如果我没记错的话,每个通道都需要单独进行处理?

谢谢。

1个回答

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)

一种健壮的双线性插值实现还应包括边界检查,以防坐标越过图像范围。

谢谢... Python 中没有内置的方法来做这件事吗?其次,lerp 对多通道图像也适用吗? - Shan
1
@Shan,抱歉, lerp 在多通道图像方面需要进行一些微调。稍后我会填写它。 - Mark Ransom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接