Извлечение доминирующих/наиболее часто используемых цветов из изображения

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


comment
С каким языком или фреймворком вы работаете?   -  person jheddings    schedule 24.11.2009
comment
Ответ будет сильно зависеть от вашей среды.   -  person Ed S.    schedule 24.11.2009
comment
Ну, я думал об обработке только для проверки концепции, а затем перевести ее на python для пакетной обработки.   -  person biquillo    schedule 25.11.2009
comment
Если вам нравится ответ, вы можете нажать на стрелку вверх, чтобы указать, что он был полезен. Если вы считаете, что ответ был решением вашей проблемы, вам следует нажать на галочку, чтобы выбрать его в качестве принятого ответа.   -  person Mark Ransom    schedule 25.11.2009
comment
спасибо, я не знал, я просто зарегистрировался в этом замечательном сообществе! но я не могу нажать на стрелку вверх, потому что у меня нулевая карма :(   -  person biquillo    schedule 25.11.2009


Ответы (3)


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

person Mark Ransom    schedule 24.11.2009
comment
Это именно то, что я искал! Большое спасибо! - person biquillo; 25.11.2009
comment
@динешпрасанна, нет, я не могу. Если Google не может вам помочь, возможно, вам придется написать свой собственный, используя информацию, предоставленную по ссылке. - person Mark Ransom; 10.09.2012

Я согласен с комментариями - программному решению определенно потребуется больше информации. Но до тех пор, предполагая, что вы получите значения RGB для каждого пикселя изображения, вам следует учитывать HSV. цветовое пространство, где можно сказать, что оттенок представляет «тон» каждого пикселя. Затем вы можете использовать гистограмму, чтобы определить наиболее часто используемые тона в вашем изображении.

person Jacob    schedule 24.11.2009
comment
Н.Б. под цветовым пространством HSV вы, скорее всего, имеете в виду модель RGB в режиме HSV - HSV (и его родственный близнец HSL) являются искажениями модели цвета RGB; почти любой, кто ссылается на модель RGB (или, ошибочно, на цветовое пространство RGB), имеет дело с представлениями значений в цветовом пространстве CIE-XYZ'39. Не пытаюсь специально придираться к вашему ответу, но вот. - person fish2000; 24.03.2012

Ну, я предполагаю, что вы можете получить доступ к каждому цвету RGB пикселя. Есть два способа сделать это в зависимости от того, как вы этого хотите.

Сначала вы можете просто создать некоторые из всех пикселей R, G и B. Вот так.

Псевдокод.


int Red   = 0;
int Green = 0;
int Blue  = 0;
foreach (Pixels as aPixel) {
    Red   += aPixel.getRed();
    Green += aPixel.getGreen();
    Blue  += aPixel.getBlue();
}

Тогда смотри, что больше.

Это даст вам только изображение более красного, зеленого или синего цвета.

Другой способ также даст вам статику комбинированного цвета (например, оранжевого), просто создав гистограмму каждой комбинации RGB.

Псевдокод.


Map ColorCounts = new();
foreach (Pixels as aPixel) {
    const aRGB   = aPixel.getRGB();
    var   aCount = ColorCounts.get(aRGB);
    aCount++;
    ColorCounts.put(aRGB, aCount);
}

Затем посмотрите, у кого больше счет. Вы также можете уменьшить цветовое разрешение, так как обычная раскраска RGB даст вам до 6,7 миллионов цветов.

Это можно легко сделать, задав RGB диапазоны цветов. Например, скажем, RGB — это 8 шагов, а не 256.

Псевдокод.



function Reduce(Color) {
    return (Color/32)*32; // 32 is 256/8 as for 8 ranges.
}
function ReduceRGB(RGB) {
    return new RGB(Reduce(RGB.getRed()),Reduce(RGB.getGreen() Reduce(RGB.getBlue()));
}

Map ColorCounts = new();
foreach (Pixels as aPixel) {
    const aRGB   = ReduceRGB(aPixel.getRGB());
    var   aCount = ColorCounts.get(aRGB);
    aCount++;
    ColorCounts.put(aRGB, aCount);
}

Затем вы можете увидеть, какой диапазон имеет наибольшее количество.

Я надеюсь, что эта техника имеет смысл для вас.

person NawaMan    schedule 24.11.2009