Получение цветовой схемы из изображения - PullRequest
9 голосов
/ 11 января 2010

Я хочу разработать базовый инструмент, такой как , показанный здесь . Я буду делать скриншоты нескольких веб-страниц, и оттуда я хочу взять пять самых популярных цветов и оттуда каким-то образом решить, подходят ли цвета.

Я хочу написать этот инструмент на C #, и после небольшого исследования я обнаружил локбиты. Моя первая идея состояла в том, чтобы взять изображение и затем получить цвет каждого пикселя, но я не уверен, даст ли это мне желаемые результаты, и как составить шесть списков самых популярных цветов.

Может ли кто-нибудь здесь дать совет относительно того, как я мог бы создать программу, которая будет делать что-то похожее на программу выше, которая будет принимать изображение и выбирать пять лучших цветов, используемых в изображении?

Ответы [ 3 ]

16 голосов
/ 11 января 2010

Хорошо .. Используйте уменьшенное изображение (16x16, 32x32 и т. Д.) И выберите из него цвета, такие как

обновленный код:

    private void button1_Click(object sender, EventArgs e)
    {
        int thumbSize = 32;
        Dictionary<Color, int> colors = new Dictionary<Color, int>();

        Bitmap thumbBmp = 
            new Bitmap(pictureBox1.BackgroundImage.GetThumbnailImage(
                thumbSize, thumbSize, ThumbnailCallback, IntPtr.Zero));

        //just for test
        pictureBox2.Image = thumbBmp;            

        for (int i = 0; i < thumbSize; i++)
        {
            for (int j = 0; j < thumbSize; j++)
            {
                Color col = thumbBmp.GetPixel(i, j);
                if (colors.ContainsKey(col))
                    colors[col]++;
                else
                    colors.Add(col, 1);
            }                
        }

        List<KeyValuePair<Color, int>> keyValueList = 
            new List<KeyValuePair<Color, int>>(colors);

        keyValueList.Sort(
            delegate(KeyValuePair<Color, int> firstPair,
            KeyValuePair<Color, int> nextPair)
            {
                return nextPair.Value.CompareTo(firstPair.Value);
            });

        string top10Colors = "";
        for (int i = 0; i < 10; i++)
        {
            top10Colors += string.Format("\n {0}. {1} > {2}",
                i, keyValueList[i].Key.ToString(), keyValueList[i].Value);
            flowLayoutPanel1.Controls[i].BackColor = keyValueList[i].Key;
        }
        MessageBox.Show("Top 10 Colors: " + top10Colors);
    }

    public bool ThumbnailCallback() { return false; }

альтернативный текст http://lh3.ggpht.com/_1TPOP7DzY1E/S0uZ6GGD4oI/AAAAAAAAC5k/3Psp1cOCELY/s800/colors.png

2 голосов
/ 11 января 2010

Этот является примером того, как создать гистограмму (или таблицу частот, другими словами), где вы можете взглянуть на детали того, как выполнить обработку изображения.

Но моя главная рекомендация не в том, чтобы использовать RGB (если на сайте, который вы просматриваете, в основном простые), а вместо этого использовать HSB. Компонент "H" (оттенок) даст вам лучшее представление об используемых цветах, независимо от того, насколько они светлые или темные.

2 голосов
/ 11 января 2010

Самый простой способ, как вы сказали:

  • Прочитайте каждый пиксель и сохраните их в коллекция.

  • Лучшие пять цветов будут значения, которые встречаются чаще всего.

Вот как бы я сначала попробовал что-то подобное.

Чтобы продолжить эту работу, вы можете использовать цветовые диапазоны, поэтому, используя RGB значения (Red, Green, Blue), присвойте цвет определенному приближению цвета.

Например, скажем, что использовалось то же изображение, значения светло-голубого цвета будут сохранены вместе, а затем можно взять среднее из них, чтобы получить наиболее распространенный (но средний) светло-синий цвет в сцене.

Повторите для остальных пикселей.

Что касается масштабирования - пример сайта использует тусклые / яркие значения. Можно использовать простое значение масштаба. Рассмотрим средний красный цвет в RGB:

0.7, 0.0, 0.0

Вы можете масштабировать это, добавляя / умножая значение. Однако сохраняйте значения в пределах от 0 до 1. Что касается значения масштабирования, экспериментатор. Чем оно выше, тем тусклее / ярче становится цвет.

...