4.3 Histogrammfunktionen und Grauwertschwelle

Bereits in der Funktion OnIdle() wird ein Histogramm des Differenzbilds erzeugt. Es besteht aus einem Array mit 256 Elementen. Die Indizes repräsentieren den jeweiligen Grauwert, und der Inhalt des Feldes die Häufigkeit beziehungsweise die Anzahl des Grauwerts im Bild. Um dieses Histogramm weiter auswerten zu können, muss es zunächst mit der Funktion SmoothHistogramm(Startwert, Endwert, Breite, Histogramm) geglättet werden.

Die Funktion SmoothHistogramm() bekommt als Übergabeparameter einen Start-Grauwert, einen End-Grauwert und die Breite, über die das Histogramm geglättet werden soll. Bei einer Breite von 20 wird der aktuelle Wert dann aus dem Mittel der umliegenden 10 Werte rechts und links errechnet.

Mittels der Funktion DrawHistogramm( Histogramm, GWS) kann das Histogramm in einem zusätzlichen Fenster dargestellt werden. Der Hotkey hierfür ist ALT-H.

Abbildung 15

Das in Abbildung 15 gezeigte Histogramm ist bereits geglättet. Geht man davon aus, dass die Laserpunkte im Differenzbild heller als der Rest des Bildes sind und somit ein größere relative Häufigkeit als die anderen Grauwerte haben, kann man aus den lokalen Maxima und Minima auf die Grauwerte der Laserpunkte schließen.

Um das Bild optimal binarisieren zu können (und das auch unter verschiedenen Lichtbedingungen) wird hier eine Grauwertschwelle gesucht, die später entscheidet, in welcher Weise das Bild zur Weiterverarbeitung binarisiert wird, das heißt, welche Pixel 0 (schwarz) oder 255 (weiß) werden.

Aus der Erfahrung hat sich gezeigt, dass das erste lokale Minimum von links gesehen ein guter Wert für die Grauwertschwelle ist.

Um dieses Minimum zu finden existiert eine Funktion LocMin(). Diese Funktion erhält als Parameter einen Start-Grauwert und einen End-Grauwert des zu bearbeiteten Bereiches, sowie die Anzahl der auf- und absteigenden Schwellen, die nötig sind, um ein Minimum als ein solches zu erkennen.

Diese Funktion bedient sich wiederum zweier Unterfunktionen NofUp() und NofDown(), die eben diese Schwellen sucht.

In unserem Fall wird zunächst nach einem Minimum gesucht, das 10 Pixel aufsteigende Flanken nach rechts und links hat. Existiert dieses Minimum nicht, wird Minimum mit 2 Pixel Differenz gesucht, existiert auch dieses nicht, nehmen wir zehn Prozent des größten Grauwertes, der gefunden wurde, als die Grauwertschwelle an.

An dieser Stelle kann auch eindeutig gesagt werden, ob ein "Lasersprung" stattgefunden hat, das heißt, dass zwei Bilder aufgenommen wurden, in denen nur auf einem die Laserpunkte zu sehen sind. Nur in diesem Fall ist es nämlich möglich, dass das Histogramm die in Abbildung 15 gezeigt Form hat. Unsere ersten Versuche gingen jedoch einer anderen Idee nach: Die Summe aller Grauwerte im Bild mit Laser muss zwangsläufig deutlich höher sein als in einem Bild ohne Laser. Dies funktioniert jedoch nur, wenn die Laser sehr hell im Bild zu sehen sind, was zum Beispiel in einem abgedunkelten Raum oder bei sehr nahen Hindernissen der Fall ist. Es stellte sich heraus, dass bei guter bis sehr guter Beleuchtung des Labyrinths oder bei fehlenden Hindernissen und somit "weit entfernter" Laserpunkte diese Differenz der Grauwertsummen nicht mehr eindeutig zu bestimmen ist und somit auch Differenzbilder ohne Laserpunkte ausgewertet wurden. Die derzeit verwendete Methode ist dabei um einiges sicherer. Das verwendete Prinzip der Ermittlung bringt dabei im Falle, dass keine Laser im Differenzbild sind, eine Grauwertschwelle, die größer als 255 ist, was aber nicht möglich sein kann, da nur 254 Grauwerte existieren. Die weitere Analyse des Differenzbildes wird also nur durchgeführt, wenn die Grauwertschwelle unterhalb von 255 liegt, andernfalls wird auf das nächste Bild vom Framegrabber gewartet.

Mit sinnvoller Grauwertschwelle kann das Bild nun mittels der Funktion Stretch() binarisiert werden.

Abbildung 16