Heim >Backend-Entwicklung >C++ >Wie finde ich die beste Farbübereinstimmung in einem Array?

Wie finde ich die beste Farbübereinstimmung in einem Array?

Linda Hamilton
Linda HamiltonOriginal
2024-12-26 18:21:11309Durchsuche

How to Find the Closest Color Match in an Array?

So vergleichen Sie Farbobjekte und ermitteln die größtmögliche Übereinstimmung in einer Reihe von Farben

Das Verständnis der Farbabstände kann für Aufgaben wie die Farbauswahl von entscheidender Bedeutung sein und Bildbearbeitung. Obwohl es keine definitive Definition des Farbabstands gibt, können verschiedene Methoden zu seiner Messung eingesetzt werden.

1. Nur Farbtonvergleich

Diese Methode konzentriert sich ausschließlich auf die Farbtonkomponente der Farbe und ignoriert Sättigung und Helligkeit. Hier ist die Umsetzung:

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);
}

float getHueDistance(float hue1, float hue2)
{
    float d = Math.Abs(hue1 - hue2);
    return d > 180 ? 360 - d : d;
}

2. RGB-Abstand

Diese Methode misst den direkten Abstand zwischen Farben im RGB-Raum:

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);
}

int ColorDiff(Color c1, Color c2)
{
    return (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));
}

3. Gewichteter Abstand

Diese Methode berücksichtigt Farbton, Sättigung und Helligkeit mit anpassbaren Gewichtungen:

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);
}

float ColorNum(Color c) { return c.GetSaturation() * factorSat + 
                                      getBrightness(c) * factorBri; }

float getBrightness(Color c)  
{ 
    return (c.R * 0.299f + c.G * 0.587f + c.B *0.114f) / 256f;
}

Um diese Methoden zu verwenden, konvertieren Sie Ihr Farbarray in ein List und rufen Sie „nestColor1“, „nestColor2“ oder „nestColor3“ mit der Zielfarbe als Argument auf. Der zurückgegebene Index stellt die engste Übereinstimmung innerhalb des Arrays dar.

Die optimale Methodenwahl hängt von der spezifischen Anwendung und davon ab, welcher Farbaspekt am relevantesten ist.

Das obige ist der detaillierte Inhalt vonWie finde ich die beste Farbübereinstimmung in einem Array?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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