Jag försöker göra bicubic interpolation på en 8 * 8 matris (bild) som visas nedan.
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
Jag använde följande matlab-kod för det och jag fick en utdata
interp2(A,"bicubic")
Men även efter googling får jag inte hur man gör det manuellt. Kan någon hjälpa mig att få idén med detta exempel (endast för få pixlar)?
Svar
Här ganska bra förklaring.
Jag börjar med att överväga 1D-fallet med kubisk interpolering (eftersom det är lättare att förklara) och gå sedan vidare till 2D-fallet.
Grundidén med kubisk interpolation är att uppskatta värdena mellan två punkter som en kubisk funktion, $ f (x) $, med första derivat, $ f ”(x) $
$$ f (x) = ax ^ 3 + bx ^ 2 + cx + d $$ $$ f ”(x) = 3ax ^ 2 + 2bx + c $$
så att, när den splitsas till de intilliggande kubiska splines till vänster och till höger är den interpolerade funktionen (”nollderivat”) och dess första derivat kontinuerliga. Det betyder att vid den vänstra gränsen för en viss spline är noll och första derivat lika med de för den högra gränsen för intilliggande spline omedelbart till vänster.
Utan förlust av generalitet kan vi anta att vi interpolerar mellan $ x = 0 $ och $ x = 1 $ . På vänster och höger gräns ser vi att
$$ f (0) = d $$ $$ f (1) = a + b + c + d $$ $$ f ”(0) = c $$ $$ f ”(1) = 3a + 2b + c $$
Lösning för polynomkoefficienterna
$$ a = 2f (0) – 2f (1 ) + f ”(0) + f” (1) $$ $$ b = -3f (0) + 3f (1) – 2f ”(0) – f” (1) $$ $$ c = f ”( 0) $$ $$ d = f (0) $$
Tänk nu på de fyra punkterna runt regionen som uppskattas, vilka är $ (- 1, y _ {- 1}) $, $ (0 , y_0) $, $ (1, y_1) $, $ (2, y_2) $ och införa gränsvillkor som
$$ f (0) = y_0 $$ $$ f (1) = y_1 $$
och definiera de två gränsderivaten som
$$ f ”(0) = \ frac {y_1-y _ {- 1}} {2} $$ $$ f ”(1) = \ frac {y_2-y_0} {2} $$
vilket överensstämmer med hur de kommer att definieras för intilliggande splines.
Sedan
$$ 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 $$
när koefficienterna är kända kan du interpolera $ f (x) $ för vilken punkt som helst mellan de centrala 2 punkterna, $ (0 , y_0) $ och $ (1, y_1) $.
För bikubisk interpolering är principen ungefär densamma men du uppskattar en yta med 16 punkter (4×4 rutnät) snarare än bara en kurva. Ett enkelt sätt att göra detta är att först interpolera kolumnerna och sedan interpolera de resulterande raderna.
Kommentarer
- det här är BTW, även kallat Hermite polynomier.
- Jag har aldrig förstått vad allt krångel över kubiska hermitiska splines var innan jag läste detta svar. Det är så fantastiskt, tack så mycket!
- När du gör bilinear interpolation gör du linjär interpolering för en variabel, sedan linjär interpolation för den andra. Så bikubisk interpolation är densamma: gör kubisk interpolering för en variabel, sedan kubisk interpolation för den andra, eller hur?