Estoy tratando de hacer una interpolación bicúbica en una matriz de 8 * 8 (imagen) que se muestra a continuación.
A = 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 10 20 30 40 50 60 70 80 90 100 110 120 130 140
Utilicé el siguiente código de matlab y obtuve un resultado
interp2(A,"bicubic")
Pero incluso después de buscar en Google no obtengo cómo hacerlo manualmente. ¿Alguien puede ayudarme a hacerme una idea con este ejemplo (solo para unos pocos píxeles)?
Responder
Aquí una explicación bastante buena.
Empezaré por considerar el caso 1D de interpolación cúbica (porque es más fácil de explicar) y luego pasaré al caso 2D.
La idea básica de la interpolación cúbica es estimar los valores entre dos puntos cualesquiera mediante una función cúbica, $ f (x) $, con la primera derivada, $ f «(x) $
$$ f (x) = ax ^ 3 + bx ^ 2 + cx + d $$ $$ f «(x) = 3ax ^ 2 + 2bx + c $$
de modo que, cuando se empalma a las splines cúbicas adyacentes a la izquierda y a la derecha, la función interpolada (la «derivada cero») y su primera derivada son continuas. Eso significa que, en el límite izquierdo de alguna spline dada, las derivadas cero y primera son iguales a los del límite derecho de la spline adyacente inmediatamente a la izquierda.
Sin pérdida de generalidad, podemos asumir que estamos interpolando entre $ x = 0 $ y $ x = 1 $ . En los límites izquierdo y derecho, vemos que
$$ f (0) = d $$ $$ f (1) = a + b + c + d $$ $$ f «(0) = c $$ $$ f «(1) = 3a + 2b + c $$
Resolviendo los coeficientes del polinomio
$$ a = 2f (0) – 2f (1 ) + f «(0) + f» (1) $$ $$ b = -3f (0) + 3f (1) – 2f «(0) – f» (1) $$ $$ c = f «( 0) $$ $$ d = f (0) $$
Ahora considere los cuatro puntos alrededor de la región que se está estimando, que son $ (- 1, y _ {- 1}) $, $ (0 , y_0) $, $ (1, y_1) $, $ (2, y_2) $, e imponen condiciones de contorno que
$$ f (0) = y_0 $$ $$ f (1) = y_1 $$
y defina las dos derivadas de límite como
$$ f «(0) = \ frac {y_1-y _ {- 1}} {2} $$ $$ f «(1) = \ frac {y_2-y_0} {2} $$
que es coherente con la forma en que se definirán para las splines adyacentes.
Entonces
$$ a = – \ frac {y _ {- 1}} {2} + \ frac {3y_0} {2} – \ frac {3y_1} {2} + \ frac {y_2} {2} $$ $$ b = y _ {- 1} – \ frac {5y_0} {2} + 2y_1 – \ frac {y_2} {2} $$ $$ c = – \ frac {y _ {- 1}} {2} + \ frac {y_1} {2} $$ $$ d = y_0 $$
una vez que se conocen los coeficientes, puede interpolar $ f (x) $ para cualquier punto entre los 2 puntos centrales, $ (0 , y_0) $ y $ (1, y_1) $.
Para la interpolación bicúbica, el principio es prácticamente el mismo, pero se estima una superficie usando 16 puntos (cuadrícula 4×4) en lugar de solo una curva. Una forma sencilla de hacer esto es interpolar primero las columnas y luego interpolar las filas resultantes.
Comentarios
- estos son, por cierto, también llamados Hermite polinomios.
- Nunca había entendido cuál era todo el alboroto por las splines cúbicas de hermita antes de leer esta respuesta. ¡Es increíble, muchas gracias!
- Cuando haces interpolación bilineal, haces interpolación lineal para una variable, luego interpolación lineal para la otra. Entonces, la interpolación bicúbica es lo mismo: haga interpolación cúbica para una variable, luego interpolación cúbica para la otra, ¿verdad?