Групповые фотографии по цвету - PullRequest
8 голосов
/ 19 июля 2010

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

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

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

Знаете ли вы лучший и более эффективный способ сделать это?Мой язык выбора - PHP, поскольку вся тяжелая обработка будет выполняться ImageMagick, а база данных - PostgreSQL.Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 19 июля 2010

Цвета - это, по сути, трехмерные векторы (независимо от того, представлены ли они как HSV, RGB, CMY [K]). К сожалению, реляционные базы данных в основном не очень хороши для работы в более чем одном измерении.

Если вы уменьшите изображение до одного «среднего» цвета, тогда решение станет немного проще: Тривиальный анализ подразумевает, что вам нужно будет сравнить новое изображение с каждым существующим изображением, чтобы определить уровень сходства. Однако лучшим подходом было бы оцифровать вектор, чтобы найти похожие значения в базе данных.

например. для 24-битного цвета 124, 39, 201 как 1 битный цвет: 0,0,1 как 2-битный цвет: 1,0,2 ....

Если вы хотите посмотреть больше цветов на изображении, то я бы порекомендовал сократить до ближайших значений фиксированную цветовую карту без распространения ошибок и определить верхние «N» наиболее часто используемых цветов. То, что вы делаете после этого, потребует некоторых усилий и усилий - может потребоваться вышеупомянутый метод взвешивания по частоте на промежуточном изображении, или вам может не понравиться просмотр изображений, где верхние цвета NM соответствуют NX ваших вычисленных значений (с настройка значений M и X).

С

1 голос
/ 19 июля 2010

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

База данных может выглядеть примерно так:

таблица изображений:

image_id | image_file

таблица цветов:

color_id | color_rgb

Таблица цветных изображений:

image_id | color_id | color_percent

столбец color_percent будет использоваться для группировки / где пункты

Получение изображений:

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
0 голосов
/ 25 марта 2012

Я заметил, что вам нужно сделать. Лучший способ обойти эту проблему - преобразовать изображение из RGB в цветовой профиль CIE-LAB.
Затем вы можете рассчитать расстояние между двумя цветами в трехмерном пространстве.

* 1004 M.M. *

...