Я хотел бы извлечь наиболее используемые цвета в изображении или по крайней мере основные тоны, Вы могли рекомендовать мне, как я могу запустить с этой задачи? или укажите на меня на подобный код? У меня есть быть ищущим это, но никакой успех.
Вы можете получить очень хорошие результаты, используя алгоритм квантования октодерева . Другие алгоритмы квантования можно найти в Википедии .
Я согласен с комментариями - для программного решения определенно потребуется дополнительная информация. Но до тех пор, предполагая, что вы получите значения RGB для каждого пикселя изображения, вам следует рассмотреть цветовое пространство HSV , где можно сказать, что оттенок представляет «тон» каждого пикселя. Затем вы можете использовать гистограмму , чтобы определить наиболее часто используемые тона в вашем изображении.
Ну, я предполагаю, что вы может получить доступ к каждому пиксельному цвету 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);
}
Тогда вы можете увидеть, какой диапазон имеет наибольшее значение.
Я надеюсь, что этот метод имеет для вас смысл.