Ik probeer bicubische interpolatie uit te voeren op een 8 * 8 matrix (afbeelding) die hieronder wordt weergegeven.
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
Ik heb de volgende matlab-code ervoor gebruikt en ik heb een uitvoer
interp2(A,"bicubic")
Maar zelfs na het googlen krijg ik geen hoe u het handmatig moet doen. Kan iemand me helpen om het idee te krijgen met behulp van dit voorbeeld (slechts voor enkele pixels)?
Antwoord
Hier redelijk goede uitleg.
Ik zal beginnen met het 1D-geval van kubieke interpolatie te beschouwen (omdat het gemakkelijker uit te leggen is) en dan verder gaan met het 2D-geval.
Het basisidee van kubieke interpolatie is om de waarden tussen twee willekeurige punten te schatten door als een kubieke functie, $ f (x) $, met eerste afgeleide, $ f “(x) $
$$ f (x) = ax ^ 3 + bx ^ 2 + cx + d $$ $$ f “(x) = 3ax ^ 2 + 2bx + c $$
zodat, wanneer ze worden gesplitst naar de aangrenzende kubieke splines aan de linker- en rechterkant, zijn de geïnterpoleerde functie (de nulde afgeleide) en de eerste afgeleide ervan continu. Dat betekent dat aan de linkergrens van een bepaalde spline de nullen en de eerste afgeleiden zijn gelijk aan die van de rechtergrens van de aangrenzende spline onmiddellijk links.
Zonder verlies van algemeenheid kunnen we aannemen dat we interpoleren tussen $ x = 0 $ en $ x = 1 $Aan de linker- en rechtergrenzen zien we dat
$$ f (0) = d $$ $$ f (1) = a + b + c + d $$ $$ f “(0) = c $$ $$ f “(1) = 3a + 2b + c $$
Oplossen voor de polynoomcoëfficiënten
$$ a = 2f (0) – 2f (1 ) + f “(0) + f” (1) $$ $$ b = -3f (0) + 3f (1) – 2f “(0) – f” (1) $$ $$ c = f “( 0) $$ $$ d = f (0) $$
Beschouw nu de vier punten rond de regio die wordt geschat, namelijk $ (- 1, y _ {- 1}) $, $ (0 , y_0) $, $ (1, y_1) $, $ (2, y_2) $, en leggen randvoorwaarden op die
$$ f (0) = y_0 $$ $$ f (1) = y_1 $$
en definieer de twee grensderivaten als
$$ f “(0) = \ frac {y_1-y _ {- 1}} {2} $$ $$ f “(1) = \ frac {y_2-y_0} {2} $$
wat consistent is met hoe ze worden gedefinieerd voor de aangrenzende splines.
Dan
$$ 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 $$
zodra de coëfficiënten bekend zijn, kunt u $ f (x) $ interpoleren voor elk punt tussen de twee centrale punten, $ (0 , y_0) $ en $ (1, y_1) $.
Voor bicubische interpolatie is het principe vrijwel hetzelfde, maar je schat een oppervlak met 16 punten (4×4 raster) in plaats van alleen een curve. Een eenvoudige manier om dit te doen is door eerst de kolommen te interpoleren en vervolgens de resulterende rijen te interpoleren.
Opmerkingen
- deze worden trouwens ook wel Hermite genoemd veeltermen.
- Ik heb nooit begrepen wat al het gedoe over kubische hermiet-splines was voordat ik dit antwoord las. Het is zo geweldig, heel erg bedankt!
- Als je bilineaire interpolatie doet, doe je lineaire interpolatie voor de ene variabele en dan lineaire interpolatie voor de andere. Dus bicubische interpolatie is hetzelfde: doe kubieke interpolatie voor de ene variabele, dan kubieke interpolatie voor de andere, toch?