首页 >后端开发 >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