2017-07-28 9 views
0

J'ai un code qui obtient la couleur la plus proche basée sur la différence RGB, mais avec des couleurs sombres comme le bleu foncé, il retourne le noir au lieu de "bleu foncé". Est-ce que vous pouvez m'aider à trouver ce qui se passe?Comment utiliser la différence rgb entre deux couleurs en C# pour trouver la correspondance la plus proche?

C'est le code qui calcule la différence RVB entre deux couleurs:

int ColorDiff(Color c1, Color c2) 
{ 
    return (int)Math.Sqrt((c1.R - c2.R) * (c1.R - c2.R) 
         + (c1.G - c2.G) * (c1.G - c2.G) 
         + (c1.B - c2.B) * (c1.B - c2.B)); 
} 

Ce code obtient la couleur la plus proche sur la liste (celle qui a moins de différence entre RVB):

int encontrarCor(List<Color> colors, Color target) 
{ 
    var colorDiffs = colors.Select(n => ColorDiff(n, target)).Min(n => n); 
    return colors.FindIndex(n => ColorDiff(n, target) == colorDiffs); 
} 

Ce que je pense qu'il se passe est que, comme vous pouvez le voir dans le premier code, il fait: (c1.R - ​​c2.R) * (c1.R - ​​c2.R), donc si un de ces substrats est égal à 0 , le produit entier va être 0, donc retourne noir, car le code RVB du noir est 0,0,0.

J'ai essayé de me rendre aussi clair que possible, désolé si c'est un peu confus.

+0

Vous devez calculer manuellement la * distance * entre ces couleurs - peut-être, il est vraiment plus proche du noir que du bleu foncé. Si vous voulez que nous vous le demandions, vous devez fournir les informations suivantes: RGB de votre norme "bleu foncé"; Exemple RVB de couleur qui se traduit par du noir lorsque vous vous attendez à ce qu'il en résulte en bleu foncé. –

+1

votre description ne correspond pas au code ...... si l'une de ces couleurs diffs = 0, alors la différence est 0 pour ce canal, ce qui est correct, il n'y a pas de différence. Ce 0 n'est pas utilisé pour une couleur du tout. Il fait ensuite bizarrement tout cela de nouveau afin qu'il puisse trouver l'indice de la couleur avec la plus faible différence –

+1

* "donc si l'un de ces substrats est égal à 0, tout le produit va être 0" * - faux. Vous n'utilisez pas le produit des distances des composants de couleur, vous les résumez. Si l'un d'eux calcule à zéro, alors la somme peut toujours être non nulle. –

Répondre

0

Je ne comprends pas le point de la racine carrée et multiplications, mais les différences doivent être positifs:

int RGBdiff(Color c1, Color c2) 
{ 
    return Math.Abs(c1.R - c2.R) + Math.Abs(c1.G - c2.G) + Math.Abs(c1.B - c2.B); 
} 

Color ClosestColor(Color target, IEnumerable<Color> colors) 
{ 
    return colors.Min(c => Tuple.Create(RGBdiff(c, targert), c)).Item2; 
} 

Notez que plus d'une couleur peut avoir la même différence.