Der Vorgang der Objektsegmentierung unterteilt sich im Wesentlichen in zwei Schritte, die Vorfilterung des Bildes sowie der letztendlichen Ermittlung der Kanten des Objektes auf diesem vorgefilterten Bild. Vom Benutzer steuerbar ist ausschließlich der Vorgang der Vorfilterung.
In der Vorfilterung wird zunächst ein Glättungsfilter eingesetzt, um Rauschen und Bildstörungen zu entfernen. Mittels eines Laplcefilters werden im Bild auftretende Kanten extrahiert. Um später das Objekt segmentieren zu können, muss die Objektkontur möglichst geschlossen sein. Hierfür wird ein Closing-Filter angewandt, dessen Stärke vom Benutzer anhand der Zahl der Iterationen gesteuert werden kann. Anschließend wird ein Binärbild erzeugt, wobei es ebenfalls Aufgabe des Benutzers ist, einen geeigneten Schwellwert zu finden.
Um nun die Segmentierung zu erstellen, werden von den Kanten des Bildes zum Mittelpunkt hin die ersten zum Objekt gehörigen Pixel in Form der jeweils ersten weißen Pixels gesucht. Befinden sich zwei Punkte der gefundenen Segmentierung nicht direkt nebeneinander, so wird versucht die Kontur zu schließen, indem entlang der Kante ein Weg von einem Punkt zum nächsten gesucht wird. Wird eine Möglichkeit gefunden, so werden diese Punkte der Segmentierung hinzugefügt. Befinden sich anschließend noch immer Lücken in der Segmentierung, so wird an diesen Stellen interpoliert.
Um die gefundene Segmentierung weiter zu verbessern, gibt es die Möglichkeit
einen Snake-Algorithmus auf diese anzuwenden. Hierfür werden Kontrollpunkte
der Segmentierung extrahiert und so verschoben, das sich eine optimale Lage
bezüglich gleicher Abstände und flacher Winkel zwischen den einzelnen
Kontrollpunkten ergibt, und diese möglichst auf einem Pixel liegen, der
einen hohen Intensitätsunterschied zu seinem Nachbarn aufweist.
Gleitender Mittelwert eines 3x3 Kernels, um Störrauschen aus dem Quellbild
zu entfernen.
![]() |
![]() |
Quellbild | gefiltertes Bild |
Herausfiltern hoher Frequenzen (Kanten) mittels Laplacefilterung auf Grundlage des vorgefilterten Bildes
![]() |
![]() |
Quellbild | gefiltertes Bild |
Anwendung eines morphologischen Filters, um Lücken zwischen den gefundenen
Kanten zu schließen. Durch die Filterung gehen kleine dunkle Bereiche
verloren, helle Bereiche hingegen bleiben erhalten oder vergrößern
sich.
Das Ergebnis der Filterung ist abhängig von der Anzahl der Iterationen.
Je größer die Anzahl der Iterationen, desto besser schließen
sich Lücken zwischen den Kanten, es ergibt sich jedoch auch das Problem,
dass kleine konkave Bereiche zulaufen.
Die Anzahl der Iterationen wird über den Parameter closeIteration
gesteuert. Erfahrungsgemäß ergeben Werte im Bereich 3-5 gute Ergebnisse
als Grundlage für die weitere Verarbeitung des Bildes. Es muss mindestens
eine Iteration durchgeführt werden.
![]() |
![]() |
Quellbild | 3 Iterationen |
![]() |
![]() |
6 Iterationen | 10 Iterationen |
Der Binary-Filter wird eingesetzt, um aus dem vorgefilterten Graustufenbild
ein Binärbild mittels eines Schwellwertes zu erzeugen. Alle Pixel, deren
Intensität unterhalb dieses Schwellwertes liegt, werden zu schwarz (0),
alle darüber liegenden zu weiß (255). Nur weiße Pixel werden
später als Objektkante erkannt.
Der Schwellwerte wird über den Parameter threshold gesteuert.
Er muss zwischen 1 und 254 liegen. Gute Ergebnisse zur Weiterverarbeitung haben
sich erfahrungsgemäß im Bereich von 50 bis 100 ergeben. Liegt der
Schwellwert zu niedrig, so werden Schatten und andere störende Effekte
im Hintergrund sichtbar und somit zum Objekt hinzugefügt. Wird der Wert
zu hoch gewählt, so können Lücken im Objekt entstehen, wodurch
der Algorithmus ins Objektinnere laufen würde.
![]() |
![]() |
Schwellwert 30 | Schwellwert 50 |
![]() |
![]() |
Schwellwert 70 | Schwellwert 110 |
Die Edge-Iteration setzt zunächst Kontrollpunkte auf jedes Pixel der
vier Bildkanten. Bei jedem Iterationsschritt werden diese Punkte um einen Pixel
zur Mitte hin versetzt. Falls es sich dabei um einen weißen Pixel handelt,
so wird dieser Kontrollpunkt als fest markiert und nimmt nicht weiter an der
Iteration teil. Die Iteration wird so lange fortgesetzt, bis alle Kontrollpunkte
gestoppt wurden oder sich in der Mitte des Bildes befinden.
Die so gefundenen Kontrollpunkte stellen die erste grobe Segmentierung des Objektes
dar.
Liegen zwei Kontrollpunkte nicht direkt nebeneinander, so wird in diesem Schritt
versucht diese Lücke zu schließen. Wird zwischen diesen Punkten ein
Polygonzug weißer Pixel mit jeweils mindestens einem schwarzen Pixelnachbarn
gefunden, so werden diese Pixel eingefügt. Zunächst werden die Kontrollpunkte
im Uhrzeigersinn bearbeitet, anschließend entgegen.
Die Kantenschließung liefert nur Ergebnisse so lange keine spitzen Winkel
entlang der Objektkante dieses Bereiches auftauchen.
forward
backward
Gibt es noch Kontrollpunkte, die nicht direkt benachbart sind, so findet eine direkte Interpolation zwischen ihnen statt.
Mittels des Snake-Algorithmus sollten die gefundenen Kontrollpunkte der Segmentierung
weiter verbessert werden. In der Praxis ergab sich jedoch eher eine Verschlechterung
der bereits gefundenen Segmentierung.
Die Steuerung der Snake erfolgt über die Angabe der Anzahl der Iterationen
sowie einer Gewichtung dreier Faktoren des Algorithmus.