«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как найти ближайший цвет в цветовой массиве?

Как найти ближайший цвет в цветовой массиве?

Опубликовано в 2025-03-23
Просматривать:303

How to Find the Closest Color in a Color Array?

Определение ближайшего цвета в массиве

Сравнение цветов и идентификация ближайшего соответствия в массиве является общей задачей в графических приложениях. В этой статье мы рассмотрим три различных метода для выполнения этого:

метрики дистанции

1. Сравнение только для HUE:

Этот метод рассматривает только оттенки цветов, игнорируя насыщение и яркость. Расстояние оттенка рассчитывается с использованием простой вычитания, а ближайший оттенок определяется путем поиска минимального расстояния.

2. Расстояние RGB:

Этот метод измеряет прямое расстояние между значениями RGB цветов. Разница в цветах рассчитывается как евклидово расстояние в пространстве RGB, а ближайший цвет обнаруживается путем минимизации этой разницы.

3. Сравнение взвешенного оттенка, насыщения и яркости:

Этот метод сочетает в себе оттенок, насыщение и яркость в взвешенном манере. Предполагается воспринимаемая яркость, и количество цветового числа вычисляется на основе насыщения и яркости. Ближайший цвет определяется путем минимизации взвешенной суммы разности цвета и расстояния оттенка.

реализация

Вот реализации этих методов:

// Hue-Only Comparison
int closestColor1(List 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 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);
}

Helper Functions

// 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