MAL-Homepage Inhaltsverzeichnis



MAL Dokumentation: Bildverarbeitung




Inhalt:

1. EINFÜHRUNG
2. BILDDATEN LESEN UND SCHREIBEN
3. FARBFILTERUNG
3.1. Worte für die Farbfilterung
3.2. Kontrast und Helligkeit
4. DARSTELLUNG UND VERMESSUNG
4.1. Darstellung
4.2. Vermessung
5. PHOTOGRAMMETRIE
5.1. Linsenentzerrung
5.2. Lineare Kalibrierung
5.3. Messung und Bildanalyse


1. EINFÜHRUNG

Der Schwerpunkt der Bildverarbeitung in MAL ist die Photogrammetrie, also die räumliche Vermessung von Objekten oder Subjekten mit Hilfe von Foto- oder Filmdaten. Darstellung und graphische Aufbereitung von Bildern hat in diesem Zusammenhang nur untergeordnete Bedeutung und ist daher nur rudimentär unterstützt.

Es existiert ein eigener Datentyp für Bilder (Frames) in MAL. Dieser Datentyp enthält ein Schwarz/Weiß-Bild mit einem Grauwertbereich von 0 bis 255 und (abgesehen vom Speicherlimit) beliebigem Format. Farbbilder kann man als Verbund von drei Schwarz/Weiß-Bildern in der Form

[ rotbild gruenbild blaubild ]
aufbauen. Allerdings existiert derzeit kein Wort für die Darstellung von Farbbildern.

Sämtliche mathematischen Funktionen und Operatoren (
*,+, sqrt ...) können auch für Bilder verwendet werden, nur muss man den Wertebereich der Pixel (0..255) im Auge behalten und bedenken, dass die Pixelwerte ganzzahlige Grösen sind. Wird bei arithmetischen Operationen der Wertebereich über- oder unterschritten, so werden die Werte begrenzt. Werden zwei Bilder von unterschiedlichen Formaten mit einem Operator (z.B. +) verknüpft, so hat das Resultat die Breite des schmäleren Bildes und die Höhe des weniger hohen Bildes (also die Durchschnittsmenge der Pixel aus beiden Bildern).

Einige der bekannten Worte für die Manipulation von Verbunden können auch sinngemäß für die Bearbeitung von Bildern verwendet werden: Durch Kombination der Worte transpose und mirror kann das Bild in 8 verschiedene Lagen rotiert bzw. gespiegelt werden.

Durch die Kombination von normalize und transpose kann das Bild beliebig gezoomt werden.

Mit cut bzw. |--| und transpose lassen sich beliebige Bildausschnitte herstellen und mit & und transpose beliebig zusammenfügen. Werden zwei Bilder mit unterschiedlicher Höhe mit dem Wort & verkettet, so hat das resultierende Bild die Höhe des weniger hohen Bildes.

Das Wort ',' (Komma) liest die Pixelwerte einer Spalte und übergibt sie in Form eines Verbundes von Realzahlen am Stack.

Die Worte max und min können verwendet werden, um den maximalen bzw. minimalen Grauwert eines Bildes zu bestimmen. Das Wort mean, angewandt auf einen Verbund von Bildern, liefert ein Mittelwertbild.

MAL-Homepage Inhaltsverzeichnis


2. BILDDATEN LESEN UND SCHREIBEN

In der derzeitigen Version wird nur das JPEG Dateiformat unterstützt. Das Lesen eines Bildes von Datei erfolgt mit dem Wort
jpeg>.

Syntax:

dateiname -> [ rot gruen blau ]
wobei 'rot', 'gruen' und 'blau' vom MAL-Datentyp frametyp sind und jeweils ein Bild von der entsprechenden Farbkomponente enthalten.

Das Schreiben eines Bildes auf Datei erfolgt mit dem Word >jpeg.

Syntax:
[ rot gruen blau ] dateiname qualität ->
Der Parameter qualität bestimmt den Komprimierungsfaktor beim Umwandeln auf das JPEG-Format. Er muss im Wertebereich zwische 0 und 100 liegen (100=höchste Bildqualität und geringste Kompression).

MAL-Homepage Inhaltsverzeichnis


3. FARBFILTERUNG

Alle Worte für die Farbfilterung berechnen aus einem Verbund von drei Bildern (Rot/Grün/Blau) ein Schwarz/Weiß-Bild mit verschiedenen Algorithmen denen folgende Überlegung zugrunde liegt:

Ein farbiges Pixel kann als Vektor in einem dreidimensionalen Vektorraum (Rot/Grün/Blau) verstanden werden. Die jeweiligen Koordinatenwerte (x,y,z) entsprechen den Farbkomponenten (r,g,b). Der Betrag des Vektors stellt somit ein Maß für die Lumineszenz dar.

Farbfilterung kann daher im weitesten Sinne als eine Korrelation zwischen einer vom Anwender forgegebenen Sollfarbe und der Istfarbe eines Pixels betrachtet werden.

MAL-Homepage Inhaltsverzeichnis


3.1. Worte für die Farbfilterung

color_correlation:

[ rframe gframe bframe ] [ r g b ] -> frame
color_only:
[ rframe gframe bframe ] [ r g b ] -> frame
color_filtering:
[ rframe gframe bframe ] [ r g b ] faktor -> frame
Der Verbund [ rframe gframe bframe ] stellt das zu filtende Farbbild dar, und der Verbund [ r g b ] enthält die Sollfarbe.

Das Wort color_correlation berechnet für jedes Pixel aus dem gegebenen Farbbild eine Korrelation mit der Sollfarbe, wobei die Werte von r, g und b zwischen 0 und 255 liegen müssen.

Beispiele:
"bild.jpg" jpeg> [ 255 0 0 ] color_correlation 
entspricht
"bild.jpg" jpeg> 1 , 
Die normale Umrechnung eines Farbbildes in ein Schwarz/Weis-Bild (Lumineszenz=Grauwert) erfolgt mit folgendem Code:
[ 255 255 255 ] color_correlation
Das Wort color_only berechnet ebenfalls eine Korrelation zwischen Sollfarbe und Pixelwert, die Lumineszenz des Pixels ist aber irrelevant.

Das Wort color_filtering ermöglicht eine selektivere Farbfilterung als das Wort color_correlation. Der Wert des Parameters faktor stellt die Filtersteilheit ein. Ein Wert von 0 bedeutet keine Farbfilterung, 1 liefert das gleiche Ergebnis wie color_correlation und Werte größer 1 bewirken stärkere Filterung.

MAL-Homepage Inhaltsverzeichnis


3.2. Kontrast und Helligkeit

Kontrastanhebung entspricht der Multiplikation eines Bildes mit einem Skalarwert, Helligkeitsanhebung der Addition eines Skalars. Folgender Code stellt automatisch den maximalen Kontrast für ein Bild ein (angenommen, die Variable bild enthält ein Bild):

bild dup min - dup max 255 / /
Folgender Code berechnet das Fotonegativ:
bild 255 swap - 

MAL-Homepage Inhaltsverzeichnis


4. DARSTELLUNG UND VERMESSUNG

4.1. Darstellung

Die Darstellung von Bildern dient primär Kontrollzwecken oder der interaktiven Vermessung von Bildern. Auf graphische Qualität wurde daher nicht besonders Wert gelegt. Entwicklungsgeschichtlich bedingt und aus Gründen der leichteren Portierbarkeit, werden Bilder daher nur in schwarz/weiß, mit 16 Graustufen dargestellt.

Mit dem Wort
frame>screen wird ein Bild am Schirm dargestellt.

Syntax:

bild ->
Zum Beschriften oder zum Einblenden von Liniengraphiken in ein Bild, kann das Wort graphic>frame verwendet werden. Es ist eigentlich ein Graphiktreiber ähnlich wie screen oder printer, nur wird das Ergebnis auf kein Gerät ausgegeben, sondern in Form eines Bildes am Stack abgelegt.

Syntax:
graphik breite höhe -> bild
Beispiel (Einblenden von Text in ein Bild):

Laden des Bildes und Bestimmung des Formats:
"\mal_doku\images\stefan.jpg" jpeg> 1 , >> bild
bild count >> breite
bild transpose count >> hoehe


MAL-Graphik mit Text erzeugen:
[ 500 950 posit 80 size "Stefan Holzreiter" center ]
breite hoehe graphic>frame


In das Bild einblenden und darstellen:
bild + frame>screen

graphic>frame kennt keine Farben - alles wird in Weiß (Grauwert 255) dargestellt. Die Worte graphic>red_frame, graphic>green_frame und graphic>blue_frame konvertieren jeweils eine Farbkomponente der Graphik in ein Bild.

Diese Worte finden auch im Wort graphic>jpeg Verwendung, das eine Graphik auf eine Datei im JPEG-Format speichert.

Beispiel (Ausgabe einer Graphik im JPEG-Format):

10 ramp draw
"testbild.jpg" 300 200 graphic>jpeg

MAL-Homepage Inhaltsverzeichnis


4.2. Vermessung

Es gibt interaktive und vollautomatische Bild-Vermessungsworte. Zur Kategorie der interaktiven Worte gehören:

Zur Kategorie der vollautomatischen Worte gehören: Das Wort frame_select_locations zeigt ein Bild an und ermöglicht das Anklicken von Positionen mit der Maus. An den angeklickten Positionen werden kleine Kreuze eingezeichnet. Nach Verlassen des Bildes (Mit der Enter-Taste oder der rechten Maustaste) werden die Koordinaten der angeklickten Punkte am Stack übergeben.

Syntax:
frame -> [ [ x1 y1 ] [ x2 y2 ] .. ]
Mit frame_get_pixels können die Grauwerte an vorgegebenen Positionen ausgelesen werden.

Syntax:
[ [ x1 y1 ] [ x2 y2 ] .. ] frame -> [ g1 g2 ... ]
Die Worte frame_select_lines und frame_select_columns ermöglichen das Anklicken von Zeilen oder Spalten im angezeigten Bild. Nach Verlassen des Bildes werden die Zeilen- bzw. Spaltennummern der gewälten Zeilen oder Spalten sowie deren Grauwertprofile am Stack übergeben

Syntax:
frame -> [ pro1 pro2 ... ] [ pos1 pos2 ... ]
Die Worte frame_get_spots und frame_auto_spots dienen dazu, die Positionen von hellen Marken im Bild zu bestimmen. Marken werden erkannt, wenn die Pixel eine voreingestellte Helligkeitsschwelle überschreiten und die Anzahl der unmittelbar nebeneinander liegenden hellen Pixel in einem voreingestellten Bereich liegt. Die Helligkeitsschwelle kann durch Einrichten einer Variablen frame_treshold voreingestellt werden, die Anzahl der zulässigen Pixel pro Marke kann durch Einrichten von Variablen marker_minpixel und marker_maxpixel eingestellt werden. Werden diese Variablen vor Aufruf der Worte nicht definiert, so gelten folgende Voreinstellungen: Die genaue Markenposition wird durch Berechnung des Schwerpunkt des Grauwertgebirges berechnet und im Anschluß am Stack übergeben. Bei frame_get_spots müssen die Marken mit der Maus im Bild angeklickt werden, bei frame_auto_spots wird das Bild in einem voreinstellbarem Raster nach Marken abgesucht.

Syntax von frame_get_spots:
frame -> [ [ x1 y1 ] [ x2 y2 ] .. ]
Syntax von frame_auto_spots:
frame step graphic -> [ [ x1 y1 ] [ x2 y2 ] .. ]
Das Wort frame_grid_spots ist speziell für die Vermessung eines Kalibrierrasters für die Linsenentzerrung ausgelegt. Es setzt ein Bild von einem einigermaßen regelmäßigen, rechteckigen Raster von weißen Marken auf schwarzem Grund voraus (ein Bild von scharzen Marken auf weißem Grund kann mit 255 swap - aufbereitet werden). Es müssen drei Marken mit der Maus angeklickt werden:
  1. eine Eckmarke
  2. die Nachbarmarke in Zeilenrichtung des Rasters
  3. die Nachbarmarke in Spaltenrichtung des Rasters
Alle weiteren Punkte des Rasters werden dann automatisch gefunden. Welche Eckmarke und welcher Zeilen- bzw. Spaltennachbar angeklickt wird, bestimmt die Reihenfolge der gefundenen Marken.

Syntax:
frame spanz zanz -> [ [ x11 y11 x12 y12 ... ] [ x21 y21 ..] .. ]

MAL-Homepage Inhaltsverzeichnis


5. PHOTOGRAMMETRIE

Die Photogrammetrie, also die Berechnung von Raumpunkten aus Bilddaten, ist eine Kombination aus Bildanalyse und Mathematik.

Der Standardablauf lässt sich grob in folgende Teile gliedern:

  1. Kalibrierung (Linsenentzerrung und lineare Kalibrierung)
  2. Messung und Bildanalyse

MAL-Homepage Inhaltsverzeichnis


5.1. Linsenentzerrung

Die Linsenentzerrung ist in der Regel erforderlich, soferne man nicht mit qualitativ hochwertigen, also teuren Objektiven arbeitet, oder keine hohen Ansprüche an die Genauigkeit stellt. Mit der in MAL implementierten Linsenentzerrung kann man auch mit preiswerten Objektiven ausgezeichnete Ergebnisse erzielen.

Voraussetzung ist, daß man ein präzises Kalibrierraster von weißen Punken auf schwarzem Grund besitzt. Herstellen läßt sich solch ein Kalibrierraster, indem man eine Postscript-Datei erstellt (z.B mit dem Word
postscript_raster) und bei einer Repro-Firma einen Lithofilm anfertigen läßt. Die Lithofilme sind normalerweise hochpräzise. Man kann sie mit einem Klebespray auf eine Glasscheibe (hochwertiges, planes Milchglas verwenden) kleben und von hinten beleuchten.

Hat man ein formatfüllendes Bild des Kalibrierrasters, so kann mit frame_grid_spots die Bildkoordinaten der Rasterpunkte bestimmen. Mit Hilfe einer zweidimensionalen Regressionsrechnung (Wort regress_2d) können den gemessenen Bildkoordinatenwerten Koordinatenwerte eines virtuellen, entzerrten Bildes zugeordnet werden. Am besten nimmt man für die Koordinatenwerte des virtuellen, entzerrten Bildes die Koordinaten der Marken des Kalibrierrasters.

Bild1 zeigt schematisch den Aufbau einer reellen Kamera mit dem Bildkoordinatensystem xb/yb:

Bild2 zeigt den Aufbau beim Messen des Kalibrierrasters:

Die zweidimensionale Regression wird folgendermaßen versorgt: Als Resultat liefert die 2d-Regression zwei Polynome, die zur Versorgung für das Wort polynom_2d dienen. Somit erhält man zwei Funktion für die Umrechnung von gemessenen Bildkoordinaten in virtuelle Koordinaten.
xv = fx(xb,yb)
yv = fy(xb,yb)
Das so gewonnene mathematische Modell entspricht eine virtuellen Kamera mit den Bildkoordinaten xv/yv:

MAL-Homepage Inhaltsverzeichnis


5.2. Lineare Kalibrierung

Die lineare Kalibrierung ist Voraussetzung, um von zwei oder mehreren Bildern die Raumkoordinaten von Punkten zu bestimmen. Bei der linearen Kalibrierung wird pro Kamera ein Parameterset von 14 Parametern erstellt, das im weitesten Sinne die Position und Lage der Kamera im Raum beschreibt.

Voraussetzung für die lineare Kalibrierung ist die Vermessung von mindestens 7 Raumpunkten mit bekannten (manuell vermessenen) Raumkoordinaten (den sogenannten 'Passpunkten'). Man baut für diesen Zweck meist einen Kalibrierkörper oder Kalibrierahmen. Je mehr Passpunkte man verwendet, desto genauer wird die Kalibrierung, weil die Parameter mit einem Least-Square-Verfahren optimiert werden.

Für die Berechnung der Kalibrierparameter wird das Wort
camera_calib_3d verwendet (siehe auch Kapitel 'Mathematik und Statistik, Kamerakalibrierung).

Das Wort camera_calib_3d setzt allerdings voraus, daß man von mehreren Kameras die Bildkoordinaten der Markierungspunkte richtig zuordnet. Wenn mehrere Markierungspunkte gleichzeitig im Bild sind (was eigentlich die Regel ist), wird diese Zuordnung unter Umständen etwas kompiziert. Das Wort combination>3d versucht diese Zuordnung automatisch durchzuführen. Bei drei oder mehr Kameras und entsprechender Messgenauigkeit gelingt diese Zuordnung zu fast 100%, bei zwei Kameras ist die Fehlerwahrscheinlichkeit höher, bei mehr als drei Kameras steigt die benötigte Rechenzeit stark an.

Syntax von combination>3d:

[ x1 y1 x2 y2 ... ] calib maxdist -> [ p1 p2 .. ]
  • xI .... Realverbund mit X-Koordinaten der I-ten Kamera.
  • yI .... Realverbund mit Y-Koordinaten der I-ten Kamera.
  • calib .... Verbund mit Kalibrierdaten (berechnet mit camera_calib_3d) Form:
    [ cx1 cy1 ... ] 
    
  • cxI ... Realverbunde mit den 7 zur X-Koordinate der Kamera I gehoerenden Kalibrierparameter.
  • cyI ... Realverbunde mit den 7 zur Y-Koordinate der Kamera I gehoerenden Kalibrierparameter.
  • maxdist ... Realzahl mit Maximalfehler im Bildkoordinatensystem. Punkte, deren Fehler groesser oder gleich 'maxdist' ist, scheinen nicht im Ergebnis auf.
  • pI .... Verbund der Form [ x y z ] mit jeweils einem Raumpunkt.

    MAL-Homepage Inhaltsverzeichnis


    5.3. Messung und Bildanalyse

    Für die Erfassung von statischen Bildern können Olympus Camedia Kameras (C-400 oder C-860L) verwendet werden. Diese können an die serielle Schnittstellen angeschlossen und mit den Worten

    angesprochen werden.

    Beispiel einer Aufnahme mit anschließender Bildanalyse:
    "com1" olympus
    olympus_erase 
    olympus_snapshot 
    "bild.jpg" 1 olympus_getframe "bild.jpg" jpeg> mean >> bild
    bild 3 1 frame_auto_spots >> bildkoordinaten 
    
    Die Erfassung von dynamischen Vorgängen ist im MAL-System nicht implementiert. Hat man ein System, das bereits Bildkoordinaten liefert, so können diese vom MAL-Interpreter gelesen und weiterverarbeitet werden. Andernfalls muß man eine Schnittstelle zum Eintransfer der Videobilder implementieren. Entsprechende Hinweise finden sich im Tutorial und im Kapitel Erweiterung.

    MAL-Homepage Inhaltsverzeichnis