#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 Есть идея, где я мог бы измениться?