Heim > Backend-Entwicklung > C++ > Wie finde ich die nächstgelegene Farbe in einer Farbreihe?

Wie finde ich die nächstgelegene Farbe in einer Farbreihe?

Patricia Arquette
Freigeben: 2024-12-28 12:50:11
Original
267 Leute haben es durchsucht

How to Find the Closest Color in a Color Array?

Bestimmen der nächstkommenden Farbe in einem Array

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:

Entfernungsmetriken

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.

Implementierung

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);
}
Nach dem Login kopieren

Helfer Funktionen

// 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));
Nach dem Login kopieren

Fazit

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage