MS Paint war immer eine großartige Zeitverschwendung, wurde aber von den meisten Grafikdesignern gemieden. Vielleicht haben die Leute das Interesse wegen der ruckelnden Farbpalette oder wegen der eingeschränkten Rückgängigmachung verloren. Ungeachtet dessen ist es immer noch möglich, schöne Bilder mit nur dem Standardpinsel und der Standardfarbpalette zu erzeugen.
Herausforderung
Verwenden Sie nur den Standardpinsel (ein 4x4-Quadrat ohne Ecken) und die Standardfarbpalette (die 28 Farben unten), um ein Quellbild mit einer Technik zu replizieren, die auf stochastischem Bergsteigen basiert .
Algorithmus
Jede Antwort muss dem gleichen grundlegenden Algorithmus folgen (stochastischer Bergaufstieg). Details können in jedem Schritt angepasst werden. Eine Bewegung ist ein Pinselstrich (dh ein Klicken in die Farbe).
- Errate den nächsten Satz (die nächsten Sätze). Errate die Koordinaten und Farben der nächsten Bewegung (en), wie du möchtest. Die Vermutung darf jedoch nicht auf das Quellbild verweisen.
- Wenden Sie die Vermutung an. Wenden Sie den Pinsel auf das Gemälde an, um die Bewegung (en) zu machen.
- Messen Sie den Nutzen von Bewegung (en). Bestimmen Sie durch Bezugnahme auf das Quellbild, ob die Bewegung (en) dem Gemälde zugute kamen (dh das Gemälde ähnelt dem Quellbild näher). Wenn es von Vorteil ist, behalten Sie die Bewegung (en) bei, andernfalls verwerfen Sie die Bewegung (en).
- Wiederholen Sie dies bis zur Konvergenz. Fahren Sie mit Schritt 1 fort und versuchen Sie es mit der nächsten Schätzung, bis der Algorithmus ausreichend konvergiert hat. Das Bild sollte an dieser Stelle dem Originalbild stark ähneln.
Wenn Ihr Programm nicht mit diesen vier Schritten übereinstimmt, handelt es sich wahrscheinlich nicht um einen stochastischen Aufstieg. Ich habe dies als Beliebtheitswettbewerb markiert, weil das Ziel darin besteht, interessante Malalgorithmen auf der Grundlage der begrenzten Farbpalette und des Pinsels zu erstellen.
Einschränkungen
- Der Algorithmus sollte in irgendeiner Weise stochastisch sein .
Die nächste Vermutung sollte nicht vom Quellbild beeinflusst werden. Sie erraten jede neue Bewegung und prüfen dann, ob sie geholfen hat oder nicht. Anhand der Farben des Quellbilds können Sie beispielsweise nicht bestimmen, wo der Pinsel platziert werden soll (dies ähnelt dem Dithering des Quellbilds, was nicht das Ziel ist).
Sie können die Platzierung beeinflussen, indem Sie die Schritte des Algorithmus nach Belieben anpassen. Beispielsweise können Sie Ihre Vermutungen an den Rändern beginnen und nach innen bewegen, den Pinsel ziehen, um Linien für jede Vermutung zu erstellen, oder zunächst dunkle Farben malen. Sie können auf vorherige Iterationsbilder (aber nicht auf das Quellbild) verweisen, um die nächste gewünschte Bewegung zu berechnen. Diese können einschränkend sein, wie Sie möchten (dh nur innerhalb des oberen linken Quadranten für die aktuelle Iteration raten).
Das Maß für die "Differenz" zwischen dem Quellbild und der aktuellen Iteration kann nach Belieben gemessen werden, sofern keine anderen möglichen Bewegungen berechnet werden, um festzustellen, ob diese Bewegung als die "beste" angesehen wird. Es sollte nicht wissen, ob die aktuelle Bewegung die "beste" ist, sondern nur, ob sie innerhalb der Toleranz der Akzeptanzkriterien liegt. Zum Beispiel kann es so einfach sein wie
abs(src.R - current.R) + abs(src.G - current.G) + abs(src.B - current.B)
für jedes betroffene Pixel oder eine der bekannten Farbdifferenztechniken .
Palette
Sie können die Palette als 28x1-Bild herunterladen oder direkt im Code erstellen.
Bürste
Der Pinsel ist ein 4x4-Quadrat ohne Ecken. Dies ist eine skalierte Version davon:
(Ihr Code muss die 4x4-Version verwenden)
Beispiel
Eingang:
Ausgabe:
Sie können sehen, wie der grundlegende Algorithmus in einem kurzen Video fortschreitet, das ich gemacht habe (jedes Bild besteht aus 500 Iterationen): The Starry Night . Die ersten Phasen sind interessant zu beobachten:
quelle
Antworten:
JavaScript
Diese Lösung verwendet das Canvas-Element HTML5 zum Extrahieren der Bilddaten, ohne dass HTML verwendet werden muss. Dies bedeutet, dass es in Ihrer Konsole ausgeführt werden kann. Es greift auf das Farbpalettenbild als Array zu. Ich habe alle Farben des Palettenbildes in einem Array gespeichert. Es wird an die Konsole ausgegeben (nachdem es beendet wurde) und das Ergebnis in einer Variablen gespeichert.
Die aktuellste Version des Codes ist in der Geige . Die Geige verwendet auch einen besseren Algorithmus, um das Bildrauschen zu reduzieren. Die Verbesserung des Algorithmus besteht hauptsächlich darin, eine Funktion (max bis min) festzulegen, die die Auswahl der inversen Farbe bewirkt.
Code in Form des MS Paint Icon! (formatierter Code in Fiddle oder Stack Snippet)
Verwendungszweck:
Geige .
Die Geige verwendet crossorigin.me, so dass Sie sich nicht um die gemeinsame Nutzung von Ursprungsressourcen kümmern müssen.
Ich habe auch die Geige aktualisiert, sodass Sie einige Werte anpassen können, um das bestaussehende Gemälde zu erhalten. Die Farben einiger Bilder sind möglicherweise deaktiviert. Um dies zu vermeiden, passen Sie die accept_rate an, um den Algorithmus anzupassen. Eine niedrigere Zahl bedeutet bessere Verläufe, eine höhere Zahl führt zu schärferen Farben.
Hier ist die Geige als Stack-Snippet (NICHT aktualisiert, falls die Geige nicht funktioniert):
Code-Snippet anzeigen
Zum Gedenken an New Horizons Vorbeiflug an Pluto habe ich ein Bild von Pluto eingegeben:
Für das Folgende habe ich es so eingestellt, dass sie dem Original so nahe wie möglich kommen:
Ich habe dies mit dem Standard-Hintergrundbild von OS X Yosemite ausgeführt. Nach einer Weile sind die Ergebnisse absolut umwerfend. Die Originaldatei war riesig (26 MB), daher habe ich sie in der Größe geändert und komprimiert:
Die sternenklare Nacht ( für bessere Ergebnisse habe ich ein Bild mit höherer Auflösung verwendet )
Ein Bild, das ich bei Google gefunden habe:
quelle
JavaScript + HTML
Zufällig:
Zufälliger Punkt
Zufällig ausgerichtet:
Unterteilt die Leinwand in 4x4-Quadrate und wählt einen Punkt zufällig innerhalb eines der Quadrate. Offsets verschieben das Gitter, so dass Sie die kleinen Lücken füllen können.
Schleife:
Erstellt ein Raster und durchläuft alle Punkte. Offsets verschiebt das Gitter. Der Abstand bestimmt die Größe jeder Zelle. (Sie beginnen sich zu überlappen)
Farblicher Unterschied:
RGB:
HSL:
HSV:
quelle
document.cookie
(nach 1000 Iterationen), da das Dokument in einer Sandbox gespeichert ist. Ist der Cookie notwendig?doThing
anstatt aufloop
. Vielleicht ist die Geschwindigkeitssteigerung die zusätzliche Linie wert ...C # (Referenzimplementierung)
Dies ist der Code, der zum Generieren der Bilder in der Frage verwendet wird. Ich dachte, es wäre nützlich, einigen Leuten eine Referenz für die Organisation ihres Algorithmus zu geben. Bei jeder Bewegung werden eine völlig zufällige Koordinate und Farbe ausgewählt. Die Leistung ist überraschend gut, wenn man die Einschränkungen berücksichtigt, die durch die Pinselgröße / Akzeptanzkriterien auferlegt werden.
Ich verwende den CIEDE2000-Algorithmus zum Messen von Farbunterschieden aus der Open Source-Bibliothek ColorMine . Dies sollte (aus menschlicher Sicht) zu genaueren Farbübereinstimmungen führen, bei dieser Palette scheint es jedoch keinen merklichen Unterschied zu geben.
Anschließend können Sie eine Reihe von Bildern (wie z. B. mein Video) generieren, indem Sie eine Instanz auf ähnliche Weise wie im folgenden Code aufrufen (Optimierung basierend auf der Anzahl der gewünschten Iterationen / Frames / Namen). Das erste Argument ist der Dateipfad zum Quellbild, das zweite Argument der Dateipfad zur Palette (in der Frage verlinkt) und das dritte Argument der Dateipfad für Ausgabebilder.
Ich habe online nach farbenfrohen Leinwandbildern gesucht und bin auf die folgenden Bilder gestoßen, die großartige (komplizierte) Testbilder zu sein scheinen. Alle Urheberrechte liegen bei ihren jeweiligen Eigentümern.
Quelle
Quelle
Quelle
quelle
JavaScript-Zeichenfläche
Aktualisieren
Hervorragende Vorschläge in den Kommentaren. Es ist jetzt schneller und verlangsamt die Benutzeroberfläche nicht!
quelle
Mathematica
Es ist zwar nicht wirklich so schnell, aber es macht zumindest vage erkennbare Bilder, also bin ich glücklich.
Ausgabe:
Die Ausgabe könnte mit mehr Iterationen wahrscheinlich ein bisschen besser sein, und es gibt immer noch eine Menge, die ich versuchen kann, sie zu beschleunigen / die Konvergenz zu verbessern, aber im Moment scheint dies gut genug zu sein.
quelle
SmileBASIC
MSPAINT- Bild% [] , Breite% , Höhe% , Schritte% OUT- Ausgabe% []
quelle