Was ist der beste "Bucket-Fill" -Algorithmus?

16

Ich bin ziemlich neu in der Bildverarbeitung und arbeite derzeit an einer malenähnlichen Anwendung, die eine Eimerfüllung bietet. Ich habe jedoch keine Ahnung, was der beste Algorithmus für eine Eimerfüllung ist.

Ich habe ein Beispiel implementiert, das ich auf dieser Site gefunden habe. Es kam jedoch zu Endlosschleifenproblemen, als ein Benutzer versuchte, einen Bereich zu füllen, der bereits mit derselben Farbe gefüllt war.

Ich arbeite derzeit an diesem Problem, indem ich links, rechts, oben und dann unten ausfülle. Ich habe es jedoch so gemacht, dass ein Pixel, das einmal links ausgefüllt wurde, nicht rechts ausgefüllt werden kann. Dies bedeutet, dass Formen wie:

Beispiel

wird nicht richtig gefüllt, wenn das Schaufelwerkzeug am roten Punkt verwendet wird.

Daher hoffe ich, dass jemand einen Algorithmus oder einen Link zu einem kennt, der all diese Probleme löst.

Zusätzliche Informationen: Dies wird mit Javascript als Malwerkzeug implementiert. Es wird online unter Verwendung des Canvas-Elements verwendet.

Ivan
quelle
Ist dieser Vektor oder Bitmap basiert? Ich gehe davon aus, dass das Bild eine Bitmap enthält, stelle aber nur sicher, dass ..
Demian Brecht,
1
Ich denke du hast etwas falsch implementiert. Ich habe das Dokument überflogen und gemäß den Bildbeispielen sollte dies Bilder wie das oben gezeigte füllen. Haben Sie seinen Code kopiert und eingefügt oder neu geschrieben?
RLH
Denken Sie Graph Traversal.
Bwmat
@RLH: Ich habe seinen Code mit ein paar Änderungen kopiert und eingefügt, damit er mit meinem Setup funktioniert.
Ivan
@Ivan: Suche erst nach einem neuen Algo, wenn du deine "Endlosschleifen" -Probleme gelöst hast. Wenn Sie das für eine vorhandene Implementierung nicht einmal beheben können, werden Sie definitiv in viel größere Schwierigkeiten geraten, wenn Sie das Ganze von Grund auf neu schreiben werden.
Doc Brown

Antworten:

21

Es hört sich so an, als ob Sie tatsächlich nach einem so genannten Flood-Fill-Algorithmus suchen. Vielleicht haben Sie deshalb nicht viele Beispiele dafür gefunden. Auf der Wikipedia-Seite sind mehrere Flood-Fill-Methoden für den Algorithmus aufgeführt . Ich empfehle dringend eine der nicht-rekursiven Methoden in der Warteschlange.

GroßmeisterB
quelle
I highly recommend one of the non-recursive, 'queued' methods.- Können Sie erklären, warum?
Elfayer
1
@Elfayer Jedes Mal, wenn eine Funktion aufgerufen wird (z. B. "X ()" ruft "Y ()" auf), werden die Parameter und der Speicherort der Ursprungsfunktion ("X ()") auf dem Stapel gespeichert. Wenn Sie also einen großen und komplizierten Raum füllen, gibt es viele rekursive Funktionsaufrufe. Abhängig von Ihrem Compiler und Ihrer Sprache kann dies zu Stapelüberläufen oder zu einem übermäßigen Speicherverbrauch führen.
Boxcartenant
-1

Ich mache gerade das Gleiche. Als ich jedoch auf das von Ihnen angesprochene Problem stieß, habe ich mich dafür entschieden, die Funktion einfach zu beenden, wenn das Werkzeug auf einen Bereich derselben Farbe geklickt wurde, die Sie malen möchten (dies scheint auch das Verhalten von ms-paint zu sein). .

Die Methode in der Warteschlange sollte für alle mit Programmiererfahrung äußerst intuitiv sein.

Wenn Sie den Bereich um einen Punkt mit der gleichen Farbe wie Ihre Farbe bemalen, können Sie Folgendes tun:

  • Überprüfen Sie die Hintergrundfarbe.
  • Suchen Sie nach der Kante des Farbflecks, auf den Sie geklickt haben.
  • Stellen Sie die umliegenden Punkte auf den Punkt.
  • Fahren Sie mit der normalen Ausführung fort, indem Sie diese (in diesem Fall) mit weißen Punkten gefüllte Warteschlange verwenden.

Wenn Sie möchten , können Sie einen Blick auf meine (ziemlich peinlich) Code nehmen hier .

Es ist alles andere als schnell, aber es funktioniert gut ...

Juan Pablo Alvarez Alfaro
quelle
Warum die Abstimmungen? :( Ich weiß, dass die Methode nicht besonders "schnell" ist, aber sie funktioniert und auch die vorgeschlagene Lösung :(
Juan Pablo Alvarez Alfaro
1
Dieser Beitrag ist ziemlich schwer zu lesen (Textwand). Hätten Sie etwas dagegen bearbeiten sie in eine bessere Form ing?
gnat
2
Ernsthaft? Menschenmassen stimmten ab, weil es schwer zu lesen war? Warum nicht bearbeiten? Es ist nicht so, dass der Inhalt problematisch ist.
l46kok