PIL: Flächen füllen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
no1
User
Beiträge: 1
Registriert: Mittwoch 17. Oktober 2007, 10:34

Hallo,

ich habe ein kleines Problem mit der Image-Library (PIL). Und zwar möchte flogende Grafik oberhalb des Graphen mit weißer Farbe füllen.

Bild


Das Ergebnis soll dann so aussehen:

Bild


Mein Ansatz zu der Lösung war jeden Pixel von (1,1) ausgehend rekursiv auf seine Farbe zu überprüfen und ggf. färben. Hier ist der Code dazu:

Code: Alles auswählen

imageWidth = 400
imageHeight = 200

def fillWhite(im,x,y):
    global imageWidth, imageHeight
    if x in range(1,imageWidth) and y in range(1,imageHeight):
        if im.getpixel((x,y)) == 0:
            im.putpixel((x,y), 255)
            fillWhite(im,x+1,y)
            fillWhite(im,x,y+1)

fillWhite(im,1,1)
Das Problem ist nur, dass das Ganze für das Bild (400x200) schon ca. 15 Sekunden dauert. Ich möchte das Bild aber eigentlich mit mindestens 1200x600 Pixeln darstellen. Das dauert dann aber definitiv zu lange. Gibt es da nicht eine einfachere Lösung. Die gängigen Bildbearbeitungsprogramme machen das doch auch in Bruchteilen von Sekunden.

Im PIL-Handbuch bin ich nicht fündig geworden!

Wäre dankbar für Vorschläge und Ideen.

Gruß, Martin
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Sieh Dir das mal an: http://de.wikipedia.org/wiki/Floodfill
Wahrscheinlich wäre die iterative Flutfüllung effektiver. Viel Zeit dürfte aber auch hier durch unnötige Mehrfachüberprüfungen von Punkten verschwendet werden.
Hier dasselbe Problem: http://mail.python.org/pipermail/image- ... 01258.html
MfG
HWK
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Wenn du die Kurve selbst zeichnest, käme eventuell die Erstellung eines "Pfades" (Begriff aus der Vektorgrafik), der die komplette weiße Fläche umschließt inkl. Füllung in Frage. Sowas kann laut Beschreibung mittlerweile aggdraw, welches im PIL-Handbuch erwähnt wird.
Antworten