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