биллинейная интерполяция с 2d матричным изображением python

#python #image-processing #matrix #interpolation

Вопрос:

двухлинейная интерполяция(изображение,y,x), которая принимает 2d — матричное изображение и координаты x,y пикселя на изображении так, как они есть на изображении y — на высоту изображения x-на ширину изображения (x, y) и возвращает пиксель ( от 0 до 255 ) из расчета расчет

введите описание изображения здесь

обратите внимание: x,y в расчете не совпадают с x,y, которые мы принимаем в качестве параметров в функции. Можно предположить, что функция получает допустимое изображение с одним цветовым каналом

примеры ввода и вывода:

 bilinear_interpolation([[0, 64], [128, 255]], 0, 0) → 0
bilinear_interpolation([[0, 64], [128, 255]], 1, 1) → 255
bilinear_interpolation([[0, 64], [128, 255]], 0.5, 0.5) → 112
bilinear_interpolation([[0, 64], [128, 255]], 0.5, 1.5) → 160
assert bilinear_interpolation([[0, 64], [128, 255]], 0.5, 1) == 160
assert bilinear_interpolation([[0, 64], [128, 255]], 0.5, 1.5) == 160
assert bilinear_interpolation([[0, 64], [128, 255]], 0, 1) == 64
assert bilinear_interpolation([[0, 64], [128, 255]], 0, 0) == 0
assert bilinear_interpolation([[0, 64], [128, 255]], 1, 1) == 255
assert bilinear_interpolation([[0, 64], [128, 255]], 0.5, 0.5) == 112
assert bilinear_interpolation([[255, 255], [255, 255]], 0.5, 1.5) == 255
assert bilinear_interpolation([[255, 255], [255, 255]], 0, 1) == 255
assert bilinear_interpolation([[255, 255], [255, 255]], 1.5, 1.5) == 255
 

Итак, то, что я попробовал, выглядит так:

 def bilinear_interpolation(image, y, x):

    xa = math.floor(x)
    ya = math.floor(y)
    if(xa  >= len(image[0]) and ya >= len(image)):
        xa = len(image[0]) - 1
        ya = len(image) - 1
        a = image[ya][xa]
    elif (xa  >= len(image[0]) ):
        xa = len(image[0]) - 1
        a = image[ya][xa]
    elif (ya >= len(image)):
        ya = len(image) - 1
        a = image[ya][xa]
    else:
        a = image[ya][xa]

    if(ya   1 >= len(image)):
        b = image[ya][xa]
    else:
        b = image[ya   1][xa]
    if (xa   1 >= len(image[0])):
        c = image[ya][xa]
    else:
        c = image[ya][xa   1]
    if(xa   1 >= len(image[0]) and ya   1 >= len(image)):
        d = image[ya][xa]
    elif (xa   1 >= len(image[0]) ):
        d = image[ya   1][xa]
    elif (ya 1 >= len(image)):
        d = image[ya][xa   1]
    else:
        d = image[ya   1][xa   1]
    dx = x - math.floor(x)
    dy = y - math.floor(y)
    interpolation_factor = a *( 1 - dx)*(1 - dy)   b * dy * (1 - dx)   c * dx * (1 - dy)   d * dx * dy

    return round(interpolation_factor)
 

но для меня это все равно неудача.. Я всегда получаю индекс списка вне диапазона в огромной матрице, похожей на картинку размером 460 x 460

в каком направлении?

Комментарии:

1. but its still failing for me.. any direction? Можете ли вы уточнить, что вы подразумеваете под «его неудачей»?

2. Да, я всегда получаю индекс списка вне диапазона на линейном факторе интерполяции = изображение[r][c]*(1-изображение[r-1][c]) изображение[r][c]*(изображение[r][c 1]) есть ли что-нибудь, чего мне не хватает, чтобы добавить?

3. можете ли вы добавить это к самому вопросу? ошибка и трассировка ошибки, вставленные в блок кода?

4. отредактировано сейчас , должно быть ясно

5. @AkshaySehgal Есть идея, где я мог бы измениться?