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 :
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.
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); }
// 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));
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!