Сравнение цветов и идентификация ближайшего соответствия в массиве является общей задачей в графических приложениях. В этой статье мы рассмотрим три различных метода для выполнения этого:
1. Сравнение только для HUE:
Этот метод рассматривает только оттенки цветов, игнорируя насыщение и яркость. Расстояние оттенка рассчитывается с использованием простой вычитания, а ближайший оттенок определяется путем поиска минимального расстояния.
2. Расстояние RGB:
Этот метод измеряет прямое расстояние между значениями RGB цветов. Разница в цветах рассчитывается как евклидово расстояние в пространстве RGB, а ближайший цвет обнаруживается путем минимизации этой разницы.
3. Сравнение взвешенного оттенка, насыщения и яркости:
Этот метод сочетает в себе оттенок, насыщение и яркость в взвешенном манере. Предполагается воспринимаемая яркость, и количество цветового числа вычисляется на основе насыщения и яркости. Ближайший цвет определяется путем минимизации взвешенной суммы разности цвета и расстояния оттенка.
Вот реализации этих методов:
// Hue-Only Comparison int closestColor1(Listcolors, 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 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 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));]
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3