Групповые фотографии по цвету
У меня довольно большое количество фотографий и цветовая карта RGB (скажем, около 100 цветов). Как я могу сгруппировать фотографии по цвету и получить что-то вроде следующего:http://labs.ideeinc.com/multicolr ?
моя текущая идея такова: используя ImageMagick, сделайте это для каждой фотографии:
- измените его размер на меньший, чтобы его можно было обрабатывать быстрее.
- квантования это без колебаний, используя мой выбранный цвет карта.
- скачать фото гистограмма получить сколько раз каждый цвет появляется.
- храните цвета в базе данных, но я не понял, что является лучшим способом сделать это для быстрого извлечения.
знаете ли вы лучший и более эффективный способ сделать это? Мой язык выбора-PHP, так как вся тяжелая обработка будет выполнена ImageMagick, а база данных-PostgreSQL. Заранее спасибо!
3 ответов
Я заметил, что вы уже выяснили, как получить наиболее релевантные цвета из изображения. Не изменяйте размер изображений так сильно, потому что гистограмма может выглядеть по-другому.
базы данных может выглядеть примерно так:
таблица изображения:
image_id | image_file
цвет стола:
color_id | color_rgb
таблица image_color:
image_id | color_id | color_percent
столбец color_percent будет использоваться для группировки / where предложений
получение изображений:
select
image_id
sum(color_percent)/count(color_percent) as relevance
from
image_color
where
color_id IN (175, 243) # the colors you want to involve in this search
and color_percent > 10 # this will drop results with lower significance
group by
image_id
order by
relevance
цвета по существу являются трехмерными векторами (независимо от того, представлены ли они как HSV, RGB, CMY[K]). К сожалению реляционной базы данных в основном не очень хорошо работает в более чем 1 измерение.
Если вы уменьшите изображение до одного "среднего" цвета, то решение станет немного проще: Тривиальный анализ подразумевает, что вам нужно будет сравнить новое изображение с каждым существующим изображением, чтобы определить уровень сходства. Однако лучший подход было бы оцифровать вектор, чтобы найти аналогичные значения в базе данных.
например, для 24-битного цвета 124, 39, 201 как 1 бит цвет: 0,0,1 как цвет 2 битов: 1,0,2 ....
Если вы хотите посмотреть больше цветов на изображении, то я бы рекомендовал уменьшить до ближайших значений фиксированной цветовой карты без распространения ошибок и определения верхних " N " наиболее часто используемых цветов. То, что вы сделаете после этого, потребует некоторых проб и усилий - метод выше взвешенный для частота в промежуточном изображении может быть необходима, или вы можете просто уйти, глядя на изображения, где верхние цвета N-M соответствуют N-X ваших вычисленных значений (с некоторой настройкой значений M и X).
С.
Я заметил, что вам нужно сделать. Лучший способ обойти эту проблему-преобразовать изображение из RGB в цветовой профиль CIE-LAB.
Затем вы можете рассчитать расстояние между двумя цветами в 3d-пространстве.
М. М.