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:
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.
Aquí están las implementaciones de estos métodos:
// 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));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.
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