配列内で色を比較し、最も近い色を特定することは、グラフィック アプリケーションでは一般的なタスクです。この記事では、これを達成するための 3 つの異なる方法を検討します:
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); }
// 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 中国語 Web サイトの他の関連記事を参照してください。