In Gehirne “hineinsehen” - aus Zahlen werden Bilder (2)

Ein Beitrag zur KinderUni Köln 2009, 2010, 2012 (Anhang)
von Dr. Stefan Vollmar, Email: vollmar@nf.mpg.de

Beispiele aus dem Kurs

Table of Contents

1 Hinter den Kulissen

Dieser Teil der Unterlagen zu unserem Kurs behandelt einige technische Besonderheiten der Beispiele und ist für jüngere Leser nicht besonders geeignet: es geht um Details zu den benutzten Dateiformaten und um andere technische Hintergründe. Es ist nicht erforderlich, diese Abschnitte völlig zu verstehen, um etwas mit den Beispielen anfangen zu können: die meisten Autofahrer haben kein Problem, ihr Auto selbst zu tanken, ohne genau zu wissen, was der exakte Unterschied zwischen "Benzin" und "Diesel" ist. So ähnlich verhält es sich auch mit den Abschnitten aus diesem Teil - zwar ist ihr Computer bei Tippfehlern und vielen anderen Fehlern unnachgiebig, im Unterschied zu einer falschen "Tankfüllung" ruiniert man beim Lernen einer Computersprache aber maximal seine Nerven und nicht eine teure Maschine…

1.1 Binär-Dateien

Die Beispiel-Programme sind (wie bei fast allen Programmiersprachen) Textdateien, die man im Prinzip mit jedem Textverarbeitungsprogramm bearbeiten kann. Anders verhält es sich fast immer bei Bilddaten, Audio-Dateien oder den Daten von Gehirnscannern.

Hier werden die Daten "binär" gespeichert, d.h. mit einem Texteditor lassen sie sich nicht lesen, dafür aber schnell und platzsparend mit Programmen, die diese Daten weiterverarbeiten sollen. Wir nutzen zum Lesen von Binärdaten das array-Modul von Python: der Buchstabe beim jeweils ersten Aufruf zeigt an, welche Art von Binärdaten man lesen möchte - "f" ist z.B. "floating point" (Fliesskommazahlen mit 4 Bytes pro Zahl).

1.2 Farbbilder und Grauwerte

Für jeden Pixel, d.h. jeden Punkt auf dem Bildschirm, kann man Werte für die Farben rot, grün und blau angeben. Aus den Anfangsbuchstaben der Farben ergibt sich "RGB" als Name dieses Farbraums. Typischerweise ist der Wertebereich für jeden Farbkanal 8-Bit, d.h. man kann Werte zwischen 0 und 255 angeben. Besondere Farben sind z.B. schwarz (0, 0, 0), weiss (255, 255, 255), rot (255, 0, 0), grün (0, 255, 0) oder blau (0, 0, 255). Haben alle Farbkomponenten den gleichen Wert, also z.B. bei (42, 42, 42), dann erhält man einen mehr oder weniger dunklen Grauton.

Aus "normalen" Farbbildern kann man mit VINCI Binär-Dateien machen, so dass jedem Pixel ein einziger Wert zugeordnet werden kann.

1.3 "Schicht"-Dateien

Wir haben mit dem Programm extract_slice.py aus den Originaldaten unserer Gehirnscanner (Beispieldaten im Directory vinci_demo_daten) die mittlere Schicht herauskopiert, um die Beispiel-Programme etwas vereinfachen zu können. Normalerweise haben wir es bei tomographischen Daten mit vielen Schichten gleichzeitig zu tun, da es sich um "echte", dreidimensionale Datenvolumen handelt.

In unseren Beispielen ist die Schicht 256 x 256 Pixel gross und besteht aus Fliesskommazahlen (immer 4 Bytes pro Zahl).

1.4 Das BMP-Format

Es ist ein vergleichsweise einfaches Bildformat, welches von vielen Graphikprogrammen gelesen und geschrieben werden kann. Eine BMP-Datei beschreibt in ihren ersten 56 Bytes wie gross das Bild ist (Anzahl von Pixeln in x- und y-Richtung) und wie die Farben des Bildes kodiert sind. Hier gibt es mehrere Möglichkeiten und wir beschränken uns auf die wichtigste: für jedes Pixel gibt es jeweils drei Bytes, die in dieser Reihenfolge die Werte für blau, grün und rot angeben. Der Datenteil beginnt mit den drei Bytes der linken oberen Ecke, dann kommen die drei Bytes des in x-Richtung benachbarten Pixels, usw. bis zum Ende der ersten Zeile. Unmittelbar daran schliesst die zweite Zeile an, dann die dritte, etc. wobei jede Zeile von links nach rechts beschrieben wird.

Wir benutzen die (leicht modifizierte) BMPFile-Klasse von David Fraser und kommen so mit einer einzigen Zeile Python-Code aus, um eine BMP-Datei zu erzeugen.

Bei einigen Beispielen zählen wir die y-Schleife (Zeilen) rückwärts, damit das Bild "nicht auf dem Kopf steht". Dabei beachten wir nur unterschiedliche Konventionen, ob der Ursprung des Bildes links oben oder links unten im Bild liegen soll (beides kommt vor).

1.5 Das WAV-Format

Ein beliebtes Format, um Audio-Daten zu speichern. Wie bei Bildformaten, gibt es auch hier recht unterschiedliche Arten, Töne oder Musik zu beschreiben und wir wollten möglichst wenig mit den Details zu tun haben: daher beschränken wir uns darauf, eine bestehende WAV-Datei zu verändern.

Dabei müssen wir beachten, dass die ersten 44 Bytes (der Header) unverändert kopiert werden. Außerdem ist wichtig, dass der Klang durch eine Folge von Integer-Zahlenwerten beschrieben wird: immer zwei Bytes für eine Zahl - bei solchen "signed short"-Zahlen liegt der Wertebereich zwischen -32767 und +32767.

Die Anzahl der Datenpunkte, die wir "verrauschen" wollen, ergibt sich also, indem man von der Dateigrösse (in Bytes) die ersten Bytes des Headers abzieht und den Rest durch zwei teilt.

Date: 2012-05-23T13:12+0200

Author: Stefan Vollmar

Org version N/A with Emacs version 24