"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo encontrar el color más cercano en una matriz de color?

¿Cómo encontrar el color más cercano en una matriz de color?

Publicado el 2025-03-23
Navegar:241

How to Find the Closest Color in a Color Array?

Determinar el color más cercano en una matriz

en comparación con los colores e identificar la coincidencia más cercana dentro de una matriz es una tarea común en las aplicaciones gráficas. En este artículo, exploraremos tres métodos diferentes para lograr esto:

Distancia Metrics

1. Comparación de solo Hue:

Este método considera solo los tonos de los colores, ignorando la saturación y el brillo. La distancia del tono se calcula utilizando una resta simple, y el tono más cercano se determina al encontrar la distancia mínima.

2. Distancia RGB:

Este método mide la distancia directa entre los valores RGB de los colores. La diferencia de color se calcula como una distancia euclidiana en el espacio RGB, y el color más cercano se encuentra minimizando esta diferencia.

3. Comparación de tono, saturación y brillo ponderados:

Este método combina tono, saturación y brillo de manera ponderada. Se calcula el brillo percibido y se calcula un número de color en función de la saturación y el brillo. El color más cercano se determina minimizando la suma ponderada de la diferencia de color y la distancia del tono.

implementación

Aquí están las implementaciones de estos métodos:

// 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));
conclusión La métrica depende de la aplicación específica. Si el tono es la consideración principal, la comparación solo de HUE es suficiente. Para una coincidencia de color más general, la distancia RGB o los métodos de comparación de tono, saturación y brillo ponderados proporcionan resultados más precisos.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3