J'ai écrit les deux méthodes ci-dessous pour sélectionner automatiquement N couleurs distinctes. Il fonctionne en définissant une fonction linéaire par morceaux sur le cube RVB. L'avantage est que vous pouvez également obtenir une échelle progressive si c'est ce que vous voulez, mais lorsque N devient grand, les couleurs peuvent commencer à ressembler. Je peux également imaginer subdiviser uniformément le cube RVB en un treillis puis dessiner des points. Quelqu'un connaît-il d'autres méthodes? J'écarte la possibilité de définir une liste, puis de la parcourir. Je dois également dire que je ne m'inquiète généralement pas s'ils s'affrontent ou ne sont pas beaux, ils doivent simplement être visuellement distincts.
public static List<Color> pick(int num) {
List<Color> colors = new ArrayList<Color>();
if (num < 2)
return colors;
float dx = 1.0f / (float) (num - 1);
for (int i = 0; i < num; i++) {
colors.add(get(i * dx));
}
return colors;
}
public static Color get(float x) {
float r = 0.0f;
float g = 0.0f;
float b = 1.0f;
if (x >= 0.0f && x < 0.2f) {
x = x / 0.2f;
r = 0.0f;
g = x;
b = 1.0f;
} else if (x >= 0.2f && x < 0.4f) {
x = (x - 0.2f) / 0.2f;
r = 0.0f;
g = 1.0f;
b = 1.0f - x;
} else if (x >= 0.4f && x < 0.6f) {
x = (x - 0.4f) / 0.2f;
r = x;
g = 1.0f;
b = 0.0f;
} else if (x >= 0.6f && x < 0.8f) {
x = (x - 0.6f) / 0.2f;
r = 1.0f;
g = 1.0f - x;
b = 0.0f;
} else if (x >= 0.8f && x <= 1.0f) {
x = (x - 0.8f) / 0.2f;
r = 1.0f;
g = 0.0f;
b = x;
}
return new Color(r, g, b);
}
java
colors
color-scheme
color-picker
emploi
la source
la source
Réponses:
Vous pouvez utiliser le modèle de couleur HSL pour créer vos couleurs.
Si tout ce que vous voulez, ce sont des teintes différentes (probablement) et de légères variations sur la luminosité ou la saturation, vous pouvez répartir les teintes comme suit:
la source
Cette question apparaît dans plusieurs discussions SO:
Différentes solutions sont proposées, mais aucune n'est optimale. Heureusement, la science vient à la rescousse
N arbitraire
Les 2 derniers seront gratuits via la plupart des bibliothèques / procurations universitaires.
N est fini et relativement petit
Dans ce cas, on pourrait opter pour une solution de liste. Un article très intéressant sur le sujet est disponible gratuitement:
Il y a plusieurs listes de couleurs à considérer:
J'ai également rencontré cette palette par un étudiant du MIT. Enfin, les liens suivants peuvent être utiles dans la conversion entre différents systèmes de couleurs / coordonnées (certaines couleurs dans les articles ne sont pas spécifiées en RVB, par exemple):
Pour la liste de Kelly et Boynton, j'ai déjà fait la conversion en RVB (à l'exception du blanc et du noir, ce qui devrait être évident). Du code C #:
Et voici les valeurs RVB en représentations hexadécimales et 8 bits par canal:
Pour tous les développeurs Java, voici les couleurs JavaFX:
ce qui suit est les couleurs kelly non triées selon l'ordre ci-dessus.
ce qui suit est les couleurs kelly triées selon les teintes (notez que certains jaunes ne sont pas très contrastés)
la source
Comme la réponse d'Uri Cohen, mais c'est un générateur à la place. Commencera par utiliser des couleurs très éloignées. Déterministe.
Échantillon, couleurs à gauche en premier:
la source
Voici une idée. Imaginez un cylindre HSV
Définissez les limites supérieure et inférieure souhaitées pour la luminosité et la saturation. Ceci définit un anneau de section carrée dans l'espace.
Maintenant, dispersez N points au hasard dans cet espace.
Appliquez ensuite un algorithme de répulsion itérative sur eux, soit pour un nombre fixe d'itérations, soit jusqu'à ce que les points se stabilisent.
Maintenant, vous devriez avoir N points représentant N couleurs qui sont à peu près aussi différentes que possible dans l'espace colorimétrique qui vous intéresse.
Hugo
la source
Pour le bien des générations à venir, j'ajoute ici la réponse acceptée en Python.
la source
Tout le monde semble avoir manqué l'existence de l'espace colorimétrique YUV très utile qui a été conçu pour représenter les différences de couleurs perçues dans le système visuel humain. Les distances en YUV représentent des différences de perception humaine. J'avais besoin de cette fonctionnalité pour MagicCube4D qui implémente des cubes Rubik à 4 dimensions et un nombre illimité d'autres puzzles sinueux 4D ayant un nombre arbitraire de visages.
Ma solution commence par sélectionner des points aléatoires dans YUV puis en décomposant de manière itérative les deux points les plus proches, et en ne convertissant en RVB qu'au retour du résultat. La méthode est O (n ^ 3) mais cela n'a pas d'importance pour les petits nombres ou ceux qui peuvent être mis en cache. Il peut certes être rendu plus efficace, mais les résultats semblent excellents.
La fonction permet de spécifier en option des seuils de luminosité afin de ne pas produire de couleurs dans lesquelles aucun composant n'est plus clair ou plus sombre que les quantités données. IE vous pouvez ne pas vouloir des valeurs proches du noir ou du blanc. Ceci est utile lorsque les couleurs résultantes seront utilisées comme couleurs de base qui seront ensuite ombrées via l'éclairage, la superposition, la transparence, etc. et doivent toujours apparaître différentes de leurs couleurs de base.
la source
Le modèle de couleurs HSL peut être bien adapté au "tri" des couleurs, mais si vous recherchez des couleurs visuellement distinctes, vous avez définitivement besoin d' un modèle de couleurs Lab à la place.
Une fois que vous savez cela, trouver le sous-ensemble optimal de N couleurs à partir d'une large gamme de couleurs reste un problème difficile (NP), un peu similaire au problème du voyageur de commerce et toutes les solutions utilisant des algorithmes k-mean ou quelque chose ne le seront pas vraiment Aidez-moi.
Cela dit, si N n'est pas trop grand et si vous commencez avec un ensemble limité de couleurs, vous trouverez facilement un très bon sous-ensemble de couleurs distinctes en fonction d'une distance Lab avec une simple fonction aléatoire.
J'ai codé un tel outil pour mon usage personnel (vous pouvez le trouver ici: https://mokole.com/palette.html ), voici ce que j'ai obtenu pour N = 7:
Tout est javascript alors n'hésitez pas à jeter un œil à la source de la page et à l'adapter à vos besoins.
la source
L
de 0 à 128 eta
etb
de -128 à 128. ¶ J'ai commencé avecL
= 0,a
= -128,b
= -128 qui est un bleu lumineux. Puis j'ai augmentéa
trois fois. ❶ Le grand changement (+128)a
= 50 donne un bleu légèrement plus foncé. ❷ (+85)a
= 85 résultats toujours en bleu. ❸ Cependant, le changement relativement faible (+43)a
= 128 change complètement la couleur en fuchsia.Voici une solution pour gérer votre problème "distinct", qui est entièrement exagéré:
Créez une sphère unitaire et déposez-y des points avec des charges répulsives. Exécutez un système de particules jusqu'à ce qu'elles ne bougent plus (ou que le delta soit "assez petit"). À ce stade, chacun des points est aussi éloigné l'un de l'autre que possible. Convertissez (x, y, z) en rgb.
Je le mentionne car pour certaines classes de problèmes, ce type de solution peut mieux fonctionner que la force brute.
J'ai vu cette approche à l'origine ici pour tesseler une sphère.
Encore une fois, les solutions les plus évidentes de traverser l'espace HSL ou l'espace RVB fonctionneront probablement très bien.
la source
J'essaierais de fixer la saturation et la lumination au maximum et de me concentrer uniquement sur la teinte. Comme je le vois, H peut passer de 0 à 255, puis s'enroule. Maintenant, si vous vouliez deux couleurs contrastées, vous prendriez les côtés opposés de cet anneau, c'est-à-dire 0 et 128. Si vous vouliez 4 couleurs, vous en prendriez séparées par 1/4 de la longueur 256 du cercle, soit 0, 64, 128, 192. Et bien sûr, comme d'autres l'ont suggéré lorsque vous avez besoin de N couleurs, vous pouvez simplement les séparer par 256 / N.
Ce que j'ajouterais à cette idée, c'est d'utiliser une représentation inversée d'un nombre binaire pour former cette séquence. Regarde ça:
... de cette façon, si vous avez besoin de N couleurs différentes, vous pouvez simplement prendre les premiers N nombres, les inverser, et vous obtenez autant de points éloignés que possible (pour N étant une puissance de deux) tout en préservant en même temps que chaque préfixe du la séquence diffère beaucoup.
C'était un objectif important dans mon cas d'utilisation, car j'avais un tableau où les couleurs étaient triées par zone couverte par cette couleur. Je voulais que les plus grandes zones du graphique aient un contraste important, et j'étais d'accord avec certaines petites zones pour avoir des couleurs similaires à celles du top 10, car il était évident pour le lecteur lequel est lequel en observant simplement la zone.
la source
getfracs
. Mais votre approche est rapide et « simple » dans les langages de bas niveau: peu de recul en C .Si N est assez grand, vous obtiendrez des couleurs similaires. Il n'y en a que beaucoup dans le monde.
Pourquoi ne pas simplement les répartir uniformément à travers le spectre, comme ceci:
Si vous souhaitez mélanger la séquence afin que des couleurs similaires ne soient pas côte à côte, vous pouvez peut-être mélanger la liste résultante.
Suis-je en train de penser cela?
la source
C'est trivial dans MATLAB (il y a une commande hsv):
la source
J'ai écrit un package pour R appelé qualpalr qui est spécialement conçu à cet effet. Je vous recommande de regarder la vignette pour savoir comment cela fonctionne, mais je vais essayer de résumer les principaux points.
qualpalr prend une spécification des couleurs dans l' espace colorimétrique HSL (qui a été décrit précédemment dans ce fil), la projette dans l'espace colorimétrique DIN99d (qui est perceptuellement uniforme) et trouve celle
n
qui maximise la distance minimale entre n'importe quelle d'entre elles.la source
Je pense que cet algorithme récursif simple complète la réponse acceptée, afin de générer des valeurs de teinte distinctes. Je l'ai fait pour hsv, mais peut également être utilisé pour d'autres espaces colorimétriques.
Il génère des teintes dans des cycles, aussi séparés que possible les uns des autres dans chaque cycle.
Je n'ai pas pu trouver ce type d'algorithme ici. J'espère que ça aide, c'est mon premier post ici.
la source
Cette fonction OpenCV utilise le modèle de couleurs HSV pour générer
n
des couleurs uniformément réparties autour de 0 <= H <= 360º avec un maximum S = 1.0 et V = 1.0. La fonction sort les couleurs BGR enbgr_mat
:la source