Как сделать билинейную интерполяцию для изображения PIL в python? - PullRequest
3 голосов
/ 03 октября 2011

Я прочитал изображение в python, используя модуль Image, и преобразовал его в пустой массив следующим образом ...

       im=Image.open(infile)

       imdata = scipy.misc.fromimage(im)

После обработки я получаю не целочисленные координаты, а реальные значения.Важно отметить, что это изображение RGB.Я хочу получить значение цвета как билинейно интерполированное значение.В изображении есть метод

     im.getPixel(x,y)

Я не уверен, что если мы сможем дать реальные значения в виде координат.

Если мы сделаем это в массиве numpy, мы можем выполнить билинейную интерполяцию, ноэто будет отдельно для каждого канала, если я прав ??? 1009

Спасибо

1 Ответ

5 голосов
/ 03 октября 2011

Вы правы, что 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 также включает проверку границ, когда координаты уходят с изображения.

...