Viittaan tähän Wikipediasta löytyvään erittäin oivaltavaan grafiikkaan, joka havainnollistaa, miten bilineaarinen interpolointi tehdään yhdelle pisteelle:
Lähde: Wikipedia
Kuten näet, neljä punaista pistettä ovat sitä, mitä tiedetään. Nämä pisteet tiedät etukäteen ja P
on piste, jonka haluamme interpoloida. Sinänsä meidän on tehtävä kaksi vaihetta (kuten olet viestissäsi ilmoittanut). Käsitelläksemme x
-koordinaattia (vaakasuora) meidän on laskettava, mikä on interpoloitu arvo riveittäin punaisten pisteiden ylimmän rivin ja punaisten pisteiden alimman rivin osalta. Näin saadaan kaksi sinistä pistettä R1
ja R2
. Käsitellaksemme y
-koordinaattia (pystysuora), käytämme kahta sinistä pistettä ja interpoloimme pystysuunnassa saadaksemme lopullisen P
-pisteen.
Kun muutat kuvan kokoa, vaikka emme visuaalisesti näe, mitä olen sanomassa, mutta kuvittele, että tämä kuva on kolmiulotteinen signaali f
. Jokainen piste matriisissa on itse asiassa 3D-koordinaatti, jossa sarakkeen sijainti on x
-arvo, rivin sijainti on y
-arvo ja z
-arvo on itse matriisin määrä / harmaasävyarvo. Näin ollen tekeminen z = f(x,y)
on matriisin arvo sijainnissa (x,y)
matriisissa. Meidän tapauksessamme, koska olemme tekemisissä kuvien kanssa, jokainen arvo (x,y)
ovat kokonaislukuja, jotka menevät 1:stä niin moneen riviin/sarakkeeseen kuin meillä on riippuen siitä, mitä ulottuvuutta tarkastelemme.
Jos siis annetaan koordinaatti, jonka haluat interpoloida kohdassa (x,y)
, ja annetaan punaiset koordinaatit yllä olevassa kuvassa, joita kutsumme niitä x1,y1,x2,y2
kaavion mukaisesti – nimenomaan menemällä kaaviossa esitettyjen konventioiden mukaan ja viittaamalla siihen, miten kuvia käytetään: x1 = 1, x2 = 2, y1 = 2, y2 = 1
, siniset koordinaatit R1
ja R2
lasketaan 1D-interpoloinnin avulla sarakkeittain käyttäen samaa riviä, jolla molemmat pisteet osuvat yhteen:
R1 = f(x1,y1) + (x - x1)/(x2 - x1)*(f(x2,y1) - f(x1,y1))R2 = f(x1,y2) + (x - x1)/(x2 - x1)*(f(x2,y2) - f(x1,y2))
On tärkeää huomata, että (x - x1) / (x2 - x1)
on paino / osuus siitä, kuinka paljon sekoitus koostuu tulosteen kahdesta arvosta, jotka nähdään kohdissa f(x1,y1)
ja f(x2,y1)
R1
:n kohdalla R1
:n kohdalla, tai f(x1,y2)
:ssä :n ja :n kohdassa, kun kyseessä on R2
. Tarkemmin sanottuna x1
on lähtöpiste ja (x2 - x1)
on x
-arvojen erotus. Voit tarkistaa, että korvaamalla x1
arvolla x
saadaan 0, kun taas x2
arvolla x
saadaan 1. Tämä paino vaihtelee välillä , jota tarvitaan, jotta laskutoimitukset toimisivat.
On huomattava, että kuvan origo on vasemmassa yläkulmassa, joten (1,1)
on vasemmassa yläkulmassa. Kun R1
ja R2
on löydetty, voimme löytää P
interpoloimalla riveittäin:
P = R2 + (y - y2)/(y2 - y1)*(R1 - R2)
Vaikka (y - y2) / (y2 - y1)
tarkoittaa sitä osuutta/yhdistelmää, kuinka paljon R1
ja R2
myötävaikuttavat lopulliseen tulokseen P
. Sinänsä laskit f5
oikein, koska käytit neljää tunnettua pistettä: Vasemmalla ylhäällä on 100, oikealla ylhäällä on 50, vasemmalla alhaalla on 70 ja oikealla alhaalla on 20. Konkreettisesti, jos haluat laskea f5
, tämä tarkoittaa, että (x,y) = (1.5,1.5)
, koska olemme puolivälissä 100:n ja 50:n välillä johtuen siitä, että skaalaat kuvaa kahdella. Jos liität nämä arvot yllä olevaan laskutoimitukseen, saat arvon 60, kuten odotitkin. Molempien laskutoimitusten painotukset antavat myös tulokseksi 0.5
, jonka sait laskelmissasi ja jota odotamme.
Jos lasket f1
, tämä vastaa arvoa (x,y) = (1.5,1)
, ja jos korvaat tämän yllä olevaan yhtälöön, huomaat, että (y - y2)/(y2 - y1)
antaa arvon 0 tai paino on 0, joten se, mikä lasketaan, on vain R2
, joka vastaa lineaarista interpolointia vain yläriviä pitkin. Vastaavasti, jos laskimme f7
, tämä tarkoittaa, että haluamme interpoloida kohdassa (x,y) = (1.5,2)
. Tässä tapauksessa näet, että (y - y2) / (y2 - y1)
on 1 tai paino on 1 ja siten P = R2 + (R1 - R2)
, joka yksinkertaistuu R1
:ksi ja vastaa lineaarista interpolointia vain alinta riviä pitkin.
Nyt on tapaus f3
ja f5
. Nämä molemmat vastaavat vastaavasti (x,y) = (1,1.5)
ja (x,y) = (2,1.5)
. Kun nämä arvot korvataan R1
:lla ja R2
:lla ja P
:lla molemmissa tapauksissa saadaan:
f3
R1 = f(1,2) + (1 - 1)/(2 - 1)*(f(2,2) - f(1,2)) = f(1,2)R2 = f(1,1) + (1 - 1)/(2 - 1)*(f(1,2) - f(1,1)) = f(1,1)P = R1 + (1.5 - 1)*(R1 - R2) = f(1,2) + 0.5*(f(1,2) - f(1,1))P = 70 + 0.5*(100 - 70) = 85
f5
R1 = f(1,2) + (2 - 1)/(2 - 1)*(f(2,2) - f(1,2)) = f(2,2)R2 = f(1,1) + (2 - 1)/(2 - 1)*(f(1,2) - f(1,1)) = f(1,2)P = R1 + (1.5 - 1)*(R1 - R2) = f(2,2) + 0.5*(f(2,2) - f(1,2))P = 20 + 0.5*(50 - 20) = 35
Mitä tämä siis kertoo meille? Tämä tarkoittaa, että interpoloit vain y-suunnassa. Tämä käy ilmi, kun tarkastelemme P
. Tarkastelemalla tarkemmin P
:n laskutoimituksia kummankin f3
:n ja f5
:n kohdalla näet, että tarkastelemme arvoja vain pystysuunnassa.
Jos haluat lopullisen vastauksen, f1
ja f7
löytyvät interpoloimalla vain x
:n / sarakkeen suunnassa samaa riviä pitkin. f3
ja f5
löytyvät interpoloimalla y
/ rivin suuntaan samaa saraketta pitkin. f4
käyttää f1
:n ja f7
:n sekoitusta lopullisen arvon laskemiseen, kuten olet jo nähnyt.
Vastauksena viimeiseen kysymykseesi f2
, f6
ja f8
täytetään henkilökohtaisten mieltymysten perusteella. Näitä arvoja pidetään rajojen ulkopuolella, sillä x
– ja y
-arvot ovat molemmat 2.5
, ja se on (x,y)
:n -ristikon ulkopuolella. MATLABissa tämän oletustoteutus on täyttää kaikki määritettyjen rajojen ulkopuolella olevat arvot ei-lukuna (
NaN
), mutta joskus ihmiset ekstrapoloivat käyttämällä lineaarista interpolointia, kopioivat raja-arvoja tai suorittavat jonkin monimutkaisen täytteen, kuten symmetrisen tai ympyränmuotoisen täytteen. Riippuu tilanteesta, mutta ei ole olemassa oikeaa ja lopullista vastausta siihen, miten f2
, f6
ja f8
täytetään – kaikki riippuu sovelluksestasi ja siitä, mikä on sinulle järkevintä.
Bonuksena voimme tarkistaa, että laskelmani ovat oikein MATLABissa. Määrittelemme ensin (x,y)
pisteen ruudukon alueella ja muutamme sitten kuvan kokoa niin, että se on kaksi kertaa suurempi, jolloin määrittelemme resoluutioksi 0,5 pistettä kohti eikä 1. Kutsun määrittelemääsi matriisia
A
:
A = ; %// Define original matrix = meshgrid(1:2,1:2); %// Define original grid of points = meshgrid(1:0.5:2.5,1:0.5:2.5) %// Define expanded grid of pointsB = interp2(X,Y,A,X2,Y2,'linear'); %// Perform bilinear interpolation
Alkuperäinen (x,y)
pisteen ruudukko näyttää seuraavalta:
>> XX = 1 2 1 2>> YY = 1 1 2 2
Laajennettu ruudukko, jolla laajennetaan matriisin kokoa kaksi kertaa suuremmaksi, näyttää seuraavalta:
>> X2X2 = 1.0000 1.5000 2.0000 2.5000 1.0000 1.5000 2.0000 2.5000 1.0000 1.5000 2.0000 2.5000 1.0000 1.5000 2.0000 2.5000>> Y2Y2 = 1.0000 1.0000 1.0000 1.0000 1.5000 1.5000 1.5000 1.5000 2.0000 2.0000 2.0000 2.0000 2.5000 2.5000 2.5000 2.5000
B
on tuloste, jossa käytetään alkuperäisenä pisteiden ruudukkona pistemääriä X
ja Y
, ja pistemääriä, joihin haluamme tehdä interpoloinnin, ovat X2
ja Y2
.
Saadaan:
>> BB = 100 75 50 NaN 85 60 35 NaN 70 45 20 NaN NaN NaN NaN NaN