Zniekształcenia Bilinearne-Bilinear Distort (Efekt perspektywy)

mephir

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.

     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.

0 komentarzy