Autostereogramme
Stereogramme sind zweidimensionale Bilder, die
uns einen dreidimensionalen Eindruck vermitteln.
Beispiele:
- Bilder und Filme für rot-grün oder
rot-blau Brillen
- 3D-Filme für Polarisationsbrillen
- Spezielle Brillen für Computeranwendungen
Sie alle verwenden eine spezielle Technik, um jedem
der beiden Augen ein eigenes Bild anzubieten.
Eine beliebte Spezialklasse sind die Autostereogramme.
Das 'Auto' bedeutet dabei, dass ein einziges Bild
die Informationen für beide Augen enthält
und ohne technisches Gerät betrachtet wird.
Allerdings muss man eine spezielle 'Blicktechnik'
anwenden: mit entspannten Augen (auf 'unendliche
Entfernung' eingestellt) durch das Bild hindurchstarren.
Das ist auch die einzige Schwierigkeit in der
Betrachtung: die Augenmuskeln müssen auf
'ganz weit weg' gestellt sein, die Augenlinse
muss aber für die echte Entfernung zum Bild
angepasst sein. Das ist nicht ganz einfach, manche
Menschen schaffen das gar nicht (es ist für
Auge und Gehirn auch ein äußerst ungewöhnlicher
Vorgang und kein Grund zur Sorge, wenn es nicht
klappt). Als vor einigen Jahren die 'Magic Eye'
- Bücher erschienen, trainierte die ganze
Welt diese Blicktechnik...
Nähere Informationen bietet der Physikunterricht,
Details gibts im Informatikunterricht, einen ersten
Überblick, auch zu verwandten Themen wie
ASCII-Stereogrammen und SIRDS, findest Du bei
Wikipedia.
Wir wollen im Informatikunterricht gleich ein fortgeschrittenes
Thema behandeln: Autostereogramme mit hübschen
Mustern. Wie geht man vor:
1. Das Tiefenbild (depth image)
Wir müssen ein Bild erzeugen, das Informationen
über die räumliche Lage der einzelnen
Punkte des zu betrachtenden Objektes enthält.
Dazu verwenden wir ein Bild, das diese Information
in Graustufen enthält: schwarz bedeutet 'ganz
hinten', weiß ist 'ganz vorne' und alle
Grauwerte liegen abstandsmäßig dazwischen.
1.A im Zeichenprogramm
Wir können das Bild iim einfachsten Fall direkt
mit einem Grafik-Programm zeichnen. Mit PicturePublisher,
in Grauwerte verwandelt und als GIF-Datei abgespeichert,
ergibt sich etwa folgendes:

Achte darauf, dass sich sehr schmale Streifen nicht
isoliert zu weit vorne befinden; zu rasche Wechsel
der Tiefe stören einen angenehmen 3D-Eindruck.
Wenn Du möchtest, kannst Du das Bild auch
mit einem Median-Filter glätten, um abgerundete
Stufen zu erhalten. Beim direkten Zeichnen versuche
auch einmal einen Pinsel mit hohem Verwischungsgrad.
1.B im Raytracer
Das ist die professionelle Vorgehensweise. Damit
können wir 'echte' 3D-Modelle entwerfen (die
aber wiederum nicht zu schmal sein dürfen
und nicht zu abrupte Wechsel der Tiefe enthalten
sollten. Die einzige Schwierigkeit: Wir benötigen
nicht ein wie üblich gerendertes Bild, sondern
die Tiefen-(Entfernungs-)information. Manche Tracer
erlauben das Abspeichern der z-Buffer-Werte und
können so direkt verwendet werden. Unser
POV-Ray macht das (noch) nicht. Mit einem Trick
klappt es trotzdem: Wir betrachten die Szene ganz
gerade von vorne und überziehen die union
aller unserer Objekte, die ja keine eigene Farbgebung
benötigen, mit einer abgestuften Grauwert-Textur.
Damit erhalten wir das gleiche Ergebnis (müssen
nur auf die Dimensionen der Objekte im Voraus
achten). Mit folgendem Skript
/////////////////////////////////////////
// Depth Map für Stereogramme erzeugen //
/////////////////////////////////////////
// Szene entlang der z-Achse von vorne betrachten
camera {
location <0,0,-60>
look_at <0,0,0>
angle 12
}
// Farbe weiß bis schwarz von z=+5 bis z=-5
#declare DepthGradient = texture {
pigment {
gradient z ramp_wave
color_map {
[ 0 color <1,1,1> ] // front is white
[ 1 color <0,0,0> ] // back is black
}
scale 10.01
translate -5*z
}
finish {
ambient 1 // nur Eigenfarbe
diffuse 0 // kein Umgebungslicht
}
}
// Das darzustellende Objekt erzeugen
union {
torus { 3.5, 1 scale <1.5,1,1> rotate <0,0,0> }
torus { 3.5, 1 scale <1.5,1,1> rotate <90,0,0> rotate <0,0,90> }
torus { 3.5, 1 scale <1.5,1,1> rotate <0,0,90> rotate <90,0,0> }
scale 0.5 // Größe anpassen
rotate <30,35,0> // geeignet drehen
translate <0,0,1> // und im Raum positionieren
texture { DepthGradient } // Graustufen auftragen
}
erhielt ich folgendes Bild:

2. Das Muster (texture pattern)
Die Textur des Stereogramms können wir entweder
selbst zeichnen, von einer Vorlage einscannen
oder im Internet besorgen (Stichwort 'background
tiles' für den Desktop). Wichtig ist, dass
dieses Bild Feinheiten und Strukturen enthält.
Einfache schattierte Flächen fünktionieren
mit Sicherheit NICHT, außer Du malst im
Zeichenprogramm einige wirre bunte dünne
Linien drüber.
Für die Standardeinstellung unseres Programms
(75dpi Auflösung für Bildschirme) ist
die nötige Bildbreite 93 Pixel (mehr schadet
aber nicht, unser Programm wählt dann den
Bereich aus der Mitte). Die Höhe ist beliebig.
Drei Beispiele:
Nicht jede Textur ist für jedes Tiefenbild
gleich gut geeignet. Hier helfen nur Experimente
und Erfahrung. Allgemein: Helligkeitssprünge
im Tiefenbild ergeben verzerrte und, wenn sie
stark sind, 'gepunktete' Ergebnisse. Die linke
Textur ist meist gut geeignet, die strenge Struktur
rechts nur in Spezialfällen. Alle unsere
Texturbilder müssen ebenfalls im GIF Format
vorliegen!
3. Das Stereogramm wird erzeugt
Wir legen alle Bilddateien ins Verzeichnis des
Programms (dann müssen wir nicht suchen...)
und starten stereogram.pyw.
Wir wählen das texture-image und das depth-image.
Dann befehlen wir 'create stereogram'. Einen flotten
Computer vorausgesetzt, dauert es nun nicht lange,
bis das Autostereogramm fertig berechnet und angezeigt
ist.
Zwei Texturierungen obigen Ringbildes sehen so
aus:


4. Ich will das auch können!
Lade Dir die Datei stereopackage.zip
herunter und entpacke sie. Wenn Du Python auf
Deinem Rechner installiet hast, kannst Du sofort
loslegen.
5. Verbesserungen
- Eigentlich fehlt unserem Programm ein Button
zum komfortablen Speichern des berechneten
Stereogramms. Aber IrfanView kann ja ein Capture
machen (so hab ich die Beispielbilder verewigt).
- Mit der Python-Bibliothek PIL (Python Imaging
Library) kann man des Programm sowohl beschleunigen,
als auch JPEG, TIFF,... Bilder als Quelle
verwenden. Allerdings hat das nicht jeder
installiert.
- Der Algorithmus ist für unsere Zwecke
sicher gut genug. Für hohe Ansprüche
könnte man das Oversampling weitertreiben
und statt einer Liste der gelinkten Pixel
Informationen über die nötige Verzerrung
des Texturbildes zur Pixelübereinstimmung
sammeln. Das muss allerdings auch zeilenübergreifend
geschehen. Nachteil: sehr, sehr aufwendig.
Vorteil: man erhält die gleiche hohe
Qualität wie die berühmten Bilder
aus 'Magic Eye'.
|