MS Paint perdait toujours beaucoup de temps, mais la plupart des graphistes l’évitaient. Peut-être les gens ont-ils perdu tout intérêt en raison de la palette de couleurs discordante ou des niveaux d'annulation réduits. Quoi qu'il en soit, il est toujours possible de générer de belles images avec uniquement le pinceau standard et la palette de couleurs par défaut.
Défi
En utilisant uniquement le pinceau par défaut (un carré 4x4 sans coins) et la palette de couleurs par défaut (les 28 couleurs ci-dessous), essayez de reproduire une image source à l'aide d'une technique basée sur l'ascension stochastique de collines .
Algorithme
Chaque réponse doit suivre le même algorithme de base (colline stochastique). Les détails peuvent être modifiés à chaque étape. Un mouvement est considéré comme un trait de pinceau (c.-à-d. Un clic dans la peinture).
- Devinez le (s) prochain (s) mouvement (s). Faites une estimation (des coordonnées et des couleurs) pour le (s) prochain (s) mouvement (s) comme vous le souhaitez. Cependant, la supposition ne doit pas faire référence à l'image source.
- Appliquez la conjecture. Appliquez le pinceau sur le tableau pour réaliser le (s) mouvement (s).
- Mesurer le bénéfice du (des) mouvement (s). En référençant l'image source, déterminez si le ou les mouvements ont été bénéfiques pour la peinture (c'est-à-dire que la peinture ressemble davantage à l'image source). Si cela vous est bénéfique, conservez le ou les mouvements, sinon mettez-les au rebut.
- Répétez jusqu'à la convergence. Passez à l'étape 1 et essayez de deviner jusqu'à ce que l'algorithme ait suffisamment convergé. La peinture devrait fortement ressembler à l'image source à ce stade.
Si votre programme ne correspond pas à ces quatre étapes, il ne s'agit probablement pas d'une ascension stochastique. J'ai qualifié cela de concours de popularité, car l'objectif est de produire des algorithmes de peinture intéressants basés sur une palette de couleurs et un pinceau limités.
Contraintes
- L'algorithme devrait être stochastique d'une certaine manière.
La prochaine estimation ne devrait pas être influencée par l'image source. Vous devinez chaque nouveau mouvement et vérifiez ensuite si cela vous a aidé ou non. Par exemple, vous n'êtes pas autorisé à déterminer où placer le pinceau en fonction des couleurs de l'image source (ce qui revient au tramage de l'image source, ce qui n'est pas l'objectif).
Vous pouvez influencer le placement en modifiant les étapes de l'algorithme comme bon vous semble. Par exemple, vous pouvez commencer vos suppositions par les bords et vous déplacer vers l'intérieur, faites glisser le pinceau pour créer des lignes pour chaque estimation ou décidez de peindre d'abord des couleurs sombres. Vous êtes autorisé à référencer les images d'itération précédentes (mais pas l'image source) afin de calculer le mouvement souhaité suivant. Celles-ci peuvent être restrictives à votre guise (c.-à-d. Ne faire des suppositions que dans le quadrant supérieur gauche pour l'itération en cours).
La mesure de la "différence" entre l'image source et l'itération actuelle peut être mesurée comme vous le souhaitez, tant qu'elle ne calcule pas les autres mouvements potentiels pour déterminer si ce mouvement est considéré comme "optimal". Il ne devrait pas savoir si le mouvement actuel est le "meilleur", mais s'il correspond à la tolérance des critères d'acceptation. Par exemple, cela peut être aussi simple que
abs(src.R - current.R) + abs(src.G - current.G) + abs(src.B - current.B)
pour chaque pixel affecté, ou n’importe laquelle des techniques de différence de couleur bien connues .
Palette
Vous pouvez télécharger la palette sous forme d'image 28x1 ou la créer directement dans le code.
Brosse
Le pinceau est un carré 4x4 sans coins. Ceci est une version réduite de celui-ci:
(Votre code doit utiliser la version 4x4)
Exemple
Contribution:
Sortie:
Vous pouvez voir comment l'algorithme de base progresse dans une courte vidéo que j'ai faite (chaque image représente 500 itérations): La nuit étoilée . Les premières étapes sont intéressantes à regarder:
la source
Réponses:
JavaScript
Cette solution utilise l'élément de canevas HTML5 pour extraire les données d'image, mais sans la nécessité d'utiliser HTML, cela signifie qu'elle peut être exécutée dans votre console. Il accède à l'image de la palette de couleurs sous forme de tableau; J'ai stocké toutes les couleurs de l'image de la palette dans un tableau). Il envoie la sortie à la console (à la fin) et stocke également le résultat dans une variable.
La version la plus récente du code est dans le violon . Le violon utilise également un meilleur algorithme pour réduire le bruit dans les images. L’amélioration de l’algorithme consiste principalement à fixer une fonction (max à min) qui a entraîné le choix de la couleur inverse.
Code sous la forme de l'icône MS Paint! (code formaté dans Fiddle ou Stack Snippet)
Usage:
Violon .
Le violon utilise crossorigin.me , vous n'avez donc pas à vous soucier du partage des ressources entre origines.
J'ai également mis à jour le violon afin que vous puissiez ajuster certaines valeurs pour produire la plus belle peinture. Certaines couleurs des images peuvent être désactivées, pour éviter cela, ajustez accept_rate pour ajuster l'algorithme. Un nombre plus bas signifie de meilleurs gradients, un nombre plus élevé donnera des couleurs plus nettes.
Voici le violon sous forme d'extrait de pile (NON mis à jour, au cas où le violon ne fonctionnerait pas):
Afficher l'extrait de code
Pour commémorer le survol de New Horizon par Pluton, j'ai introduit une image de Pluton:
Pour les suivants, je l’ai défini de manière à ce qu’ils ressemblent le plus fidèlement possible à l’original:
Je l'ai couru avec le papier peint par défaut d'OS X Yosemite. Après l'avoir laissé fonctionner un peu, les résultats sont absolument stupéfiants. Le fichier d'origine était énorme (26 Mo) alors je l'ai redimensionné et compressé:
La nuit étoilée (j'ai utilisé une image de résolution supérieure pour de meilleurs résultats)
Une image que j'ai trouvée sur google:
la source
JavaScript + HTML
Aléatoire:
Point aléatoire
Aléatoire Aligné:
Subdivise la toile en carrés 4x4 et choisit un point au hasard dans l’un des carrés. Les décalages déplacent la grille afin que vous puissiez combler les petits trous.
Boucle:
Crée une grille et passe en boucle à travers tous les points. Les décalages déplacent la grille. L'espacement détermine la taille de chaque cellule. (Ils vont commencer à se chevaucher)
Différence de couleur:
RVB:
HSL:
HSV:
la source
document.cookie
(après 1000 itérations) car le document est mis en bac à sable. Le cookie est-il nécessaire?doThing
au lieu deloop
. Vous pourriez trouver l'augmentation de la vitesse de la ligne supplémentaire ...C # (implémentation de référence)
C'est le code utilisé pour générer les images dans la question. J'ai pensé qu'il serait utile de donner à certaines personnes une référence pour organiser leur algorithme. Une coordonnée et une couleur complètement aléatoires sont sélectionnées à chaque mouvement. Il fonctionne étonnamment bien compte tenu des limites imposées par la taille de la brosse / les critères d'acceptation.
J'utilise l'algorithme CIEDE2000 pour mesurer les différences de couleur, à partir de la bibliothèque open source ColorMine . Cela devrait donner des couleurs plus proches (du point de vue humain), mais cela ne semble pas être une différence notable lorsqu'il est utilisé avec cette palette.
Ensuite, vous pouvez générer une série d’images (comme ma vidéo) en appelant une instance de la même manière que le code ci-dessous (ajustement en fonction du nombre d’itérations / images / nom souhaité). Le premier argument est le chemin du fichier vers l'image source, le deuxième argument est le chemin du fichier vers la palette (lié dans la question) et le troisième argument est le chemin du fichier pour les images en sortie.
J'ai cherché des peintures sur toile colorées en ligne et suis tombé sur les images ci-dessous, qui semblent être d'excellentes images de test (compliquées). Tous les droits d'auteur appartiennent à leurs propriétaires respectifs.
La source
La source
La source
la source
Toile javascript
Mise à jour
Excellentes suggestions dans les commentaires. C'est maintenant plus rapide et ne ralentit pas l'interface utilisateur!
la source
Mathematica
Ce n'est pas si rapide que ça, mais au moins, cela donne des images vaguement reconnaissables, alors je suis heureux.
Sortie:
La sortie pourrait probablement être un peu meilleure avec plus d'itérations, et il y a encore beaucoup de choses que je peux essayer d'accélérer / améliorer la convergence, mais pour le moment, cela semble suffisant.
la source
SmileBASIC
MSPAINT image% [] , largeur% , hauteur% , pas% sortie OUT % []
la source