Sie erhalten ein Echtfarbenbild. Ihre Aufgabe ist es, eine Version dieses Bildes zu erstellen, die aussieht, als wäre es mit Hilfe von Malen nach Zahlen gemalt worden (die Aktivität der Kinder, keine Nonogramme). Zusammen mit dem Bild erhalten Sie zwei Parameter: P , die maximale Größe der Farbpalette (dh die maximale Anzahl der zu verwendenden Farben) und N , die maximale Anzahl der zu verwendenden Zellen . Ihr Algorithmus muss nicht alle P- Farben und N- Zellen verwenden, es darf jedoch nicht mehr verwendet werden. Das Ausgabebild sollte die gleichen Abmessungen wie das Eingabebild haben.
Eine Zelle ist als zusammenhängender Bereich von Pixeln definiert, die alle die gleiche Farbe haben. Pixel, die sich nur an einer Ecke berühren, werden nicht als zusammenhängend betrachtet. Zellen können Löcher haben.
Kurz gesagt, Sie müssen das Eingabebild mit nur N flach schattierten / einfarbigen Bereichen und P verschiedenen Farben approximieren.
Nur um die Parameter zu veranschaulichen, ist hier ein sehr einfaches Beispiel (für kein bestimmtes Eingabebild; zeige meine verrückten Malfähigkeiten). Das folgende Bild hat P = 6 und N = 11 :
Hier sind ein paar Bilder, mit denen Sie Ihren Algorithmus testen können (meistens unsere üblichen Verdächtigen). Klicken Sie auf die Bilder für größere Versionen.
Bitte geben Sie eine Handvoll Ergebnisse für verschiedene Parameter an. Wenn Sie eine große Anzahl von Ergebnissen anzeigen möchten , können Sie auf imgur.com eine Galerie erstellen , um die Größe der Antworten angemessen zu halten. Alternativ können Sie Thumbnails in Ihren Beitrag einfügen und diese wie oben beschrieben mit größeren Bildern verknüpfen. Sie können auch andere Testbilder verwenden, wenn Sie etwas Schönes finden.
Ich gehe davon aus, dass Parameter um N ≥ 500 , P ~ 30 den realen Paint-by-Number-Vorlagen ähneln.
Dies ist ein Beliebtheitswettbewerb, daher gewinnt die Antwort mit den meisten Netto-Stimmen. Die Wähler werden aufgefordert, die Antworten nach zu beurteilen
- Wie gut sind die Originalbilder angenähert.
- Wie gut der Algorithmus auf verschiedenen Arten von Bildern funktioniert (Bilder sind wahrscheinlich im Allgemeinen einfacher als Fotos).
- wie gut der Algorithmus mit sehr restriktiven Parametern arbeitet.
- wie organisch / glatt die Zellformen aussehen.
Ich werde das folgende Mathematica-Skript verwenden, um die Ergebnisse zu validieren:
image = <pastedimagehere> // ImageData;
palette = Union[Join @@ image];
Print["P = ", Length@palette];
grid = GridGraph[Reverse@Most@Dimensions@image];
image = Flatten[image /. Thread[palette -> Range@Length@palette]];
Print["N = ",
Length@ConnectedComponents[
Graph[Cases[EdgeList[grid],
m_ <-> n_ /; image[[m]] == image[[n]]]]]]
Sp3000 war so nett, einen Verifizierer in Python 2 mit PIL zu schreiben, den Sie in diesem Pastebin finden .
quelle
Antworten:
Python 2 mit PIL ( Galerie )
Updatezeit! Dieses Update enthält einen einfachen Glättungsalgorithmus, mit dem Bilder weniger unscharf wirken. Wenn ich erneut aktualisiere, muss ich allerdings einen angemessenen Teil meines Codes überarbeiten, da er unordentlich wird und ich einen Fehler behebe.
Ich habe auch Farben mit einem Gewicht von k-means basierend auf der Zellgröße erstellt, wodurch einige Details für restriktivere Parameter (z. B. die Mitte des Nebels und die Heugabel der amerikanischen Gotik) verloren gehen, aber die Farbauswahl insgesamt schärfer und schöner wird. Interessanterweise verliert es den gesamten Hintergrund für Raytrace-Kugeln für P = 5.
Algorithmuszusammenfassung:
Die Verarbeitungszeit für jedes Bild hängt in hohem Maße von seiner Größe und Komplexität ab. Für die Testbilder liegen die Zeiten zwischen 20 Sekunden und 7 Minuten.
Da der Algorithmus eine Randomisierung verwendet (z. B. Zusammenführen, k-Means), können Sie bei verschiedenen Läufen unterschiedliche Ergebnisse erzielen. Hier ist ein Vergleich von zwei Läufen für das Bärenbild mit N = 50 und P = 10:
Hinweis: Alle Bilder unten sind Links. Die meisten dieser Bilder stammen aus dem ersten Durchgang, aber wenn mir die Ausgabe nicht gefallen hat, habe ich mir bis zu drei Versuche erlaubt, fair zu sein.
N = 50, P = 10
N = 500, P = 30
Aber ich bin ziemlich faul, wenn es darum geht, nach Farben zu malen, also nur zum Spaß ...
N = 20, P = 5
Außerdem ist es amüsant zu sehen, was passiert, wenn Sie versuchen, 1 Million Farben in N = 500, P = 30 zu quetschen :
Hier ist eine schrittweise Anleitung für den Algorithmus für das Unterwasserbild mit N = 500 und P = 30 in animierter GIF-Form:
Ich habe auch eine Galerie für die vorherigen Versionen des Algorithmus gemacht hier . Hier sind einige meiner Favoriten aus der letzten Version (aus der Zeit, als der Nebel mehr Sterne hatte und der Bär pelziger aussah):
quelle
im = im.convert("RGB")
anscheinend für einige Bilder benötigt. Ich werde das hinzufügen, nachdem ich den Code ein wenig umstrukturiert habe.Python 2 mit PIL
Auch eine Python-Lösung und wahrscheinlich eine in Arbeit befindliche:
Der Algorithmus folgt einem anderen Ansatz als der von SP3000, wobei zuerst mit den Farben begonnen wird:
Suchen Sie eine Farbpalette mit P- Farben durch k-means Clustering und malen Sie das Bild in dieser reduzierten Palette.
Wenden Sie einen leichten Medianfilter an, um Rauschen zu beseitigen.
Machen Sie eine Liste aller monochromatischen Zellen und sortieren Sie sie nach Größe.
Führe die kleinsten Zellen mit ihrem jeweils größten Nachbarn zusammen, bis nur noch N Zellen übrig sind.
In Bezug auf Geschwindigkeit und Qualität der Ergebnisse gibt es durchaus Verbesserungspotenzial. Insbesondere der Zellzusammenführungsschritt kann bis zu vielen Minuten dauern und liefert bei weitem keine optimalen Ergebnisse.
P = 5, N = 45
P = 10, N = 50
P = 4, N = 250
P = 11, N = 500
quelle
Mathematica
Momentan werden die Anzahl der Farben und der Gaußsche Radius für den Gaußschen Filter benötigt. Je größer der Radius ist, desto stärker verschwimmen und verschmelzen die Farben.
Da die Anzahl der Zellen nicht eingegeben werden kann, wird eine der Grundanforderungen der Herausforderung nicht erfüllt.
Die Ausgabe enthält die Anzahl der Zellen für jede Farbe sowie die Gesamtzahl der Zellen.
Aktualisieren
quantImage2
Ermöglicht die Angabe der gewünschten Anzahl von Zellen als Eingabe. Er ermittelt den besten Gaußschen Radius, indem er Szenarien mit größeren Radien durchläuft, bis eine enge Übereinstimmung gefunden wird.quantImage2
Ausgänge (Bild, angeforderte Zellen, verwendete Zellen, Fehler, verwendeter Gaußscher Radius).Es ist jedoch sehr langsam. Um Zeit zu sparen, können Sie mit einem Anfangsradius beginnen, dessen Standardwert 0 ist.
Beispiel, für das wir die Anzahl der Zellen angeben, die in der Ausgabe gewünscht werden.
Beispiel für die Anforderung von 90 Zellen mit 25 Farben. Die Lösung liefert 88 Zellen, 2% Fehler. Die Funktion hat den Gaußschen Radius von 55 gewählt. (Viel Verzerrung).
Beispiele, bei denen die Eingabe den Gaußschen Radius, nicht jedoch die Anzahl der Zellen enthält.
25 Farben, Gaußscher Radius von 5 Pixeln
Drei Farben, Radius von 17 Pixel
Zwanzig Farben, Radius von 17 Pixeln
Wir haben die Anzahl der Farben erhöht, aber nicht den Fokus. Beachten Sie die Zunahme der Anzahl der Zellen.
Sechs Farben, Radius von 4 Pixeln
Sternenklare Nacht
Mit nur 6 Farben und 60 Zellen. Es gibt eine Farbinkongruenz in den Farben, die von
showColors
ihm verwendet werden. (Gelb erscheint nicht unter den 5 Farben, aber es wird in der Zeichnung verwendet.) Ich werde sehen, ob ich das herausfinden kann.quelle
showColors
einer Reihe von Farben und Radien zu erstellen und die Kombination auszuwählen, die der gewünschten Anzahl von Zellen am nächsten kommt. Ich bin mir nicht sicher, ob ich das Gas dazu habe. Vielleicht später.Python 2 mit PIL
Dies ist noch in Arbeit. Außerdem ist der folgende Code ein schreckliches Durcheinander von Spaghetti und sollte nicht als Inspiration verwendet werden. :)
Wie es funktioniert
Das Programm unterteilt die Zeichenfläche in
P
Bereiche, die jeweils aus einer bestimmten Anzahl von Zellen ohne Löcher bestehen. Zunächst wird die Leinwand nur in ungefähre Quadrate unterteilt, die den Regionen zufällig zugewiesen werden. Dann werden diese Bereiche in einem iterativen Prozess "deformiert", wobei ein gegebenes Pixel seinen Bereich ändern kann, wennDie letztere Bedingung kann lokal durchgesetzt werden, so dass der Prozess ein bisschen wie ein zellularer Automat ist. Auf diese Weise müssen wir keine Wegfindung oder Ähnliches durchführen, was den Prozess erheblich beschleunigt. Da die Zellen jedoch nicht aufgebrochen werden können, enden einige von ihnen als lange "Filamente", die an andere Zellen angrenzen und deren Wachstum hemmen. Um dies zu beheben, gibt es einen Prozess namens "Filamentschnitt", der gelegentlich eine fadenförmige Zelle in zwei Teile zerlegt, wenn
N
zu diesem Zeitpunkt weniger als Zellen vorhanden sind . Zellen können auch verschwinden, wenn ihre Größe 1 ist, und dies schafft Platz für die Filamentschnitte.Der Prozess endet, wenn kein Pixel den Anreiz hat, die Regionen zu wechseln, und danach wird jede Region einfach anhand ihrer Durchschnittsfarbe gefärbt. In der Regel verbleiben einige Filamente in der Ausgabe, wie in den folgenden Beispielen zu sehen ist, insbesondere im Nebel.
P = 30, N = 500
Mehr Bilder später.
Einige interessante Eigenschaften meines Programms sind, dass es probabilistisch ist, so dass die Ergebnisse zwischen verschiedenen Läufen variieren können, es sei denn, Sie verwenden natürlich den gleichen Pseudozufalls-Startwert. Die Zufälligkeit ist jedoch nicht wesentlich, ich wollte nur zufällige Artefakte vermeiden, die sich aus der Art und Weise ergeben, wie Python einen Satz von Koordinaten oder ähnliches durchläuft. Das Programm verwendet in der Regel alle
P
Farben und fast alleN
Zellen, und die Zellen enthalten keine Löcher. Auch der Verformungsvorgang ist ziemlich langsam. Die Herstellung der farbigen Kugeln auf meiner Maschine dauerte fast 15 Minuten. Auf der Oberseite schalten Sie das einGRAPHICAL_LOGGING
Option, erhalten Sie eine coole Serie von Bildern des Verformungsprozesses. Ich habe die Mona Lisa in eine GIF-Animation umgewandelt (um 50% verkleinert, um die Dateigröße zu verringern). Wenn Sie sich ihr Gesicht und ihre Haare genau ansehen, können Sie den Filamentschneidevorgang in Aktion sehen.quelle