首頁 >後端開發 >C++ >如何在顏色數組中找到最接近的顏色?

如何在顏色數組中找到最接近的顏色?

Patricia Arquette
Patricia Arquette原創
2024-12-28 12:50:11276瀏覽

How to Find the Closest Color in a Color Array?

確定數組中最接近的顏色

比較顏色並識別數組中最接近的匹配是圖形應用程式中的常見任務。在本文中,我們將探討三種不同的方法來實現此目的:

距離測量

1。僅色調比較:

此方法只考慮顏色的色調,忽略飽和度和亮度。使用簡單的減法計算色相距離,透過找到最小距離來確定最接近的色相。

2. RGB 距離:

此方法測量顏色的 RGB 值之間的直接距離。色差計算為 RGB 空間中的歐幾里德距離,並透過最小化此差異來找到最接近的顏色。

3.加權色相、飽和度和亮度比較:

此方法以加權方式組合色相、飽和度和亮度。計算感知亮度,並根據飽和度和亮度計算色數。透過最小化色差和色調距離的加權和來確定最接近的顏色。

實現

以下是這些方法的實現:

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

Helper功能

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

結論

顏色的選擇距離度量取決於具體應用。如果色調是主要考慮因素,則僅進行色調比較就足夠了。對於更一般的顏色匹配,RGB 距離或加權色調、飽和度和亮度比較方法可提供更準確的結果。

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

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