カラー オブジェクトを比較し、色の配列内で最も近い一致を判断する方法
色の選択などのタスクでは、色の距離を理解することが重要です。そして画像処理。色距離の明確な定義はありませんが、それを測定するためにいくつかの方法を使用できます。
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 中国語 Web サイトの他の関連記事を参照してください。