Der Vergleich von Farben und das Identifizieren der nächstkommenden Farbe innerhalb eines Arrays ist eine häufige Aufgabe in Grafikanwendungen. In diesem Artikel untersuchen wir drei verschiedene Methoden, um dies zu erreichen:
1. Nur-Farbton-Vergleich:
Diese Methode berücksichtigt nur die Farbtöne der Farben und ignoriert Sättigung und Helligkeit. Der Farbtonabstand wird durch eine einfache Subtraktion berechnet und der nächstgelegene Farbton wird durch Ermitteln des Mindestabstands ermittelt.
2. RGB-Abstand:
Diese Methode misst den direkten Abstand zwischen den RGB-Werten der Farben. Der Farbunterschied wird als euklidischer Abstand im RGB-Raum berechnet und die nächstgelegene Farbe wird durch Minimieren dieses Unterschieds gefunden.
3. Gewichteter Vergleich von Farbton, Sättigung und Helligkeit:
Diese Methode kombiniert Farbton, Sättigung und Helligkeit auf gewichtete Weise. Die wahrgenommene Helligkeit wird berechnet und eine Farbzahl wird basierend auf Sättigung und Helligkeit berechnet. Die nächstgelegene Farbe wird durch Minimierung der gewichteten Summe der Farbdifferenz und des Farbtonabstands ermittelt.
Hier sind die Implementierungen dieser Methoden:
// 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));
Die Wahl der Farbabstandsmetrik hängt von der konkreten Anwendung ab. Wenn der Farbton im Vordergrund steht, ist der reine Farbtonvergleich ausreichend. Für eine allgemeinere Farbanpassung liefern der RGB-Abstand oder die Vergleichsmethoden für gewichteten Farbton, Sättigung und Helligkeit genauere Ergebnisse.
Das obige ist der detaillierte Inhalt vonWie finde ich die nächstgelegene Farbe in einer Farbreihe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!