2012-07-29 2 views
2

Мне нужно направление для этого. Я повторяю все пиксели и получаю значение через функцию getpixel. Что я должен делать дальше?Как получить лучшие 5 самых популярных цветов rgb из изображения?

+1

[Что есть вы пытались] (http://whathaveyoutried.com)? Какие подходы вы рассмотрели? Stack Overflow - это не место, где вы будете думать или работать для вас - пожалуйста, покажите нам те усилия, которые вы прошли, и объясните, где вы застряли. – Oded

ответ

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) 
1

Я не буду писать код для вас, но дать общее описание того, что вам нужно:

  1. Структура данных, которая содержит каждый цвет и количество раз, которое появляется
  2. Для каждого пикселя, если цвет существует в вашей структуре данных, увеличьте число 2.a если цвет не существует, добавьте его с количеством 1
  3. После того, как вы прошли через все пиксели, сортировать структуру по колу и получить топ 5
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); 
+0

Вы пробовали этот код? –

4

Здесь вспомогательная функция, чтобы получить все пиксели:

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); 
    } 
} 
Смежные вопросы