Spojrzenie w 3D

W ubiegłym miesiącu badaliśmy funkcjonowanie automatów komórkowych w przestrzeni 3D. Dzisiaj pozostaniemy w trzecim wymiarze, ale zajmiemy się czymś zupełnie innym - specyficznym sposobem fotografowania, prowadzącym do uzyskania tzw. anaglifów.

W ubiegłym miesiącu badaliśmy funkcjonowanie automatów komórkowych w przestrzeni 3D. Dzisiaj pozostaniemy w trzecim wymiarze, ale zajmiemy się czymś zupełnie innym - specyficznym sposobem fotografowania, prowadzącym do uzyskania tzw. anaglifów.

Czy zastanawiali się Państwo, po co zwierzętom dwoje oczu? Czy jest to darowany przez Naturę nadmiar na wypadek jakiegoś nieszczęścia? Być może tak, ale nie u gatunków patrzących w jednym kierunku. Gatunki mające oczy z przodu głowy, czyli np. człowiek czy sowa, ale nie kura, która ma oczy po bokach, widzą jednocześnie dwa różne obrazy tego samego przedmiotu. Powodem tych różnic jest rozsunięcie oczu na pewną odległość - u nas jest to ok. 6 cm (patrz rysunek 1). Wydaje się, że te różnice powinny przeszkadzać w prowadzeniu obserwacji, ale nic bardziej mylnego.

Stereoskopią nazwiemy całość zagadnień związanych z postrzeganiem dwuocznym i niezbędnym opracowaniem uzyskiwanych obrazów, zmierzającym do odtworzenia informacji o głębi. Stereoskopia to także fotografia za pomocą dwóch odpowiednio zsynchronizowanych obiektywów, a także komputerowe generowanie par obrazów.

Najpoważniejszym problemem stereoskopii jest opracowanie takiego sposobu patrzenia na grafikę, by każde z oczu otrzymywało trochę inny obraz. Zajmiemy się jedną z najprostszych technik - tak zwanym anaglifem. Technika ta wymaga specjalnie przygotowanej pary obrazów i dwubarwnych okularów. Obrazy i kolorowe filtry okularów muszą być tak przygotowane, by do każdego oka wpadał tylko jeden obraz. Anaglif jest techniką patrzenia, zwaną separacją barwną stereopary.

Wzrok jest najważniejszym zmysłem gatunku homo sapiens. Szacuje się, że 4/5 wszystkich, zapamiętanych w ciągu życia informacji uzyskaliśmy za jego pośrednictwem. Informacja ta wskazywałaby, że doznania wzrokowe są znacznie ważniejsze niż wszystkie inne bodźce razem wzięte.

Kolory anaglifu i okularów muszą być tak dobrane, by do jednego oka swobodnie trafiała jedna część rysunku i nie dochodziła następna. W dodatku drugie oko musi w ten sam sposób otrzymywać tylko drugą część obrazu. Dobór kolorów nie jest zadaniem prostym i wymaga odrobiny zastanowienia. Przygotujemy rodzaj testu, który odpowie na pytanie: jakie kolory ma mieć anaglif przy danym kolorze okularów?

Rysunek 1. Każde oko widzi trochę inaczej, bo znajduje się w innym miejscu. Tajemnicze algorytmy mózgowe zamieniają różnice w położeniu postrzeganych fragmentów obrazu na informację o ich rozlokowaniu w trzecim wymiarze. Dzięki widzeniu dwuocznemu poznajemy głębię obserwowanej sceny.

Rysunek 1. Każde oko widzi trochę inaczej, bo znajduje się w innym miejscu. Tajemnicze algorytmy mózgowe zamieniają różnice w położeniu postrzeganych fragmentów obrazu na informację o ich rozlokowaniu w trzecim wymiarze. Dzięki widzeniu dwuocznemu poznajemy głębię obserwowanej sceny.

Od razu powiedzmy, że nie każde dwubarwne okulary nadają się do anaglifów. Dla niewłaściwych, nie dość intensywnych albo zbyt podobnych do siebie kolorów nie uda się skonstruować anaglifu. Nie znajdziemy dwóch takich barw, z których okulary odetną jedną, a drugą swobodnie przepuszczą.

Program testowy (rysunek 2) umożliwia niezależne dobieranie barw każdej z dwóch części anaglifu i dodatkowo tła, na którym części te są wykreślane. Zamiast anaglifu wyświetlimy w okienku jakiś prosty napis lub cokolwiek innego, a naszym zadaniem będzie dobór takiego zestawu barw, aby część grafiki była widoczna tylko jednym okiem, gdy inna część tylko drugim. Nie będziemy tu omawiać bardzo prostych algorytmów tego programu - zainteresowanych szczegółami odsyłam do materiałów źródłowych, gdzie znajduje się także ostateczna aplikacja.

Dobieranie barw nie jest jednak aż tak złożone, na jakie wygląda ... Okazuje się, że praktycznie wszystkie okulary anaglifowe mają dwie barwy - czerwoną i niebieskozieloną. Czy to przypadek? Nie - jest ważny powód, żeby ograniczyć się właśnie do tych barw.

Anaglify będziemy obserwować bezpośrednio na ekranie i naszą dyskusję zacznijmy od zbadania, czym właściwie jest obraz na monitorze. Zrozumienie natury tego obrazu będzie bardzo ważne dla dalszych rozwiązań. Pełnokolorowy obraz monitorowy składa się tylko z trzech barw - czerwieni, zieleni i błękitu. To niezwykłe stwierdzenie bardzo łatwo udowodnić - wystarczy wziąć szkło powiększające i uważnie przyjrzeć się ekranowi monitora czy telewizora. Ekran składa się z regularnie ułożonych punktów, świecących w trzech kolorach. Amplitudy kolorów w tych punktach nie są sobie równe - tam, gdzie są duże, obserwowany z daleka ekran świeci biało, gdzie wygaszone - ekran jest czarny.

Rysunek 2. Przed uruchomieniem tego programu należy założyć dwubarwne okulary. Potem - manewrując dziewięcioma suwakami - należy tak dobrać kolory napisów, by były dostrzegane tylko przez właściwe oko i znikały przy patrzeniu drugim. Tło w większości anaglifów bywa białe, ale spotyka się też inne kolory. Uzyskane barwy mogą posłużyć do sporządzenia anaglifu dwubarwnego, oglądanego przez konkretne okulary.

Rysunek 2. Przed uruchomieniem tego programu należy założyć dwubarwne okulary. Potem - manewrując dziewięcioma suwakami - należy tak dobrać kolory napisów, by były dostrzegane tylko przez właściwe oko i znikały przy patrzeniu drugim. Tło w większości anaglifów bywa białe, ale spotyka się też inne kolory. Uzyskane barwy mogą posłużyć do sporządzenia anaglifu dwubarwnego, oglądanego przez konkretne okulary.

Zauważymy też zjawisko znacznie dziwniejsze - trzy barwne punkty składowe przez podawanie różnych amplitud czerwieni, zieleni i błękitu potrafią symulować dowolne kolory. Jest to niezmiernie ważne spostrzeżenie - zauważmy tylko, ile kosztowałyby monitory, gdyby kolorów podstawowych było na przykład dziesięć... Możliwość zredukowania zagadnienia tworzenia barwy do umiejętności sterowania amplitudami trzech barw składowych jest jednym z filarów burzliwego rozwoju techniki komputerowej.

Zatem ekrany nie świecą żółto, tylko czerwono i niebiesko. Powstające w naszych oczach wrażenie jest niemożliwe do odróżnienia - w żaden sposób nie możemy się przekonać, czy obserwujemy światło żółte, czy tylko odpowiednią mieszaninę barw składowych. No chyba, że mamy pod ręką przyrząd zwany spektroskopem...

Świadomi tego, podejmujemy radykalną decyzję - anaglify obserwowane na monitorze będą operowały jedynie czerwienią, zielenią i błękitem, bo tylko takie światła wchodzą tutaj w grę. Jeśli anaglif dla lewego oka będzie na przykład czerwony, wtedy obrazek dla prawego może być albo niebieski, albo zielony lub niebieski i zielony. Odpadają filtry, zbudowane według receptur barwnych, uzyskanych za pomocą programu z rysunku 2, przynajmniej jeśli chodzi o obserwację anaglifów bezpośrednio na ekranie.

Będziemy się poruszać wyłącznie w świecie trzech barw podstawowych. Czy to duże ograniczenie? I tak, i nie. Tak, ponieważ będziemy filtrować i odrzucać pewne barwy. Trzeba będzie wiele kolorów poświęcić na ołtarzu niezbędnej separacji obrazów dla lewego i prawego oka. Nie, bo okaże się, że gdy lewe oko otrzyma obraz czerwony, a prawe zielony, to nasz mózg gdzieś tam w wyniku połączenia sygnałów doszuka się barwy żółtej!

Rysunek 3. Czy nasze okulary dobrze filtrują barwy kineskopowe? Aplikacja ogranicza swobodę doboru barw tylko do trzech podstawowych. Jeśli lewy okular jest czerwony (przepuszcza czerwień), prawy już nie może przepuszczać czerwieni i tak dalej. Mówiąc inaczej - pola R, G i B mogą być zaznaczone tylko jeden raz. Ponadto w sumie powinny być zaznaczone trzy pola, co oznacza, że tak czy inaczej do naszych oczu przedostanie się pełna informacja o kolorze. Gdyby na przykład lewy okular był tylko czerwony, a prawy tylko niebieski, stracilibyśmy całą informację, niesioną przez kanał zielony.

Rysunek 3. Czy nasze okulary dobrze filtrują barwy kineskopowe? Aplikacja ogranicza swobodę doboru barw tylko do trzech podstawowych. Jeśli lewy okular jest czerwony (przepuszcza czerwień), prawy już nie może przepuszczać czerwieni i tak dalej. Mówiąc inaczej - pola R, G i B mogą być zaznaczone tylko jeden raz. Ponadto w sumie powinny być zaznaczone trzy pola, co oznacza, że tak czy inaczej do naszych oczu przedostanie się pełna informacja o kolorze. Gdyby na przykład lewy okular był tylko czerwony, a prawy tylko niebieski, stracilibyśmy całą informację, niesioną przez kanał zielony.

Zatem pora zabrać się do pracy. Napiszemy program, który z dwóch fotografii, wykonanych z dwóch różnych miejsc zbuduje klasyczny, barwny anaglif, przeznaczony do obserwacji przez czerwono-zielone okulary. Oznacza to, że musimy wykonać następujące operacje:

  • Z lewego obrazu usuniemy warstwy G i B (czyli to, co przepuszcza prawy okular), dlatego stanie się on widoczny tylko dla lewego oka. Będzie to obraz czerwony.
  • Z prawego obrazu usuniemy warstwę R (czyli to, co przepuszcza lewy okular), dlatego stanie się on widoczny tylko dla prawego oka. Będzie to obraz o kolorystyce zielononiebieskiej, zwanej cyjanem.
  • Tak opracowane obrazy w specyficzny sposób nałożymy na siebie - lewy będzie odpowiadał za czerwień, prawy za zieleń i błękit.

Podsumujmy. Skoro monitory operują trzema barwami (udając tylko, że wyświetlają całe spektrum kolorów), rozdzielmy te trzy składniki między lewe i prawe oko. Okazuje się, że nasze okulary są tak zbudowane, że warstwa czerwona dociera do lewego oka, zielona i niebieska do prawego. Musimy zatem według tej receptury spreparować dwa obrazy i odpowiednio je złożyć.

Efekt tego złożenia oglądany gołym okiem będzie cokolwiek dziwny (rysunek 4). Na normalnym obrazie warstwy R, G i B ściśle ze sobą współdziałają, symulując wszystkie możliwe kolory. Obecnie warstwy te będą pochodziły z różnych obrazów. Ważniejsza będzie filtracja obrazów, niż symulacja kolorów. Co z tego wyjdzie? Trzeba to sprawdzić.

Zasadniczy program (rysunek 5) powinien umożliwić wczytanie pary obrazów, odfiltrowanie z nich pewnych, szczególnych barw i złożenie w jeden, finalny obraz. Wszystkie teksty źródłowe programu znajdują się w materiałach programistycznych, ale zwróćmy uwagę na pewne, kluczowe szczegóły algorytmów.

Będziemy potrzebować mechanizmu odczytu obrazu z pliku dyskowego - poprzestańmy na odczycie najprostszego formatu BMP. Oto stosowny kod w C++Builderze:

if( OpenPictureDialog1 -> Execute())

{

Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);

Image5->Picture->Bitmap->Width=Image1->Width;

Image5->Picture->Bitmap->Height=Image1->Height;

}

Rysunek 4. Oto typowy, czerwono-zielony anaglif. Dwa obrazy są trochę za bardzo przesunięte, trudno uzyskać syntezę efektu 3D, ale za to lepiej widzimy barwną strukturę anaglifu.

Rysunek 4. Oto typowy, czerwono-zielony anaglif. Dwa obrazy są trochę za bardzo przesunięte, trudno uzyskać syntezę efektu 3D, ale za to lepiej widzimy barwną strukturę anaglifu.

Zwróćmy uwagę, że pierwszy (lewy) odczytany obrazek narzuca rozmiary finalnemu anaglifowi - drugi (prawy) obrazek musi się dopasować do tych ram. Wszystkie obrazki są przechowywane i wyświetlane przez obiekty typu Timage. Obiekty te są umieszczone na komponentach ScrollBox (pudełkach z suwakami) i dzięki temu możemy nie martwić się o wymiary zdjęcia. Wielkie fotografie zostaną automatycznie zaopatrzone w suwaki przewijania.

Samo mieszanie składników odbywa się następująco:

int i, j, r, g, b, r1, g1, b1, r2, g2, b2;

TColor k;

for( i = 0; i < Image1->Width; i++)

{

for( j = 0; j < Image1->Height; j++)

{

k = Image1->Picture->

Bitmap->Canvas->Pixels[i][j];

r1 = GetRValue( k);

g1 = GetGValue( k);

b1 = GetBValue( k);

k = Image2->Picture->

Bitmap->Canvas->Pixels[i][j];

r2 = GetRValue( k);

g2 = GetGValue( k);

b2 = GetBValue( k);

r = CheckBox1->

Checked ? r1 : (CheckBox4->Checked ? r2 : 0);

g = CheckBox2->

Checked ? g1 : (CheckBox5->Checked ? g2 : 0);

b = CheckBox3->

Checked ? b1 : (CheckBox6->Checked ? b2 : 0);

Image5->Picture->

Bitmap->Canvas->Pixels[i][j] = RGB( r, g, b);

}

}


Zobacz również