Извлечение Доминирующего / Наиболее используемые Цвета из Изображения

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

5
задан Royi 17 October 2019 в 23:22
поделиться

3 ответа

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

4
ответ дан 14 December 2019 в 01:10
поделиться

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

3
ответ дан 14 December 2019 в 01:10
поделиться

Ну, я предполагаю, что вы может получить доступ к каждому пиксельному цвету 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);
}

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

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

2
ответ дан 14 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

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