Die Farbe an den Wänden in meinem Zimmer hat eine zufällige, fast fraktale, dreidimensionale Textur:
In dieser Herausforderung werden Sie ein Programm schreiben, das zufällige Bilder erzeugt, die aussehen, als könnten sie Teil meiner Wände sein.
Unten habe ich 10 Bilder von verschiedenen Stellen an meinen Wänden gesammelt. Alle haben ungefähr die gleiche Beleuchtung und alle wurden mit der Kamera einen Fuß von der Wand entfernt aufgenommen. Die Ränder wurden gleichmäßig auf 2048 x 2048 Pixel beschnitten und dann auf 512 x 512 skaliert. Das obige Bild ist Bild A.
Dies sind nur Vorschaubilder, klicken Sie auf die Bilder, um sie in voller Größe anzuzeigen!
Ihre Aufgabe ist es, ein Programm zu schreiben, das eine positive ganze Zahl von 1 bis 2 16 als zufälligen Startwert aufnimmt und für jeden Wert ein bestimmtes Bild erzeugt, das aussieht, als hätte es das "elfte Bild" meiner Wand sein können. Wenn jemand, der sich meine 10 Bilder und einige von Ihnen ansieht, nicht wissen kann, welche computergeneriert wurden, dann haben Sie es sehr gut gemacht!
Führen Sie einige Ihrer generierten Bilder vor, damit die Betrachter sie sehen können, ohne den Code ausführen zu müssen.
Mir ist klar, dass die Beleuchtung in meinen Bildern in Bezug auf Intensität oder Farbe nicht perfekt gleichmäßig ist. Das tut mir leid, aber es ist das Beste, was ich ohne eine bessere Beleuchtung tun kann. Ihre Bilder müssen nicht variabel beleuchtet sein (obwohl dies möglich ist). Die Textur ist das Wichtigste, worauf es ankommt.
Einzelheiten
- Sie können Bildverarbeitungstools und -bibliotheken verwenden.
- Nehmen Sie die Eingabe wie gewünscht vor (Befehlszeile, stdin, offensichtliche Variable usw.).
- Das Ausgabebild kann in jedem gängigen verlustfreien Bilddateiformat oder einfach in einem Fenster / Browser angezeigt werden.
- Sie können meine 10 Bilder programmgesteuert analysieren, aber nicht davon ausgehen, dass jeder, der Ihren Code ausführt, Zugriff darauf hat.
- Sie müssen die Bilder programmgesteuert generieren. Möglicherweise haben Sie eine geringfügige Variante eines meiner Bilder oder eines anderen Archivbilds nicht fest codiert. (Die Leute würden dich sowieso dafür ablehnen.)
- Sie können integrierte Pseudozufallszahlengeneratoren verwenden und davon ausgehen, dass die Periode 2 16 oder mehr beträgt .
Wertung
Dies ist ein Beliebtheitswettbewerb, bei dem die am höchsten bewertete Antwort gewinnt.
quelle
Antworten:
GLSL (+ JavaScript + WebGL)
Live-Demo | GitHub-Repository
Wie benutzt man
Laden Sie die Seite neu, um ein neues zufälliges Bild zu erhalten. Wenn Sie einen bestimmten Startwert eingeben möchten, öffnen Sie die Konsole Ihres Browsers und rufen Sie auf
drawScreen(seed)
. Die Konsole sollte den bei Belastung verwendeten Startwert anzeigen.Ich habe dies auf vielen Plattformen nicht wirklich getestet. Lassen Sie mich wissen, wenn es bei Ihnen nicht funktioniert. Natürlich muss Ihr Browser WebGL unterstützen. Fehler werden entweder in der linken Spalte oder in der Browserkonsole angezeigt (abhängig von der Art des Fehlers).
Neu: Sie können die Wände jetzt ein wenig zum Leben erwecken, indem Sie das Kontrollkästchen "Bewegliche Lichtquelle" aktivieren.
Was ist das für eine Zauberei?
Ich habe diesen WebGL-Code in meinem GitHub-Konto , den ich gelegentlich verwende , um schnell einige 2D-Grafiksachen in WebGL zu prototypisieren. Mit etwas Shader-Magie können wir es auch leicht dreidimensional wirken lassen, daher dachte ich, das wäre der schnellste Weg, um ein paar nette Effekte in Gang zu bringen. Der Großteil des Setups stammt aus diesem Code, und ich denke, dass es sich um eine Bibliothek für diese Einreichung handelt, die in diesem Beitrag nicht enthalten ist. Wenn Sie interessiert sind, schauen Sie sich die Datei main.js auf GitHub (und die anderen Dateien in diesem Ordner) an.
Alles, was Sie mit JavaScript tun müssen, ist, einen WebGL-Kontext einzurichten, den Startwert in einer Uniform für den Shader zu speichern und dann ein einzelnes Quad über den gesamten Kontext zu rendern. Der Vertex-Shader ist ein einfacher Passthrough-Shader, sodass die ganze Magie im Fragment-Shader abläuft. Deshalb habe ich dies eine GLSL-Einreichung genannt.
Der größte Teil des Codes besteht darin, das Simplex-Rauschen zu erzeugen, das ich auf GitHub gefunden habe . Also lasse ich das auch in der Code-Auflistung unten weg. Der wichtige Teil ist, dass eine Funktion definiert wird,
snoise(vec2 coords)
die Simplex-Rauschen ohne Verwendung einer Textur oder eines Array-Lookups zurückgibt. Es ist überhaupt nicht geimpft, daher besteht der Trick, um ein anderes Geräusch zu erhalten, darin, den Keim zu verwenden, um zu bestimmen, wo die Suche durchgeführt werden soll.Also los geht's:
Das ist es. Ich könnte morgen eine Erklärung hinzufügen, aber die Grundidee ist:
tanh
nach oben abzugleichen.quelle
Mathematica Spackling
Die App unten wendet Speckling auf ein zufälliges Bild an. Wenn Sie auf "Neuer Patch" klicken, wird ein neues zufälliges Bild erstellt, mit dem Sie arbeiten können, und die Effekte werden entsprechend den aktuellen Einstellungen angewendet. Die Effekte sind Ölgemälde, Gauß-Filter, Posterisierung und Prägung. Jeder Effekt kann unabhängig eingestellt werden. Der Startwert für den Zufallszahlengenerator kann eine beliebige Ganzzahl von 1 bis 2 ^ 16 sein.
Update : Der Gauß-Filter, der die Kanten weicher macht, ist jetzt der letzte angewendete Bildeffekt. Mit dieser Modifikation wurde der Posterisierungseffekt nicht mehr benötigt und somit entfernt.
Erläuterung
Die Erklärung basiert auf einer etwas anderen Version, in der die Posterisierung angewendet und
GaussianFilter
früh angewendet wurde. Es dient jedoch weiterhin zur Verdeutlichung, wie jeder Bildeffekt ein Bild verändert. Das Endergebnis ist eine Farbtextur mit schärferen Kanten. Wenn der Gauß-Filter erst am Ende angewendet wird, wird das Ergebnis glatter, wie das obige Bild zeigt.Schauen wir uns nacheinander einige Bildeffekte an.
Erzeugen Sie ein Startbild.
Lena wird uns zeigen, wie jeder Bildeffekt ein lebensechtes Bild verwandelt.
Ein Ölgemäldeeffekt auf Lena.
Ein Ölgemäldeeffekt, der auf unser zufälliges Bild angewendet wird. Der Effekt wurde verstärkt (16 statt 8).
Ein Gauß-Filtereffekt, der auf Lena angewendet wurde (nicht auf die Ölgemälde-Effektversion von Lena). Der Radius beträgt 10 Pixel. (In der endgültigen Version oben in diesem Eintrag wird GaussianFilter als endgültiger Effekt angewendet.)
Ein etwas milderer Gauß-Filtereffekt wurde auf r1 angewendet. Der Radius beträgt 5 Pixel.
Ein intensiver Posterisierungseffekt auf Lena. (In der endgültigen Version der App habe ich die Posterisierung entfernt. Wir werden sie jedoch in der Analyse belassen, da die Beispiele in der Analyse auf einer früheren Version mit Posterisierung basierten.)
Ein Posterisierungseffekt, der auf r2 angewendet wird.
Prägung Lena
Die Prägung r3 vervollständigt die Bildverarbeitung. Dies soll so etwas wie die Obergrenze des OP aussehen.
Für die Neugierigen ist hier Lena mit den gleichen Bildeffekten angewendet.
quelle
RandomInteger
ein Saatgut füttern und so eine bestimmte Leistung garantieren. Oder meinen Sie etwas anderes, wie ein nicht zufälliges Startbild, auf das Effekte angewendet werden?Lena will show us how each image effect transforms a life-like picture
mich LOL gemacht hat. Das Seltsame ist, dass auf dem letzten Lena-Bild ein Azteke oder Inka zu sehen ist, der einen Kopfschmuck trägt und einen Zweig wie eine Waffe weilded.POV-Ray
Viel Golfpotential, mit dem man laufen kann
povray /RENDER wall.pov -h512 -w512 -K234543
Zuerst wird eine zufällige Textur erstellt, aber statt dort anzuhalten, wird die Textur in ein 3D-Höhenfeld umgewandelt, um die radialen Schatten des Kamerablitzes realistischer zu machen. Und für ein gutes Maß fügt es eine weitere Textur von kleinen Beulen hinzu.
Abgesehen von der Hardcodierung des Zufallskeims besteht der einzige Weg darin, die
clock
für Animationen vorgesehene Variable zu verwenden. Dies wird mit dem-K{number}
Flag übergebenquelle