如何比較顏色對象並確定顏色數組中最接近的匹配
了解顏色距離對於顏色選擇等任務至關重要和圖像處理。雖然色距沒有明確的定義,但可以採用多種方法來測量它。
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中文網其他相關文章!