6

これを実行するには指示が必要です。GetPixel()すべてのピクセルを繰り返し処理し、メソッドを介して値を取得しています。次に何をすべきですか?

4

4 に答える 4

9

すべてのピクセルを取得するヘルパー メソッドを次に示します。

public static IEnumerable<Color> GetPixels(Bitmap bitmap)
{
    for (int x = 0; x < bitmap.Width; x++)
    {
        for (int y = 0; y < bitmap.Height; y++)
        {
            Color pixel = bitmap.GetPixel(x, y);
            yield return pixel;
        }
    }
}

色だけが必要な場合 (カウンターなし):

using (var bitmap = new Bitmap(@"..."))
{
    var mostUsedColors =
        GetPixels(bitmap)
            .GroupBy(color => color)
            .OrderByDescending(grp => grp.Count())
            .Select(grp => grp.Key)
            .Take(5);
    foreach (var color in mostUsedColors)
    {
        Console.WriteLine("Color {0}", color);
    }
}

ちなみに、カウンターで最も使用されている上位 5 色の選択は次のとおりです。

using (var bitmap = new Bitmap(@"..."))
{
    var colorsWithCount =
        GetPixels(bitmap)
            .GroupBy(color => color)
            .Select(grp =>
                new
                    {
                        Color = grp.Key,
                        Count = grp.Count()
                    })
            .OrderByDescending(x => x.Count)
            .Take(5);

    foreach (var colorWithCount in colorsWithCount)
    {
        Console.WriteLine("Color {0}, count: {1}",
            colorWithCount.Color, colorWithCount.Count);
    }
}
于 2012-07-29T20:44:14.047 に答える
2

Dictionary<Color, int>各色のカウントを保持する場所にそれらを集約します。それらすべてを反復処理した後、値 (カウント) で並べ替えられた上位 5 つを抽出します。

パフォーマンスは劣りますが、より単純なソリューションは次のとおりです。

(from c in allColors
group c by c into g
order by g.Count() descending
select g.Key).Take(5)
于 2012-07-29T20:27:41.723 に答える
1

私はあなたのためにコードを書きませんが、あなたが必要とするものの一般的な説明をします:

  1. 各色とその出現回数を保持するデータ構造
  2. 各ピクセルについて、データ構造に色が存在する場合は、数値 2 をインクリメントします。色が存在しない場合は、カウント 1 を追加します。
  3. すべてのピクセルを調べたら、構造をカウントで並べ替え、上位 5 つを取得します。
于 2012-07-29T20:28:35.700 に答える
0

次のような辞書を作成します。

Dictionary<Color, int> dictColors = new Dictionary<Color, int>();

次に、各ピクセルを反復処理するときに、これを実行します

Color color =GetPixel(x,y);
if(!dictColors.Contains(color) )
{
dictColors.Add(color,0);
}
else
{
dictColors[color]++;
}

then take first five:
 var top5 = dictColors.Take(5);
于 2012-07-29T20:38:25.433 に答える