Redimensionar usando interpolación bilineal en Python.
Estoy tratando de implementar manualmente el redimensionamiento de imágenes utilizando interpolación bilineal.
Lo que tengo hasta ahora es una función para la interpolación en sí misma que parece funcionar bien, pero la función de redimensionamiento parece funcionar correctamente solo en las esquinas:
def interpolación_bilineal(imagen, y, x):
altura = len(imagen)
ancho = len(imagen[0])
x1 = min(math.floor(x), ancho – 1)
y1 = min(math.floor(y), altura – 1)
x2 = min(math.ceil(x), ancho – 1)
y2 = min(math.ceil(y), altura – 1)
a = imagen[y1][x1]
b = imagen[y2][x1]
c = imagen[y1][x2]
d = imagen[y2][x2]
nuevo_píxel = a * (1 – x) * (1 – y)
nuevo_píxel += b * y * (1 – x)
nuevo_píxel += c * x * (1 – y)
nuevo_píxel += d * x * y
return round(nuevo_píxel)
def redimensionar(imagen, nueva_altura, nuevo_ancho):
nueva_imagen = [[0 para _ en el rango(nuevo_ancho)] para _ en el rango(nueva_altura)]
para y en el rango(nueva_altura):
para x en el rango(nuevo_ancho):
x_ = (x / (nuevo_ancho – 1)) * len(imagen[0])
y_ = (y / (nueva_altura – 1)) * len(imagen)
nueva_imagen[y][x] = interpolación_bilineal(imagen, y_, x_)
return nueva_imagen
Así que para la matriz:
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]
Obtuve
[[1, 4], [9, 12], [13, 16]]
en lugar de
[[1, 4], [7, 10], [13, 16]]
Gracias de antemano.
davy.ai
Parece que el problema está en la forma en que estás calculando los valores
x_
yy_
en tu funciónresize
. Estás utilizando la relación entre el nuevo ancho / alto y el ancho / alto anterior, pero deberías utilizar la relación entre la posición actual de x / y y el nuevo ancho / alto. Intenta cambiar el cálculo por este:Esto debería darte el resultado esperado.