Interpolarea / scalarea biliniară a imaginii – Un exemplu de calcul

Am dori să vă indic acest grafic foarte perspicace din Wikipedia care ilustrează cum se face interpolarea biliniară pentru un punct:

Sursa: Wikipedia

După cum puteți vedea, cele patru puncte roșii reprezintă ceea ce se cunoaște. Aceste puncte le cunoașteți dinainte, iar P este punctul pe care dorim să îl interpolăm. Ca atare, trebuie să facem doi pași (așa cum ați indicat în postarea dumneavoastră). Pentru a trata coordonata x (orizontală), trebuie să calculăm care este valoarea interpolată pe rând pentru rândul de sus al punctelor roșii și pentru rândul de jos al punctelor roșii. Astfel, rezultă cele două puncte albastre R1 și R2. Pentru a gestiona coordonata y (verticală), folosim cele două puncte albastre și interpolăm pe verticală pentru a obține punctul final P.

Când redimensionați o imagine, chiar dacă nu vedem vizual ceea ce urmează să spun, dar imaginați-vă că această imagine este un semnal 3D f. Fiecare punct din matrice este, de fapt, o coordonată 3D în care locația coloanei este valoarea x, locația rândului este valoarea y, iar valoarea z este cantitatea / valoarea în tonuri de gri a matricei în sine. Prin urmare, făcând z = f(x,y) este valoarea matricei la locația (x,y) din matrice. În cazul nostru, pentru că avem de-a face cu imagini, fiecare valoare din (x,y) sunt numere întregi care merg de la 1 până la atâtea rânduri/coloane câte avem, în funcție de dimensiunea la care ne uităm.

Prin urmare, dată fiind coordonata pe care doriți să o interpolați la (x,y), și date fiind coordonatele roșii din imaginea de mai sus, pe care le numim x1,y1,x2,y2 conform diagramei – mergând în mod specific cu convenția din diagramă și făcând referire la modul în care sunt accesate imaginile: x1 = 1, x2 = 2, y1 = 2, y2 = 1, coordonatele albastre R1 și R2 sunt calculate prin interpolare 1D pe coloane folosind același rând pe care coincid ambele puncte:

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

Este important de reținut că (x - x1) / (x2 - x1) este o pondere / proporție a gradului de amestec dintre cele două valori observate la f(x1,y1) și f(x2,y1) pentru R1 sau f(x1,y2) și f(x2,y2) pentru R2. Mai exact, x1 este punctul de plecare și (x2 - x1) este diferența dintre valorile x. Se poate verifica faptul că înlocuind x1 cu x obținem 0, în timp ce x2 cu x ne dă 1. Această pondere fluctuează între , ceea ce este necesar pentru ca calculele să funcționeze.

Trebuie remarcat faptul că originea imaginii se află în colțul din stânga-sus și, prin urmare, (1,1) se află în colțul din stânga-sus. Odată găsite R1 și R2, putem găsi P prin interpolare pe rând:

P = R2 + (y - y2)/(y2 - y1)*(R1 - R2)

Încă o dată, (y - y2) / (y2 - y1) denotă proporția / amestecul de cât de mult R1 și R2 contribuie la rezultatul final P. Ca atare, ați calculat corect f5 pentru că ați folosit patru puncte cunoscute: Cel din stânga sus este 100, cel din dreapta sus este 50, cel din stânga jos este 70 și cel din dreapta jos este 20. Mai exact, dacă doriți să calculați f5, înseamnă că (x,y) = (1.5,1.5) pentru că suntem la jumătatea distanței dintre 100 și 50 datorită faptului că scalați imaginea cu doi. Dacă introduceți aceste valori în calculul de mai sus, veți obține valoarea de 60, așa cum v-ați așteptat. Ponderile pentru ambele calcule vor avea ca rezultat, de asemenea, 0.5, care este ceea ce ați obținut în calculele dvs. și la care ne așteptăm.

Dacă calculați f1, aceasta corespunde la (x,y) = (1.5,1) și dacă o înlocuiți în ecuația de mai sus, veți vedea că (y - y2)/(y2 - y1) vă dă 0 sau că ponderea este 0, și astfel ceea ce se calculează este doar R2, corespunzând interpolării liniare doar de-a lungul rândului de sus. În mod similar, dacă am calculat f7, aceasta înseamnă că dorim să interpolăm la (x,y) = (1.5,2). În acest caz, veți vedea că (y - y2) / (y2 - y1) este 1 sau ponderea este 1 și deci P = R2 + (R1 - R2), care se simplifică la R1 și este interpolarea liniară doar de-a lungul rândului de jos.

Acum este cazul lui f3 și f5. Ambele corespund la (x,y) = (1,1.5) și, respectiv, (x,y) = (2,1.5). Înlocuind aceste valori în R1 și R2 și P pentru ambele cazuri rezultă:

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

Atunci ce ne spune acest lucru? Înseamnă că interpolarea se face numai pe direcția y. Acest lucru este evident atunci când aruncăm o privire la P. Examinând mai amănunțit calculele lui P pentru fiecare dintre f3 și f5, vedeți că luăm în considerare doar valorile de-a lungul direcției verticale.

Ca atare, dacă doriți un răspuns definitiv, f1 și f7 se găsesc prin interpolarea de-a lungul direcției x / coloană doar de-a lungul aceluiași rând. f3 și f5 se găsesc prin interpolarea y / direcția rândului de-a lungul aceleiași coloane. f4 utilizează un amestec de f1 și f7 pentru a calcula valoarea finală, așa cum ați văzut deja.

Pentru a răspunde la întrebarea dvs. finală, f2, f6 și f8 sunt completate pe baza preferințelor personale. Aceste valori sunt considerate a fi în afara limitelor, valorile x și y fiind ambele 2.5 și asta în afara grilei noastre pentru (x,y). În MATLAB, implementarea implicită a acestui lucru este de a umple orice valoare din afara limitelor definite pentru a nu fi un număr (NaN), dar, uneori, oamenii extrapolează folosind interpolarea liniară, copiază valorile de frontieră sau efectuează o umplutură elaborată, cum ar fi umplutura simetrică sau circulară. Depinde de situația în care vă aflați, dar nu există un răspuns corect și definitiv cu privire la modul de completare a f2, f6 și f8 – totul depinde de aplicația dumneavoastră și de ceea ce are cel mai mult sens pentru dumneavoastră.

Ca bonus, putem verifica dacă calculele mele sunt corecte în MATLAB. Mai întâi definim o grilă de (x,y) puncte în intervalul , apoi redimensionăm imaginea astfel încât să fie de două ori mai mare, unde specificăm o rezoluție de 0,5 pe punct în loc de 1. Voi numi matricea definită 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

Grila originală de puncte (x,y) arată ca:

>> XX = 1 2 1 2>> YY = 1 1 2 2

Grila extinsă pentru a extinde dimensiunea matricei de două ori mai mult arată ca:

>> 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 este rezultatul folosind X și Y ca grilă originală de puncte și X2 și Y2 sunt punctele la care dorim să interpolăm.

Se obține:

>> BB = 100 75 50 NaN 85 60 35 NaN 70 45 20 NaN NaN NaN NaN NaN

Lasă un comentariu