Question

    

Cette question a déjà une réponse ici:

         

Say n = 100; Comment puis-je générer 100 couleurs visuellement distinctes? Est-ce possible mathématiquement?

Était-ce utile?

La solution

100 est beaucoup de couleurs, mais vous pourriez être en mesure de le faire en les distribuant aussi peu que possible dans le HSB ou l'espace HSL; faire en RGB est probablement difficile.

Par exemple, vous pouvez décider d'utiliser 10 teintes différentes, 4 niveaux de saturation, et 3 différents réglages de luminosité, qui vous donnera jusqu'à 120 couleurs. Vous devrez choisir les valeurs de saturation et de luminosité avec soin; les yeux humains sont des capteurs compliqués et confus. Si vous traitez l'espace de couleur comme un cône, vous voudrez probablement un nombre différent de teintes à chaque légèreté / niveau de saturation.

Voici un lien vers le wikipedia entrée sur HSB.

Autres conseils

Oui. La définition distincte est un produit de reporter à une espace de couleur alors quand nous disons au maximum des couleurs distinctes ce que nous voulons dire est des couleurs qui sont aussi loin de toutes les autres couleurs possibles. Mais depuis l'espace couleur ne change pas la réponse ne va pas changer. Et la mise en œuvre quelque chose qui correspond mieux aux yeux de l'homme et la façon dont les yeux humains voient la couleur comme CIE-Lab distance de couleur DE2000 fait refaire tous les calculs dur, mais fait une liste statique facile. Voici 128 entrées.

private static final String[] indexcolors = new String[]{
        "#000000", "#FFFF00", "#1CE6FF", "#FF34FF", "#FF4A46", "#008941", "#006FA6", "#A30059",
        "#FFDBE5", "#7A4900", "#0000A6", "#63FFAC", "#B79762", "#004D43", "#8FB0FF", "#997D87",
        "#5A0007", "#809693", "#FEFFE6", "#1B4400", "#4FC601", "#3B5DFF", "#4A3B53", "#FF2F80",
        "#61615A", "#BA0900", "#6B7900", "#00C2A0", "#FFAA92", "#FF90C9", "#B903AA", "#D16100",
        "#DDEFFF", "#000035", "#7B4F4B", "#A1C299", "#300018", "#0AA6D8", "#013349", "#00846F",
        "#372101", "#FFB500", "#C2FFED", "#A079BF", "#CC0744", "#C0B9B2", "#C2FF99", "#001E09",
        "#00489C", "#6F0062", "#0CBD66", "#EEC3FF", "#456D75", "#B77B68", "#7A87A1", "#788D66",
        "#885578", "#FAD09F", "#FF8A9A", "#D157A0", "#BEC459", "#456648", "#0086ED", "#886F4C",

        "#34362D", "#B4A8BD", "#00A6AA", "#452C2C", "#636375", "#A3C8C9", "#FF913F", "#938A81",
        "#575329", "#00FECF", "#B05B6F", "#8CD0FF", "#3B9700", "#04F757", "#C8A1A1", "#1E6E00",
        "#7900D7", "#A77500", "#6367A9", "#A05837", "#6B002C", "#772600", "#D790FF", "#9B9700",
        "#549E79", "#FFF69F", "#201625", "#72418F", "#BC23FF", "#99ADC0", "#3A2465", "#922329",
        "#5B4534", "#FDE8DC", "#404E55", "#0089A3", "#CB7E98", "#A4E804", "#324E72", "#6A3A4C",
        "#83AB58", "#001C1E", "#D1F7CE", "#004B28", "#C8D0F6", "#A3A489", "#806C66", "#222800",
        "#BF5650", "#E83000", "#66796D", "#DA007C", "#FF1A59", "#8ADBB4", "#1E0200", "#5B4E51",
        "#C895C5", "#320033", "#FF6832", "#66E1D3", "#CFCDAC", "#D0AC94", "#7ED379", "#012C58"
};

Voici la première 256 comme une image.

distance maximale

(de gauche à droite,) (du haut vers le bas). Vous pourriez être en mesure si vous avez fait que chaque couleur était aussi égale que possible pour obtenir quelques couleurs plus distinctes dans le colorspace. Cette table de consultation prend chaque couleur supplémentaire au maximum distincte de toutes les couleurs précédentes plutôt que de désigner la N au début, puis cartographier le colorspace. Alors oui, la force brute et un algorithme de dsitance couleur de haut niveau et que vous êtes prêt à faire ce même jeu de couleurs vous-même. Au cours d'une journée ou plus.

Edit:

Je n'ai aucune expertise dans ce domaine et mes compétences en mathématiques sont assez moyen. Mais je suis de l'avis que la solution à ce problème est plus complexe et intéressant que beaucoup de réponses ici suggèrent, depuis que j'essayé de faire quelque chose de similaire récemment et n'a pas trouvé une solution.

Différence couleur

La perception de la couleur est bien sûr subjective, mais il y a un accord significatif entre les humains. Par exemple, nous pouvons tous convenir que le rouge, le vert et le bleu sont des couleurs très différentes, et même les gens daltoniens d'accord que le noir et blanc sont très différents.

RGB

La représentation la plus courante de couleur dans des systèmes informatiques est le vecteur (r, g, b) qui suggère une fonction simple de la distance comme

différence de couleur RVB

permet de définir l'intervalle de r , g et b [0, 1] et voir comment cela fonctionne:

  1. Rouge (1, 0, 0) et rouge (1, 0, 0) a la distance de 0 , qui devrait être évident
  2. Red (1, 0, 0) et jaune (1, 1, 0) a la distance de 1 , qui est plus petite que la distance de
  3. Red (1, 0, 0) et bleu (0, 0, 1) qui est sqrt (2) , qui est plausible

Jusqu'à présent, si bon. Le problème est cependant que le bleu et le rouge ont la même distance 1 noir (0, 0, 0) , mais quand on regarde l'image cela ne semble pas tenir vrai:

bleu et rouge sur fond noir

En outre jaune (1, 1, 0) et magenta (1, 0, 1) ont tous deux ont la même distance 1 blanc (1, 1, 1) , qui ne semble pas logique soit:

jaune et magenta sur blanc

HSL et HSV

Je pense qu'il est sûr de supposer que des mesures analogiques pour le ont les mêmes problèmes. Ces schémas de couleurs ne sont pas conçus pour comparer la couleur.

CIEDE2000

Heureusement, il y a des scientifiques qui tentent déjà de trouver une bonne façon de comparer les couleurs. Ils sont venus avec des méthodes élaborées, le dernier étant CIEDE2000

CIEDE2000

(la formule complète décrite dans l'article est énorme )

Cette mesure prend la perception humaine en considération, comme le fait que nous semblons incapables de discerner les nuances de bleu très bien. Je dirais donc que nous utilisons ce que notre fonction de différence de couleur.

La couleur Choisir l'algorithme

solution Naive

Quelques réponses ont suggéré l'algorithme suivant

colors = []
for n in range(n):
    success=False
    while not success:
        new_color = random_color()
        for color in colors:
            if distance(color, new_color)>far_enough:
                colors.append(new_color)
                success = True
                break

Cet algorithme a quelques problèmes:

  1. L'espacement des couleurs est pas optimale. Si l'on imagine les couleurs pour être comme les numéros sur une ligne, trois chiffres ce seraient espacés comme optimale:

    | a ----- ----- b c |

    emballage un seul numéro supplémentaire sans bouger a, b, et c est bien pire que réaligner toutes les couleurs.

  2. L'algorithme n'est pas garanti de mettre fin . Que faire s'il n'y a pas de couleur qui est assez loin de former les couleurs existantes dans la liste? La boucle sera toujours

solution appropriée

Et bien .. Je n'ai pas.

Vous voulez convertir HSL et itérer ensuite à travers les valeurs de la teinte (H), tout en maintenant les 2 autres valeurs constantes.

Pour chaque valeur que vous convertir HSL Retour au RVB .

Voir mes réponses ici et .

Si votre N est très grand et par conséquent, les couleurs ne sont pas, vous pouvez visuellement distincte à ce moment Réitérons sur toutes les mêmes teintes et changer les autres composants pour faire varier la saturation ou la luminosité. Donc, fondamentalement, vous pourriez avoir un nombre maximum de valeurs de teinte à utiliser, et une fois qui est touché, vous pouvez recommencer avec une saturation ou luminosité différente.

Pas une réponse à votre question, mais, si n a une valeur maximale et votre application le permet, vous pouvez utiliser une liste prédéfinie de couleurs comme ceci:

http://en.wikipedia.org/wiki/List_of_colors

L'un des avantages est que vous pouvez afficher un nom de couleur lisible dans une qu'humainement infobulle pour les personnes atteintes de daltonisme.

Pour commencer, ne pas utiliser l'espace RVB; il est difficile de trouver un pire espace couleur pour ce problème. (Selon que vous utilisez les couleurs pour l'affichage ou pour l'impression que vous avez soit un très grand nombre de couleurs impossibles à distinguer près de noir ou blanc près.)

Si vous utilisez l'espace de laboratoire, il existe des modèles de couleur perceptuelles (CIE 1996? Et CIE 2000) pour mesurer la proximité visuelle des couleurs (pour l'impression et l'affichage respectivement).

Vous ne dites pas si vous allez calculer les couleurs une fois et stocker le résultat, ou si elles doivent être recalculée à la volée (et dans ce cas, si elle doit être déterministe ou non). Il est évident que toute discussion sur la meilleure façon de générer l'ensemble dépendra de cela.

Bien que je suggère que Répartir également les axes de l'espace de couleur (par exemple en 8) et en utilisant les comme points de départ serait beaucoup plus efficace que tout processus aléatoire. Certes, il vous suffit de comparer tout point à ses voisins (et seulement s'ils sont déjà dans le jeu), ce qui vous permettra d'économiser un grand nombre de comparaisons.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top