Проблема алгоритма: Генерируйте цветовую схему из изображения

Короткий ответ да, более длинный ответ, "можно использовать Objective C ++". Так или иначе Вы оказываетесь перед необходимостью изучать, по крайней мере, часть Objective C. Как только Вы начинаете рыть в Какао (платформа для создания приложений Mac OS X), инструменты Xcode и Руководство по проектированию Интерфейса пользователя Apple, Вы поймете, что Objective C является способом пойти.

53
задан Sebastian Zartner 28 December 2014 в 22:03
поделиться

6 ответов

  1. To find the primary X colors, screencap the app. Run a color histogram on the image. The top X colors in the histogram are the theme. Edit: if gradients are used, you'll want to pick distinct "peaks" of colors; that is, you may have a whole bunch of colors right around "orange" if orange is one of the main colors used in the gradients. Effectively, just enforce a certain amount of distance between your colors chosen from the histogram.

  2. Tweaking the color scheme can best be done in HSV space; convert your colors to HSV space, and if the users want it to be "Brighter", increase the Value, if they want it to be more "Colorful", increase the Saturation, etc.

  3. Determining the text color can best be done by characterizing areas of high variability (high frequency in Fourier space). Within those areas, you should have either: two colors, text and background, in which case your text is the lesser-used color; or you'll have several colors, text and background image colors, in which case the text color is the most common color.

26
ответ дан 7 November 2019 в 08:50
поделиться

The name of the type of algorithm you want is Color Quantization.

Unfortunately I don't have any source code available for you, but I'm sure a google search could turn something up.

In particular, the Dr. Dobb's Journal article on the subject seems promising.

4
ответ дан 7 November 2019 в 08:50
поделиться
  1. Разделите изображение экрана на сетку из r-множества прямоугольников в «сетке» n на m, каждый с шириной (общая ширина / n) и высотой (общая высота / м).

    1а. Присвойте вес высокопрофильным областям экрана, например левой области вне центра.

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

  2. Для каждого прямоугольника R, частотное распределение f_R и вес W_R:

    2a. Определите i -й цвет схемы (например, i = 1 <--> цвет фона) путем сканирования «верхней частоты», «второй частоты» ( т.е. f_R [ i ,:]) для каждого блока.

    2b. Для каждого i поместите его в таблицу оценок, ( color_i , score ), где оценка = f_R [ i , «частота» ] * W_R

    2c. Лучшим бомбардиром для каждого i будет i -й цвет схемы.

Теоретически, если у вас много «синих на белом» или «красных на черном», вы должны получить белый первичный, синий вторичный или черный первичный, красный вторичный, например.

Для вашего цвета текста либо основывайте его непосредственно на вычислении цвета фона, либо выберите вторичный цвет, и если разница V составляет HSV слишком низкий, используйте цвет вычисленной схемы, но увеличьте значение V.

PseudoCode:

float[][] weights = 
    { { 1.0, 3.0, 5.0, 5.0, 3.0, 1.0, 1.0, 1.0, 1.0 },
      { 2.0, 6.0, 7.0, 7.0, 6.0, 2.0, 3.0, 3.0, 2.0 },
      { 2.0, 8.0, 9.0, 9.0, 7.0, 3.0, 6.0, 6.0, 3.0 },
      { 2.0, 8.0, 9.0, 9.0, 7.0, 2.0, 3.0, 3.0, 2.0 },
      { 2.0, 7.0, 9.0, 9.0, 7.0, 2.0, 1.0, 1.0, 1.0 },
      { 2.0, 6.0, 7.0, 7.0, 6.0, 2.0, 3.0, 3.0, 1.0 },
      { 1.0, 3.0, 5.0, 5.0, 3.0, 2.0, 6.0, 6.0, 2.0 },
      { 1.0, 1.0, 2.0, 2.0, 1.0, 2.0, 6.0, 6.0, 2.0 },
      { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 3.0, 1.0 } };

// Leave the following implementations to the imagination:
void DivideImageIntoRegions( Image originalImage, out Image[][] regions );
void GetNthMostCommonColorInRegion( Image region, int n, out Color color );
TKey FindMaximum<TKey, TValue>( Map<TKey, TValue> map );

// The method:
Color[] GetPrimaryScheme( Image image, int ncolors, int M = 9, int N = 9 )
{
    Color[] scheme = new Color[ncolors];
    Image[][] regions = new Image[M][N];

    DivideImageIntoRegions( image, regions );

    for( int i = 0; i < ncolors; i++ )
    {
        Map<Color, float> colorScores = new Map<Color, float>();

        for( int m = 0; m < M; m++ )
        for( int n = 0; n < N; n++ )
        {
            Color theColor;
            GetNthMostCommonColorInRegion( region, i, theColor );

            if( colorScores[theColor] == null )
            { colorScores[theColor] = 0; }

            colorScores[theColor] += weights[m][n];
        }

        scheme[i] = FindMaximum( colorScores );
    }

    return scheme;
}

Глядя на вышеизложенное, ясно, что если есть область с небольшой изменчивостью, она будет иметь тот же самый второй по распространенности цвет, что и самый распространенный цвет. Чтобы отрегулировать, второй по распространенности цвет в таком случае может быть нулевым, от чего можно было бы защититься:

            if( theColor != null )
                continue;

            if( colorScores[theColor] == null )
            { colorScores[theColor] = 0; }

            colorScores[theColor] += weights[m][n];
        }
5
ответ дан 7 November 2019 в 08:50
поделиться

Подобно решению McWafflestix, особенности нужно будет изменить, но мой общий подход был бы ...

(Я согласен, что HSV - подходящее место)

  1. Возьмите гистограмму изображения, отфильтруйте ее, чтобы сгладить шум, и найдите наивысшую оценку, когда V и S находятся в (возможно, динамической) гамме вероятных «предметных» цветов. Красная птица на голубом небе потребует от нас достаточного ума, чтобы строить нашу схему не на синем, а на красном. Это может потребовать некоторых предположений о композиции фотографии, например, анализ «по центру кадра» и «правило третей» может дать вам вероятность релевантности цвета. Regardless, this is our the base color.

  2. Along the lines of Kuler, calculate colors that compliment the base by moving around the color wheel. Extra points for a calculated compliment if it also appeared prominently in the histogram from step 1.

  3. Use the base color and calculated compliments to derive pleasing adjunct colors, such as lighter and darker versions of each, more or less saturated, etc.

2
ответ дан 7 November 2019 в 08:50
поделиться

Average the hue, saturation and brightness separately while keeping the min/max values.

Lock the target hue of all the colours to the average and interpolate the saturation and brightness for the x points between the boundaries. This should return a scheme with a colour cast the same as the foto but with a simple variation. Maybe you'll even get the Apple look.

Just hope you don't get 3 shades of dog puke.

0
ответ дан 7 November 2019 в 08:50
поделиться

Уже есть много хороших предложений, как найти основные цвета, и я бы попробовал аналогичные подходы. Для определения цвета текста у меня есть другое предложение.

Рассчитайте гистограмму для каждой строки изображения сверху вниз. Каждый раз, когда вы достигаете базовой линии линии, частота цвета текста должна сильно падать. Частота будет оставаться низкой до тех пор, пока вы не дойдете до заглавных букв следующей строки, за которой следует второй шаг, когда вы дойдете до строчных букв.

Если есть еще один сильный пик, который становится еще больше, когда вы достигаете базовой линии, вы нашли цвет фона.

2
ответ дан 7 November 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: