back: HIB Homepage
  Prof. Urban
Materialien für Mathematik, Physik, Informatik
 
 
zurück
 

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

     


--- © Wolfgang.Urban@schule.at ---