algorytm.org

Tilt-Shift - efekt makiety

Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Tilt-Shift - efekt makiety
Ocena użytkowników:***** / 5
SłabyŚwietny 
Wpisany przez Tomasz Lubiński, 06 czerwca 2012 14:21

Zwykłe zdjęcia robione z daleka i obejmujące dużą powierzchnię są z reguły w całości ostre. Natomiast zdjęcia makro, robione z bliska miniaturowym makietom są "ostre" tylko w pewnym zakresie. Efekt taki można uzyskać dla rzeczywistych obiektów fotografując je przy użyciu obiektywów Tilt-Shift, w których użytkownik ma możliwość przesunięcia osi optycznej. Obecnie dzięki cyfrowemu przetwarzaniu obrazów taki efekt można uzyskać ze zwykłego zdjęcia bez potrzeby używania drogich i specjalistycznych obiektywów.

By uzyskać efekt makiety wystarczy wziąć zwykłe zdjęcie, które w całości jest ostre. Następnie wybrać niewielki obszar, który pozostawimy ostrym a resztę rozmyć. Na większości zdjęć odległość obiektów zmienia się w osi pionowej, tzn. obiekty znajdujące się blisko są na dole zdjęcia, a te które są dalej są wyżej. Dlatego też obszar ostrego obrazu jest poziomy, gdyż ma objąć obiekty, które są w tej samej odległości. Sposób postępowania pokazany jest na schemacie poniżej.

Tilt-Shift schemat działania


Algorytm działać będzie następująco:
Do operacji rozmywania użyjemy filtru Gaussa (rozmywania Gaussowskiego). Filtr ten zastosujemy dwa razy. Pierwszy raz w kierunku poziomym podczas kopiowania punktów z obrazu wejściowego, drugi raz w kierunku pionowym na obrazie wyjściowym. Kolejne współczynniki filtru x = 0, 1, 2, ... opisane są następującym wzorem:

\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{x^{2}}{2\sigma^{2}}}
Wartość σ określa siłę rozmycia. Ja w swoim przykładzie przyjąłem wartości od 0.1 na granicy obszaru ostrego do 6 na końcu dłuższego z obszarów rozmytych. Wartości σ zmieniają się liniowo, a więc zgodnie ze wzorem:
\sigma = 0.1 + (6 - 0.1) * \frac{odległoscPunktuOdObszaruOstrego}{wielkoscDluzszegoObszaruRozmytego}
Wielkość filtra (liczbę użytych współczynników), ograniczyłem do mniejszej z dwóch liczb:

Filtr modyfikuje punkty zgodnie ze wzorem:


Tak więc na przykład dla σ = 0.5 będziemy mieć następujące 3 współczynniki (czwarty współczynnik jest już mniejszy niż 0.003): 0.569917543, 0.205425518, 0.009620142. Co dla rozmycia w poziomie punktu o współrzędnych (x, y) wykorzystamy następująco:
(x, y) = (0.569917543*(x, y) + 0.205425518*(x-1, y) + 0.205425518*(x+1, y) + 0.009620142*(x-2, y) + 0.009620142*(x+2, y)) / (0.569917543 + 2*0.205425518 +2*0.009620142)

Przy czym należy zabezpieczyć się przed wyjściem poza obszar, i tak:
Podobnie dla przetwarzania w pionie.

To już wszystkie operacje jakie są konieczne do przetworzenia zwykłego zdjęcia w obraz makiety. Czasem dla lepszego efektu zwiększa się jeszcze kontrast, ale nie jest to konieczne.

Poniżej zdjęcie oryginalne:
obraz wejściowy

Zdjęcie po użyciu efektu Tilt-Shift:
Tilt-Shift


Przykład w JavaScript:

Ustaw ścieżkę do pliku (lub pozostaw tą domyślną), wczytaj plik a następnie kliknij na obrazie by sprawdzić działanie 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/poznan2.jpg
http://www.algorytm.org/images/stories/po/poznan3.jpg
Plik:
Szerokość obszaru in-focus (z ostrym obrazem):
Siła rozmycia:
Wskaż na zdjęciu środek obszaru "in-focus"


Implementacje
AutorJęzyk
programowania
KomentarzOtwórzPobierzOcena
Tomasz LubińskiC#Visual Studio C# 2010 Express
.cs
.cs
***** / 0
Tomasz LubińskiJavaScriptFirefox 3.0+, Safari 3.0+, Chrome 3.0+, Opera 9.5+, IE 9.0+
.js
.js
***** / 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: 23 sierpnia 2012 14:40
Komentarze
photo
0 # T0masz 2013-12-28 17:51
Dzięki ;)
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz