首頁 >後端開發 >C++ >如何在陣列中找到最接近的顏色匹配?

如何在陣列中找到最接近的顏色匹配?

Linda Hamilton
Linda Hamilton原創
2024-12-26 18:21:11309瀏覽

How to Find the Closest Color Match in an Array?

如何比較顏色對象並確定顏色數組中最接近的匹配

了解顏色距離對於顏色選擇等任務至關重要和圖像處理。雖然色距沒有明確的定義,但可以採用多種方法來測量它。

1.僅色調比較

此方法只關注顏色的色調成分,忽略飽和度和亮度。這是實作:

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 距離

此方法測量RGB 空間中顏色之間的直接距離:

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。加權距離

此方法考慮色調、飽和度和亮度,並具有可自訂的權重:

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

要使用這些方法,請將您的Color 陣列轉換為List 。並以目標 Color 作為參數呼叫closestColor1、closestColor2 或closestColor3。傳回的索引表示數組中最接近的匹配。

最佳方法選擇取決於具體應用以及顏色的哪個方面最相關。

以上是如何在陣列中找到最接近的顏色匹配?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn