StartAlgorytmyPrzetwarzanie obrazówZmiana wielkości obrazu - Interpolacja dwuliniowa
Baza Wiedzy
Wersja offline serwisu przeznaczona na urządzenia z systemem Android.

Darowizny
darowiznaWspomóż rozwój serwisu


Nagłówki RSS
Kanał artykuły
Kanał implementacje
Kanał komentarze
Kanał forum


Bookmarki









Sonda
Implementacji w jakim języku programowania poszukujesz?
 
Zmiana wielkości obrazu - Interpolacja dwuliniowa
Ocena użytkowników:+++++ / 5
SłabyŚwietny 
Wpisany przez Tomasz Lubiński
poniedziałek, 03 kwietnia 2006 20:07
Algorytm interpolacji dwuliniowej (ang. Bilinear Interpolation), zwany inaczej metodą podwójnej interpolacji liniowej jest algorytmem zmiany wielkości obrazu (ang. resampling) nieco bardziej zawansowanym niż algorytm najbliższego sąsiedzta (ang. Nearest Neighbour). Każdy piksel obrazu wynikowego przyjmuje wartość na podstawie wartości czterech sąsiednich punktów obrazu wejściowego. Nazwa algorytmu bierze się z fatu, iż interpolację liniową przeprowadzamy dwukrotnie - jeden raz w poziome i jeden raz w pionie.
Najpierw należy obliczyć, w którym miejscu w obrazie wejściowym znajduje się rozpatrywany punkt obrazu wyjściowego. Schemat poniżej pokazuje dwa nałożone na siebie obrazy (4x4 oraz 5x5)

Zmiana wielkości obrazu
Matematycznie można to zapisać następująco:
niech, widthsrc oraz widthdst oznaczają odpowiednio szerokość obrazu wejściowego i obrazu wyjściowego, a heightsrc oraz heightdst odpowiednio wysokość obrazu wejściowego i wyjściowego.
Przyjmiemy wówczas, że:
ratiox = widthsrc / widthdst
ratioy = heightsrc / heightdst
Wówczas dla każdego punktu obrazu wyjściowego (i oznacza kolumnę, j oznacza wiersz - zakładamy, że indeksy liczone są od 0 włącznie) przeprowadzamy następujące obliczenia:
x = i*ratiox
y = j*ratioy
Oznacza to, że dla punku o współrzędnych (i, j) obrazu wyjściowego należy użyć wartości punktu o współrzędnych (x, y) obrazu wejściowego. Przykładowe umiejscowienie tak wyliczonego punktu pokazano na schemacie poniżej. W wyjątkowej sytuacji - np. dla punktów znajdujących się na krawędziach obrazu odległość a i/lub b wynosi zero. Zuważyć należy też iż, do obliczeń na krawędziach lewej i dolnej obrazu potrzebny będzie piksel leżący poza obrazem wejściowym. Jego wartość podczas obliczeń nie będzie brana jednak pod uwagę co wynika z przytoczonych poniżej wzorów interpolacji dwuliniowej.

Położenie nowego punktu

Teraz przeprowadzimy interpolację liniową w kierunku poziomym:
Fa,0 = (1-a)*F0,0 + a*F1,0
Fa,1 = (1-a)*F0,1 + a*F1,1
A następnie na podstawie tych wyników w kierunku pionowym:
Fa,b = (1-b)*Fa,0 + b*Fa,1
Obliczenia takie należy przeprowadzić dla każdej składowej koloru z osobna.

Przykład
Należy przekształcić obraz 4x10 w obraz 5x16.
Obliczamy współczynniki powiększenia:
ratiox = widthsrc / widthdst = 4/5 = 0.8
ratioy = heightsrc / heightdst = 10 / 16 = 0.625

Obliczmy wartość dla punktu (3, 7).
x = i*ratiox = 3 * 0.8 = 2.4
y = j*ratioy = 7 * 0.625 = 4.375
A więc będziemy musieli wziąć pod uwagę w naszych obliczeniach wartości w punktach (2, 4), (2, 5), (3, 4) oraz (3, 5). Niech wynoszą one odpowiednio 20, 29, 42, 58. Obliczymy teraz współczynniki a i b - są to częsci dziesiętne odpowiednich składowych.
a = 0.375
b = 0.4

Przeprowadzimy teraz interpolację liniową w kierunku poziomym:
Fa,0 = (1-a)*F0,0 + a*F1,0 = (1-0.375)*20 + 0.375*42 = 12.5 + 15.75 = 28.25
Fa,1 = (1-a)*F0,1 + a*F1,1 = (1-0.375)*29 + 0.375*58 = 34.375 + 21.75 = 56.125
A następnie na podstawie tych wyników w kierunku pionowym:
Fa,b = (1-b)*Fa,0 + b*Fa,1 = (1-0.4)*28.25 + 0.4*56.125 = 16.95 + 22.45 = 39.4
A więc wartość składowej w punkcie (3, 7) wynosić będzie 39.4. Obliczenia takie należy powtórzyć dla wszystkich punktów i wszystkich składowych.

Schemat poniżej pokazuje zdjęcie oryginalne (na środku) powiększone czterokrotnie (po prawej) oraz pomniejszone czterokrotnie (po lewej)

Podwójna inerpolacja liniowa

Przykład w JavaScript:
Ustaw ścieżkę do pliku (lub pozostaw tą domyślną), wczytaj plik a następnie użyj przycisku "Korekcja gamma" w celu sprawdzenia działania metody.
Ze względu na zabezpieczenia w przeglądarkach, skrypt otwiera wyłącznie pliki graficzne w obrębie naszego serwisu, np:
http://www.algorytm.org/images/stories/po/anaglif_lewy.jpg
http://www.algorytm.org/images/stories/po/orig.gif
http://www.algorytm.org/images/stories/mb/hsv.jpg

Skala x:%
Skala y:%



Autor Język programowania Komentarz Otwórz Pobierz Ocena
Tomasz Lubiński C/C++ Borland Builder 6
Implementacja w C/C++
Implementacja w C/C++
++++- / 3
Tomasz Lubiński Delphi/Pascal Borland Delphi 5
Implementacja w Delphi/Pascal
Implementacja w Delphi/Pascal
++++- / 2
Tomasz Lubiński Java Script Firefox 3.0+, Safari 3.0+, Chrome 3.0+, Opera 9.5+, IE 9.0+
Implementacja w Java Script
Implementacja w Java Script
----- / 0
 
Dodaj własną implementację tego algorytmu
  • Zaloguj się na stronie
Plik:
Język programowania:
Komentarz:
  By móc dodać implementacje zaloguj się na stronie



Poprawiony: czwartek, 12 stycznia 2012 11:14

Komentarze

 
photo
0 # Tomek 2009-08-26 00:46
a co ze zmniejszaniem rozdzielczości tym algorytmem?
Odpowiedz | Odpowiedz z cytatem | Cytować
 
 
photo
+2 # ag 2009-11-11 22:44
na pewno te wartości są dobrze policzone?
a = 0.375
b = 0.4
nie powinny byc na odwrót?
jeśli x=2.4 to a = x - (int)x?
Odpowiedz | Odpowiedz z cytatem | Cytować
 
 
photo
0 # Losiu 2012-02-02 18:01
Dokładnie, mam identyczne zastrzeżenie :)
Odpowiedz | Odpowiedz z cytatem | Cytować
 

Dodaj komentarz

Kod antysapmowy
Odśwież