Interpolacja dwusześcienna

Próbuję wykonać interpolację dwusześcienną na macierzy 8 * 8 (obraz) pokazanej poniżej.

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 

Użyłem do tego następującego kodu Matlab i otrzymałem wynik

interp2(A,"bicubic") 

Ale nawet po googlowaniu nie otrzymuję jak to zrobić ręcznie. Czy ktoś może mi pomóc w zrobieniu tego pomysłu na tym przykładzie (tylko dla kilku pikseli)?

Odpowiedź

Tutaj całkiem dobre wyjaśnienie.

Zacznę od rozważenia przypadku 1D interpolacji sześciennej (ponieważ jest łatwiejszy do wyjaśnienia), a następnie przejdę do przypadku 2D.

Podstawową ideą interpolacji sześciennej jest oszacowanie wartości między dowolnymi dwoma punktami za pomocą funkcji sześciennej, $ f (x) $, z pierwszą pochodną, $ f „(x) $

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

więc gdy zostanie dołączony do sąsiednich krzywych sześciennych po lewej i po prawej stronie, interpolowana funkcja („pochodna zerowa”) i jej pierwsza pochodna są ciągłe. Oznacza to, że na lewej granicy jakiegoś podanego splajnu zerowa i pierwsza pochodna są równe tym z prawej granicy sąsiedniego splajnu bezpośrednio po lewej stronie.

Bez utraty ogólności możemy założyć, że interpolujemy między $ x = 0 $ a $ x = 1 $ . Po lewej i prawej granicy widzimy, że

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

Rozwiązywanie współczynników wielomianu

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

Rozważmy teraz cztery punkty wokół szacowanego regionu, którymi są $ (- 1, y _ {- 1}) $, $ (0 , y_0) $, $ (1, y_1) $, $ (2, y_2) $ i narzucają warunki brzegowe, które

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

i zdefiniuj dwie pochodne po granicach jako

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

, co jest zgodne z tym, jak zostaną zdefiniowane dla sąsiednich splajnów.

Następnie

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

gdy znane są współczynniki, można interpolować $ f (x) $ dla dowolnego punktu między dwoma środkowymi punktami, $ (0 , y_0) $ i $ (1, y_1) $.

W przypadku interpolacji dwusześciennej zasada jest prawie taka sama, ale powierzchnię szacuje się za pomocą 16 punktów (siatka 4×4), a nie tylko krzywej. Prostym sposobem na to jest najpierw interpolacja kolumn, a następnie interpolacja wynikowych wierszy.

Komentarze

  • to są, tak przy okazji, zwane Hermite wielomiany.
  • Przed przeczytaniem tej odpowiedzi nigdy nie zrozumiałem, na czym polegało całe zamieszanie wokół sześciennych hermitowych splajnów. To niesamowite, dziękuję bardzo!
  • Podczas wykonywania interpolacji bilinearnej, wykonujesz interpolację liniową dla jednej zmiennej, a następnie interpolację liniową dla drugiej. Tak więc interpolacja dwuścienna jest taka sama: czy interpolację sześcienną dla jednej zmiennej, a następnie interpolację sześcienną dla drugiej, prawda?

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *