Maison > développement back-end > C++ > Comment trouver la correspondance de couleur la plus proche dans un tableau ?

Comment trouver la correspondance de couleur la plus proche dans un tableau ?

Linda Hamilton
Libérer: 2024-12-26 18:21:11
original
308 Les gens l'ont consulté

How to Find the Closest Color Match in an Array?

Comment comparer des objets de couleur et déterminer la correspondance la plus proche dans un tableau de couleurs

Comprendre les distances de couleurs peut être crucial pour des tâches telles que la sélection des couleurs et le traitement d'images. Bien qu'il n'existe pas de définition définitive de la distance des couleurs, plusieurs méthodes peuvent être utilisées pour la mesurer.

1. Comparaison de teinte uniquement

Cette méthode se concentre uniquement sur la composante de teinte de la couleur, en ignorant la saturation et la luminosité. Voici la mise en œuvre :

int closestColor1(List<Color> colors, Color target)
{
    var hue1 = target.GetHue();
    var diffs = colors.Select(n => getHueDistance(n.GetHue(), hue1));
    var diffMin = diffs.Min(n => n);
    return diffs.ToList().FindIndex(n => n == diffMin);
}

float getHueDistance(float hue1, float hue2)
{
    float d = Math.Abs(hue1 - hue2);
    return d > 180 ? 360 - d : d;
}
Copier après la connexion

2. Distance RVB

Cette méthode mesure la distance directe entre les couleurs dans l'espace RVB :

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

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));
}
Copier après la connexion

3. Distance pondérée

Cette méthode prend en compte la teinte, la saturation et la luminosité, avec des poids personnalisables :

int closestColor3(List<Color> colors, Color target)
{
    float hue1 = target.GetHue();
    var num1 = ColorNum(target);
    var diffs = colors.Select(n => Math.Abs(ColorNum(n) - num1) + 
                                   getHueDistance(n.GetHue(), hue1) );
    var diffMin = diffs.Min(x => x);
    return diffs.ToList().FindIndex(n => n == diffMin);
}

float ColorNum(Color c) { return c.GetSaturation() * factorSat + 
                                      getBrightness(c) * factorBri; }

float getBrightness(Color c)  
{ 
    return (c.R * 0.299f + c.G * 0.587f + c.B *0.114f) / 256f;
}
Copier après la connexion

Pour utiliser ces méthodes, convertissez votre tableau de couleurs en un tableau Liste et appelez la couleur la plus proche1, la couleur la plus proche2 ou la couleur la plus proche3 avec la couleur cible comme argument. L'index renvoyé représente la correspondance la plus proche au sein du tableau.

Le choix de la méthode optimale dépend de l'application spécifique et de l'aspect de la couleur le plus pertinent.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal