如何比较颜色对象并确定颜色数组中最接近的匹配
了解颜色距离对于颜色选择等任务至关重要和图像处理。虽然色距没有明确的定义,但可以采用多种方法来测量它。
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
最佳方法选择取决于具体应用以及颜色的哪个方面最相关。
以上是如何在阵列中找到最接近的颜色匹配?的详细内容。更多信息请关注PHP中文网其他相关文章!