Programowanie w języku PHP

Zniekształcenia Bilinearne-Bilinear Distort(Efekt perspektywy)

  • 2008-03-21 12:53
  • 0 komentarzy
  • 2468 odsłon
  • Oceń ten tekst jako pierwszy

Strona w budowie
Ktoś pracuje nad tą stroną, jej zawartość może się wkrótce zmienić. Prosimy o cierpliwość!


Zniekształcenia bilinearne, a dokładniej trasnformacja bilinearna to nieliniowa cztero-punktowa transformacja obrazu, która umożliwia przekształcenie obrazu do dowolnego czworokąta. Jest to jedna z szybszych metod, ponieważ nie zawiera operacji dzielenia. Nie zachowuje ona prostych linii przez co najlepszym zasotosowaniem są zniekształcenia w niewielkim stopniu. Wspaniale nadaje się do uzyskania efektu perspektywy.

Spis treści

          1 Wstęp
          2 Teoria
          3 Kodowanie


Wstęp


Wiedza potrzebna do zaprogramowania tego algorytmu, obejmuje zagadnienia z metod numerycznych, a konkretnie rozwiązywania liniowych układów równań. Wystarczająca jest metoda eleminacji Gaussa czy eliminacji zupełnej Gaussa-Jordana.

Teoria


Nowe spółrzędne punktów opisane sa dwoma wzorami:
  • x' = ax + by + cxy + d;
  • y' = ex + fy + gxy + h;
Aby wyliczyć współczynniki a, b, c, d powinniśmy utworzyć dwa układy czterech równań(w oparciu o powyższe wzory). Dla każdej wspólrzędnej po jednym układzie.
Na przykład:
Przykładowe współrzędne:
  • żródłowe: s1(x1, y1), s2(x2, y2), s3(x3, y3), s4(x4, y4),
  • docelowe: d1(x'1, y'1), d2(x'2, y'2), d3(x'3, y'3), d4(x'4, y'4),
Układamy je w następujące układy równań:
dla współrzędnej x':
x'1=ax1*by1*cx1y1+d
x'2=ax2*by2*cx2y2+d
x'3=ax3*by3*cx3y3+d
x'4=ax4*by4*cx4y4+d


oraz dla współrzędnej y:
y'1=ex1*fy1*gx1y1+h
y'2=ex2*fy2*gx2y2+h
y'3=ex3*fy3*gx3y3+h
y'4=ex4*fy4*gx4y4+h


Po obliczeniu tych układów, posiadamy już wspołczynniki a, b, c, d, e, f, g, h, które możemy podstawić do wzorów na x' i y' i rozpocząć obliczanie nowych współrzędnych punktów.

Kodowanie


Co potrzebujemy aby rozpocząć kodowanie:
  • dwie grafiki
  • współrzędne punktów docelowych
Aby przykład zadziałał, serwer musi mieć włączone rozszerzenie GD.

Aby zrealizowac przykładowy kod powinniśmy najpierw, utworzyc plik z niezbędnymi funckjami, gdzie powinny się znaleźć:
  • ResolveMatrix(array()) - "rozwiązywanie macierzy", dokładnie w moim przypadku znajdować się będzie metoda eliminacji Gaussa
  • Diagonal(array()) - funckja sprawdza z podanej macierzy da się uzyskać macierz diagonalną, jeżeli nie to "żongluje wierszami".
  • IsDiagonal(array()) - funkcja potrzebna do Diagonal() sprawdza ona czy z macierzy podanej w argumencie uda się utworzyć macierz diagonalną czyli taką w której na przekątnej są jedynki
  • GetConstans(array(), array()) - funkcja zwraca nam współczynniki a, b, c, d, e, f, g, h, pierwszy argumentem jest tablica z punktami oryginalnego obrazka, drugim tablica z punktami docelowymi.
  • getX(int, int, array()), getY(int, int, array()) - obydwie funckje obliczają nowe wspołrzędne dla punktów, pierwszy argument to współrzędna x oryginału, drugi to y oryginału, trzeci to tablica z wyliczonymi współczynnikami(wynik działania funckji GetConstans())

Z racji iż jest stała ilość wierszy macierzy funkcje są uproszczone, w stosunku do prawidłowych dla metody Gaussa.