Maison > développement back-end > C++ > Comment trouver la couleur la plus proche dans une gamme de couleurs ?

Comment trouver la couleur la plus proche dans une gamme de couleurs ?

Patricia Arquette
Libérer: 2024-12-28 12:50:11
original
270 Les gens l'ont consulté

How to Find the Closest Color in a Color Array?

Détermination de la couleur la plus proche dans un tableau

Comparer les couleurs et identifier la correspondance la plus proche dans un tableau est une tâche courante dans les applications graphiques. Dans cet article, nous explorerons trois méthodes différentes pour y parvenir :

Mesures de distance

1. Comparaison de teinte uniquement :

Cette méthode ne prend en compte que les teintes des couleurs, en ignorant la saturation et la luminosité. La distance de teinte est calculée à l'aide d'une simple soustraction, et la teinte la plus proche est déterminée en trouvant la distance minimale.

2. Distance RVB :

Cette méthode mesure la distance directe entre les valeurs RVB des couleurs. La différence de couleur est calculée comme une distance euclidienne dans l'espace RVB, et la couleur la plus proche est trouvée en minimisant cette différence.

3. Comparaison pondérée de la teinte, de la saturation et de la luminosité :

Cette méthode combine la teinte, la saturation et la luminosité de manière pondérée. La luminosité perçue est calculée, et un numéro de couleur est calculé sur la base de la saturation et de la luminosité. La couleur la plus proche est déterminée en minimisant la somme pondérée de la différence de couleur et de la distance de teinte.

Mise en œuvre

Voici les implémentations de ces méthodes :

// Hue-Only Comparison
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);
}

// RGB Distance Comparison
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);
}

// Weighted Hue, Saturation, and Brightness Comparison
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);
}
Copier après la connexion

Aide Fonctions

// Color brightness as perceived:
float getBrightness(Color c) => (c.R * 0.299f + c.G * 0.587f + c.B * 0.114f) / 256f;

// Distance between two hues:
float getHueDistance(float hue1, float hue2) => Math.Abs(hue1 - hue2) > 180 ? 360 - Math.Abs(hue1 - hue2) : Math.Abs(hue1 - hue2);

// Weighed by saturation and brightness:
float ColorNum(Color c) => c.GetSaturation() * factorSat + getBrightness(c) * factorBri;

// Distance in RGB space:
int ColorDiff(Color c1, Color c2) => (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

Conclusion

Le choix de la métrique de distance de couleur dépend sur l'application spécifique. Si la teinte est la considération principale, la comparaison de la teinte seule est suffisante. Pour une correspondance plus générale des couleurs, les méthodes de comparaison de la distance RVB ou de la teinte pondérée, de la saturation et de la luminosité fournissent des résultats plus précis.

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