Répartissez les objets dans un cube afin qu'ils aient une distance maximale entre eux

11

J'essaie d'utiliser une caméra couleur pour suivre plusieurs objets dans l'espace. Chaque objet aura une couleur différente et afin de pouvoir bien distinguer chaque objet, j'essaie de m'assurer que chaque couleur assignée à un objet est aussi différente de n'importe quelle couleur sur n'importe quel autre objet que possible.

Dans l'espace RVB, nous avons trois plans, tous avec des valeurs comprises entre 0 et 255. Dans ce cube , je voudrais répartir les n couleurs afin qu'il y ait autant distance entre eux et les autres que possible. Une restriction supplémentaire est que ( 0 , 0 , 0 ) et ( 255 , 255 , 255 ) (ou le plus près possible) doivent être inclus dans le n(0,0,0)/(255,255,255)n(0,0,0)(255,255,255)ncouleurs, car je veux m'assurer qu'aucun de mes objets ne prend l'une ou l'autre couleur car l'arrière-plan sera probablement l'une de ces couleurs.(n2)

Probablement, (y compris le noir et le tout) ne dépassera pas 14 environ.n

Merci d'avance pour tous les conseils sur la façon d'obtenir ces couleurs.

Mat
la source
2
Je pense que vous ne devriez considérer qu'un espace à deux dimensions, car votre appareil photo ne sera probablement pas en mesure de distinguer les objets qui ont la même couleur mais des intensités différentes. Le problème est cependant intéressant.
Stéphane Gimenez
Les trois dimensions proviennent des trois plans de couleur: rouge, vert et bleu où ils peuvent chacun prendre indépendamment des valeurs de 0 à 255. Dans l'espace RVB, je ne pense pas qu'il y ait d'intensité. Il existe d'autres espaces colorimétriques qui pourraient être plus adaptés à cela car ils ne peuvent être que 2D, bien que je ne sache pas grand-chose à leur sujet.
Matt
Si vous pouvez contrôler avec précision la quantité de lumière projetée sur les objets, alors OK. Dans l'espace RVB (100, 100, 100) et (200, 200, 200) se trouvent ce que j'ai appelé la même couleur (gris) avec des intensités différentes.
Stéphane Gimenez
@Matt, Stéphane semble suggérer que vous utilisez un cube HSL ou HSV plutôt qu'un cube RVB. Les couleurs sont mappées, plus ou moins, mais vous pouvez alors ignorer le composant S pour une carte 2D. J'irais plus loin pour suggérer une échelle 1D sur H seul à un SV ou SL choisi qui garderait vos couleurs dans un "ton" esthétique similaire. L'algorithme de distribution égale sur 1D est aussi plus simple!
Jason Kleban
1
Oui, la distance maximale par paire. @ uosɐſ HSV semblait effectivement donner de meilleurs résultats que RVB. Même en utilisant les trois plans HSV, je pouvais mieux sélectionner les couleurs individuelles en fonction de la distance à chaque couleur idéale.
Matt

Réponses:

4

Toutes les couleurs seront à la surface du cube RVB, sauf erreur de ma part, pour la même raison que toute la charge électrique apparaît à la surface des conducteurs électriques. Cela suggère la méthode suivante pour déterminer les couleurs:

  • interpréter l'espace colorimétrique RVB comme un espace cartésien XYZ;
  • interpréter les couleurs candidates comme des particules chargées, par exemple des électrons;
  • trouver l'état de basse énergie du système par exemple par recuit simulé;

n15

Une fois que les particules convergent, vous disposez de l'arrangement des couleurs en interprétant les points comme des couleurs. Initialement, les particules peuvent être disposées de manière aléatoire sur la surface du cube, avec un peu d'espacement (ce qui contribue aux problèmes de convergence et de stabilité). Mettre de petits groupes sur les faces du cube devrait fonctionner.

Pour éviter de rester coincé dans un minimum local (plutôt que global), vous pouvez "pulser" un petit champ électrique aléatoire après la convergence et voir si le système revient à la même configuration, ou à une autre. Il est quelque peu improbable que des particules placées au hasard fassent cela dans ce scénario, mais c'est possible.

ÉDITER:

Comme indiqué dans les commentaires, l'hypothèse selon laquelle les solutions optimales ne devraient reposer que sur la surface ne s'applique probablement pas à toutes les géométries dans le cas discret.

Heureusement, cela a peu d'incidence sur le reste de la technique décrite ci-dessus. Les particules peuvent être initialement placées n'importe où; il suffit de laisser de la place entre des paires de particules pour la stabilité et la couverture, puis d'itérer le système jusqu'à la convergence, puis de pulser plusieurs fois (éventuellement avec une intensité croissante) pour voir si vous pouvez faire converger le système vers une configuration différente (peut-être meilleure) .

Notez également que je crois que cette méthode maximisera quelque chose comme "la distance moyenne (harmonique?) Entre des paires de particules". Si vous souhaitez maximiser la distance minimale entre des paires de particules, ou une autre moyenne (géométrique?) Entre des paires de particules, cela peut ne pas vous donner la meilleure solution.

Quoi qu'il en soit, j'ai l'impression que cette technique vous donnera un moyen facile de trouver de bons jeux de couleurs approximativement optimaux ... obtenir des solutions "optimales" réelles n'est probablement pas nécessaire pour votre cas d'utilisation. Naturellement, si une solution exacte et prouvée optimale est souhaitée, la simulation numérique n'est probablement pas la meilleure solution.

Patrick87
la source
3
n=9
@SaeedAmiri Observation intéressante ... le problème peut très bien être lié à la nature discrète de ce problème, par rapport à la discussion physique habituelle des densités de charge. Il convient de noter, cependant, qu'il n'y a aucune raison que la simulation numérique avec recuit physique ne trouve toujours pas la solution que vous décrivez; modification de la réponse pour refléter votre commentaire et cet aperçu.
Patrick87
Je vais voir si je peux comprendre comment faire cela dans matlab (avec simulannealbnd). La difficulté que j'imagine sera de traduire le problème en une fonction mathématique que matlab peut essayer de minimiser.
Matt
ps ma pensée initiale était d'utiliser les sommets d'un polyèdre (icosaèdre), car je pensais aussi que la solution les aurait probablement à la surface, mais je ne savais pas si cela serait vrai.
Matt
Dans matlab, j'ai écrit une fonction qui, étant donné un ensemble de points (x, y, z), elle calcule la somme des distances euclidiennes par paire entre chaque paire de points de l'ensemble. Ensuite, je divise un par le résultat et matlab est censé trouver le minimum de cette fonction. Mais matlab ne réussit pas, par exemple, pour 4 points 3D, il renvoie les points x1, x2, x3, x4; y1, y2 .... (plage 0-1): 0,0001, 0,0031, 0,9993, 0,9920 ; 0,9970 0,0004 0,9919 0,0030; 0,0030 0,0003 0,9973 0,5756. Néanmoins, je pense que c'est un problème de matlab, donc je l'accepterai.
Matt