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