Digital Signal Processing Reference
In-Depth Information
A.
Rekursive Regionenmarkierung:
Die rekursive Version (Alg.
11.1, Zeile 8) benutzt zur Verwaltung der noch zu besuchenden Bild-
koordinaten keine expliziten Datenstrukturen, sondern verwendet
dazu die lokalen Variablen der rekursiven Prozedur.
1
Durch die Nach-
barschaftsbeziehung zwischen den Bildelementen ergibt sich eine
Baumstruktur, deren Wurzel der Startpunkt innerhalb der Region
bildet. Die Rekursion entspricht einem Tiefendurchlauf (
depth-first
traversal
) [19, 32] dieses Baums und fuhrt zu einem sehr einfachen
Programmcode, allerdings ist die Rekursionstiefe proportional zur
Große der Region und daher der Stack-Speicher rasch erschopft. Die
Methode ist deshalb nur fur sehr kleine Bilder anwendbar.
B.
Iteratives
Flood Filling
(
depth-first
):
Jede rekursive Prozedur
kann mithilfe eines eigenen
Stacks
auch iterativ implementiert wer-
den (Alg. 11.1, Zeile 16). Der Stack dient dabei zur Verwaltung der
noch
”
offenen“ (d. h. noch nicht bearbeiteten) Elemente. Wie in der
rekursiven Version (A) wird der Baum von Bildelementen im
Depth-
first
-Modus durchlaufen. Durch den eigenen, dedizierten Stack (der
dynamisch im so genannten
Heap-Memory
angelegt wird) ist die
Tiefe des Baums nicht mehr durch die Große des Aufruf-Stacks be-
schrankt.
C.
Iteratives
Flood Filling
(
breadth-first
):
Ausgehend vom Start-
punkt werden in dieser Version die jeweils angrenzenden Pixel schicht-
weise, ahnlich einer Wellenfront expandiert (Alg. 11.1, Zeile 28). Als
Datenstruktur fur die Verwaltung der noch unbearbeiteten Pixel-
koordinaten wird (anstelle des Stacks) eine
Queue
(Warteschlange)
verwendet. Ansonsten ist das Verfahren identisch zu Version B.
11
Regionen in Binarbildern
Java-Implementierung
Die rekursive Version (A) des Algorithmus ist in Java praktisch 1:1 umzu-
setzen. Allerdings erlaubt ein normales Java-Laufzeitsystem nicht mehr
als ungefahr 10.000 rekursive Aufrufe der FloodFill()-Prozedur (Alg.
11.1, Zeile 8), bevor der Speicherplatz des Aufruf-Stacks erschopft ist.
Das reicht nur fur relativ kleine Bilder mit weniger als ca. 200
×
200
Pixel.
Prog. 11.1 zeigt die vollstandige Java-Implementierung beider Vari-
anten der iterativen FloodFill()-Prozedur. Zunachst wird in Zeile 1
eine neue Java-Klasse
Node
zur Reprasentation einzelner Pixelkoordina-
ten definiert.
Zur Implementierung des Stacks in der iterativen
Depth-first
-Version
(B) verwenden wir als Datenstruktur die Java-Klasse
Stack
(Prog.
11.1, Zeile 8), ein Container fur beliebige Java-Objekte. Fur die
Queue
-
1
Fur lokale Variablen wird in Java (oder auch in C und C++) bei jedem
Prozeduraufruf der entsprechende Speicherplatz dynamisch im so genannten
Stack Memory
angelegt.