Block > (Animierte) Stereogramme zum Selberbauen

Vor einiger Zeit habe ich schonmal ueber Stereogramme (bzw. Stereoskopie) geschrieben, aber ich wusste bis heute nicht, wie ich sowas selber bauen kann.
Nun bin ich ueber eine Anleitung gestolpert, wie sowas geht und moechte euch diese in etwas ausfuehrlicher nicht vorenthalten. Zumal die Anleitung dort teilweise schon veraltet ist.

Meine Grundideen:

Noch kurz etwas allgemein zu Stereogrammen:
Ein Stereogramm (oder besser: Autostereogramm) ist ein Einzelbild-Stereogramm, welches aus einem 2D-Bild durch optische Taeuschung dem Gehirn ein 3D-Bild vorgaukeln kann.
Mehr dazu und wie genau das funktioniert, die Geschichte dazu usw. befindet sich in der engl. Wikipedia.

Update (2014-07-26): Ich wurde per Mail gefragt, warum ich darueber eigtl. schreibe. Nun, mein Vater hatte so ein Magic 3D-Buch, dass ich als Kind sehr mochte, zumal ich es am Anfang nicht hinbekommen hatte, daraus 3D-Bilder zu sehen. Und ich fand das schon immer sehr faszinierend, wusste aber halt bisher nicht, wie sowas selbst gemacht werden kann. Daher hier nun die Anleitung ;)

Stereogramm mit Gimp

Mit der Anleitung, die ich gefunden habe, kam ich erst mal gar nicht klar. Allerdings habe ich dann ein besseres Tutorial gefunden und mir wurde einiges viel klarer ;)
Dort wird beschrieben, wie sich ein Stereogramm zusammensetzt:

Stereograms essentially contain two images to create the 3D effect. The first image is the Depth Map or Range Image [..]. The second image is the texture or pattern image [..].

Depth maps (Range Images) are made up of black, white, and gray colors. The computer software takes white and brings it to the front, black is sent to the back, and shades of gray fall in-between the two. As you can guess, the lighter shades of gray appear closer than darker shades of gray.

Textures or Pattern Images, can be any texture. However, it is recommended you use a texture that is very random, as the stereogram software will distort the texture to hide the depth map within it. [The stereogram software] will also create textures for you.

D.h. wir brauchen:

Das Graustufenbild besteht nur aus Schwarz, Weiss und allen Grautoenen dazwischen. Schwarz befindet sich beim Endresultat im Hintergrund, Weiss im Vordergrund und demnach die Grautoene dazwischen.

Die Software (in meinem Fall stereograph) kann Texturen selbst erstellen, das werde ich aber gleich erklaeren.

Fuer den Anfang reicht also erstmal ein normales Bildbearbeitungsprogramm wie Gimp, wobei es hier aber auch Vor- und Nachteile gibt:

Vorteile:

Nachteile:

Nichtsdestotrotz will ich hier mal zeigen, wie das mit Gimp (oder alternativ Inkscape, Krita, MyPaint, ...) geht.

SIRDS

Ein Single Image Random Dot Stereogram (SIRDS) ist ein Autostereogramm, welches zufaellige Punkte als zugrunde liegende Textur hat.

Wir wollen nun solch ein SRIDS erstellen, und bauen zuerst mal ein Graustufenbild mit Gimp (Meine Version: 2.8.10).

Gimp Einstellungen fuer ein Graustufenbild

Fertig ist unser erstes Graustufenbild :)

Das erste Graustufenbild

Nun wollen wir daraus ja ein SIRDS bauen, also installieren wir erstmal die Software stereograph:

# pacman -S stereograph

Danach erstellen wir das SIRDS mit:

$ stereograph -b sirds-dm.png -w 100 -f png -o sirds.png

Und yeah, fertig ist unser erstes Stereogramm! \o/

Das erste Stereogramm

Mit den Optionen von stereograph kann natuerlich noch rumgespielt werden, bsp. kann durch ein angehaengtes -C -v das SIRDS mit zufaelligen Farbpunkten erstellt werden (default: Grayscale) und es werden alle Schritte ausgegeben (Verbose mode).

SIS

Ein Single Image Stereogram (SIS) ist ein Autostereogramm, welches statt zufaelligen (Farb-)punkten Texturen/Muster oder sogar Bilder verwendet. Die Bandbreite an Moeglichkeiten ist hier natuerlich sehr gross. Eine gute Auswahl an Moeglichkeiten bieten die Stereogramme von Gary W. Priester (der auch einige Stereogrammbuecher kreiert hat), die mich sehr dazu inspiriert haben, so viel mit den Moeglichkeiten, die ich habe, herumzuspielen.
Cool finde ich z.B. das Stereogramm mit den Muenzen, in dem das Graustufenbild auf die Textur gemappt wurde, so dass es den Anschein hat, als waeren die 3D-Objekte wirklich Muenzen.

Hier also Anleitungen, solch ein Muster mit stereograph zu verwenden.

Muster in Gimp erstellen

Das ist recht einfach:

Gimp Einstellungen fuer eine Textur

Fertig ist die Textur :)

Die erste Textur

Die Textur koennen wir nun zusammen mit dem Graustufenbild von oben mit dem folgenden Befehl in ein Stereogramm verwandeln:

$ stereograph -b sirds-dm.png -t textur.png -w 100 -f png -o sirds-2.png

Ein Stereogramm mit dieser Textur

Die richtige Breite (-w 100) wird uebrigens in der Manpage von stereograph (man 1 stereograph) gut erklaert:

As a hand rule, 100 should work nice for stereograms of 640*480 up to 800*600 pixels. Use 110 to 120 for bigger ones and higher screen resolutions (>=1280*960).

Muster mit ImageMagick erstellen

Damit nicht Gimp bemueht werden muss, um ein Muster bzw. eine Textur zu erstellen, wollte ich ImageMagick nutzen, um solch ein zufaelliges Muster in der Shell zu generieren (Quelle):

$ convert -size 100x100 plasma:fractal -blur 0x1 fractal.png

fractal

Eingebunden werden kann es dann mit:

$ stereograph -b sirds-dm.png -t fractal.png -w 100 -f png -o sirds-3.png

Ein Stereogramm mit einer Textur aus ImageMagick

Allerdings stellte ich dabei schnell fest, dass das nicht wirklich schoen ist (eher noch mehr Kopfweh verursachender) und daher z.B. diese Methode zu bevorzugen ist (Quelle):

$ convert -size 50x80 xc: +noise Gaussian -write mpr:rand \
    -extent 100x80 -page +50-40 mpr:rand \
    -page +50+40 mpr:rand -flatten hextile.png

hextile

$ convert hextile.png -virtual-pixel tile -blur 0x5 -normalize \
    -colorspace gray -fill "#0069aa" -tint 100 random-0.png

random-0

Da die Breite von random-0.png 100 ist, sollte das auch so beim Aufruf von stereograph beachtet werden:

$ stereograph -b sirds-dm.png -t random-0.png -w 100 -f png -o sirds-4.png

Ein Stereogramm mit einer besseren Textur aus ImageMagick

Es gibt auf der Seite noch ziemlich viele Moeglichkeiten, also einfach mal damit herumspielen ;)

Veganblume als SIS mit Blender

Wie ein Graustufenbild bzw. eine Depth Map mit Blender erstellt werden kann, war mir am Anfang ueberhaupt nicht klar. Der erste Versuch war lediglich: Veganblume in Blender laden, etwas drehen (Rotate oder R), Kamera verschieben (Translate oder G und Umschalt+F) und rendern (F12). Und dann daraus ein Stereogramm bauen. Allerdings ist das nicht der richtige Weg, wie sich bei der weiteren Recherche herrausstellte. Das Geheimnis liegt in der Tiefe ;)

Dabei habe ich zwei Wege gefunden, eine Depth Map zu erstellen. Einmal mit Map Value und einmal mit ColorRamp.
Ich habe mich fuer die erste Variante entschieden, weil sie etwas simpler zu erstellen ist.

Wenn euch die Textanleitung hier zu kompliziert erscheint, guckt euch auf jeden Fall die Video-Anleitung an! Ich wollte es nur zusaetzlich noch in Textform haben, falls das Video irgendwann mal nicht mehr da ist.

Blender Einstellungen fuer ein Einzelbild

Um sich die ganze Anleitung oben zu sparen, koennt ihr euch hier auch einfach meine fertige Blend-Datei runterladen.
Um eine Depth Map zu erzeugen, einfach auf "Render" klicken oder F12 druecken.

Die Veganblume als Graustufenbild

So, fast fertig, es fehlt nur noch das Stereogramm. Das erstellen wir als SIS (das SIRDS spar ich mir jetzt) mit der Textur textur.png von oben:

$ stereograph -b veganblume.png -t textur.png -w 120 -f png -o veganblume-2.png

Die Veganblume als Stereogramm

Animiertes Stereogramm (SIS) mit Blender

Fuer das animierte Stereogramm nutzen wir einfach die eben erstellte Datei als Basis.

Die Schritte nach dem oeffnen, um eine Animation zu erstellen:

Blender Einstellungen fuer eine Animation

Nun werdet ihr beim Starten der Animation feststellen, dass das Objekt sich nicht wirklich in der Mitte befindet, aber das ist mir im Moment egal ;)

Dank schon vorhandenem "Map Value"-Kram im "Composting"-Screen, koennen wir die Szene nun einfach als Animation rendern. Dazu Ctrl+F12 druecken oder "Render" - "Render Animation" auswaehlen.

Die finale Blend-Datei koennt ihr wieder (wenn ihr die Anleitung nicht befolgen wollt) hier herunterladen.

Nach einiger Zeit sollten nun 24 Bilder (0001.png - 0024.png) in /tmp vorhanden sein, die nun an einen besseren Ort verschoben werden koennen.

Nun muessen wir nur noch jedes einzelne Bild in ein Stereogramm umwandeln. Das geht z.B. mit folgendem Befehl:

$ for i in 00*.png ; do echo $i ; stereograph -b $i -t textur.png -w 120 -f png -o "s$i" ; done

Um nicht einfach nur die Bilder mit einem Bildprogramm durchgehen zu muessen, erstellen wir nun aus den Einzelbildern ein Gif und zusaetzlich noch ein Webm.

Am Besten ist eine kleine Anzahl an Bildern (so wie in diesem Beispiel), da der folgende Befehl mit vielen Bildern lange dauert, viel CPU-Last erzeugt und den Ram/Swap ausreizt.
Mit diesem Befehl koennen wir aber relativ einfach ein Gif erzeugen, was sich immer wieder wiederholt und pro Bild quasi 100 ms "wartet" (Quelle):

$ convert $(for a in s00*.png ; do printf -- "-delay 10 %s " $a ; done) -loop 0 veganblume.gif

Achtung: das Ergebnis kann recht gross sein, vor allem, wenn die Ausgangsbilder schon eine grosse Aufloesung haben. Bei mir ist das Gif nun 29 MB gross ...

Und im Uebrigen ist das ganze hin und her (also 3D-Szene aus Blender als 2D-Bilder umwandeln und dann per optischer Taeuschung wieder in 3D) etwas unnoetig, aber warum einfach, wenn es auch kompliziert geht? ;)

So, und weil es cool ist und Webm schon so ein bisschen Zukunft ist, wandeln wir nun die Bilder auch noch in eine webm-Datei um (Quelle):

Und das Endergebnis ist schon krass: gerade mal 363 KB gross. Wenn ich richtig gerechnet habe, ist das eine Verkleinerung um fast 80%!

Und hier gibt es daher die webm-Datei zum Download.

In einer anderen Quelle habe ich noch einen Befehl gefunden, um die Bilder in eine AVI-Datei umzuwandeln, aber das spare ich mir nun.

Noch eine Idee ...

... war, mit Hilfe der Stereogramme ein Spiel zu bauen :)
Und zwar ein moeglichst einfaches Spiel, wobei jedes einzelne Bild in ein Stereogramm umgewandelt und ausgegeben wird.
So entsteht aus einem 2D-Game ein 3D-Game, welches aber wahrscheinlich Kopfschmerzen erzeugt ;)

Aber natuerlich gibt bzw. gab es sowas schon: Magic Carpet (Quelle, letzter Absatz) ;)

Ich wollte das natuerlich ausprobieren, und habe es zwar zum Laufen bekommen, konnte aber leider nicht den SIRDS-Modus ausprobieren. Nichtsdestotrotz hier aber ein kleiner Exkurs, wie ein so altes Spiel zum Laufen gebracht werden kann.

Exkurs: DOSBox

Zuerst muessen ein paar Pakete installiert werden:

# pacman -S dosbox unzip
$ mkdir ~/tmp && cd ~/tmp

Dann das Spiel z.B. hier herunterladen und in ~/tmp speichern.
Nun nur noch das Spiel entpacken und mit dosbox starten (Quelle):

$ unzip magic-carpet.zip
$ dosbox carpet.exe

Viel Spass ;)

Andere Spiele, die solch einen (oder einen aehnlichen) 3D-Modus anbieten, befinden sich in dieser Auflistung.

Sonstige Quellen

So, das war ein sehr langer Artikel, fuer den eine Menge Zeit drauf ging (mehrere Tage).
Daher nun: viel Spass ;)

Geschrieben: 2014-06-08, 01:37 - Tags: linux, auge, stereogramm, diy