Групповые фотографии по цвету

У меня довольно большое количество фотографий и цветовая карта RGB (скажем, около 100 цветов). Как я могу сгруппировать фотографии по цвету и получить что-то вроде следующего:http://labs.ideeinc.com/multicolr ?

моя текущая идея такова: используя ImageMagick, сделайте это для каждой фотографии:

  1. измените его размер на меньший, чтобы его можно было обрабатывать быстрее.
  2. квантования это без колебаний, используя мой выбранный цвет карта.
  3. скачать фото гистограмма получить сколько раз каждый цвет появляется.
  4. храните цвета в базе данных, но я не понял, что является лучшим способом сделать это для быстрого извлечения.

знаете ли вы лучший и более эффективный способ сделать это? Мой язык выбора-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-пространстве.

М. М.