ホームページ >バックエンド開発 >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 を引数として、最も近いColor1、最も近いColor2、または最も近いColor3を呼び出します。返されたインデックスは、配列内で最も近い一致を表します。

最適な方法の選択は、特定のアプリケーションと色のどの側面が最も関連するかによって異なります。

以上が配列内で最も近い色一致を見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。