Interpolação bicúbica

Estou tentando fazer interpolação bicúbica em uma matriz (imagem) 8 * 8 mostrada abaixo.

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 

Usei o seguinte código matlab para ele e obtive uma saída

interp2(A,"bicubic") 

Mas mesmo depois de pesquisar no Google, não estou conseguindo como fazer isso manualmente. Alguém pode me ajudar a ter uma ideia usando este exemplo (apenas para alguns pixels)?

Resposta

Aqui uma boa explicação.

Vou começar considerando o caso 1D de interpolação cúbica (porque é mais fácil de explicar) e, em seguida, vou para o caso 2D.

A ideia básica da interpolação cúbica é estimar os valores entre quaisquer dois pontos como uma função cúbica, $ f (x) $, com a primeira derivada, $ f “(x) $

$$ f (x) = ax ^ 3 + bx ^ 2 + cx + d $$ $$ f “(x) = 3ax ^ 2 + 2bx + c $$

de modo que, quando emendado para os splines cúbicos adjacentes à esquerda e à direita, a função interpolada (a “derivada zero”) e sua primeira derivada são contínuas. Isso significa que, no limite esquerdo de algum spline dado, o zero e as primeiras derivadas são iguais aos do limite direito da spline adjacente imediatamente à esquerda.

Sem perda de generalidade, podemos assumir que estamos interpolando entre $ x = 0 $ e $ x = 1 $ . Nos limites esquerdo e direito, vemos que

$$ f (0) = d $$ $$ f (1) = a + b + c + d $$ $$ f “(0) = c $$ $$ f “(1) = 3a + 2b + c $$

Resolvendo os coeficientes polinomiais

$$ a = 2f (0) – 2f (1 ) + f “(0) + f” (1) $$ $$ b = -3f (0) + 3f (1) – 2f “(0) – f” (1) $$ $$ c = f “( 0) $$ $$ d = f (0) $$

Agora considere os quatro pontos ao redor da região sendo estimada, que são $ (- 1, y _ {- 1}) $, $ (0 , y_0) $, $ (1, y_1) $, $ (2, y_2) $, e impõe condições de contorno que

$$ f (0) = y_0 $$ $$ f (1) = y_1 $$

e defina as duas derivadas de limite como

$$ f “(0) = \ frac {y_1-y _ {- 1}} {2} $$ $$ f “(1) = \ frac {y_2-y_0} {2} $$

que é consistente com a forma como eles serão definidos para os splines adjacentes.

Então

$$ 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 $$

assim que os coeficientes forem conhecidos, você pode interpolar $ f (x) $ para qualquer ponto entre os 2 pontos centrais, $ (0 , y_0) $ e $ (1, y_1) $.

Para interpolação bicúbica, o princípio é praticamente o mesmo, mas você estima uma superfície usando 16 pontos (grade 4×4) em vez de apenas uma curva. Uma maneira simples de fazer isso é primeiro interpolar as colunas e, em seguida, interpolar as linhas resultantes.

Comentários

  • estes são, BTW, também chamados de Hermite polinômios.
  • Eu nunca entendi o que era toda a confusão sobre splines cúbicas de hermite antes de ler esta resposta. É tão incrível, muito obrigado!
  • Ao fazer a interpolação bilinear, você faz a interpolação linear para uma variável e depois a interpolação linear para a outra. Portanto, a interpolação bicúbica é a mesma: faça a interpolação cúbica para uma variável e depois a interpolação cúbica para a outra, certo?

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *