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

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

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

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

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


person liviucmg    schedule 19.07.2010    source источник


Ответы (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
person Narcis Radu    schedule 19.07.2010
comment
Я думаю, что color_id немного больше. Если это просто ссылка на color_rgb, я не думаю, что вам нужен отдельный ключ. - person rfusca; 19.07.2010
comment
или это может ссылаться на название цвета - person Narcis Radu; 20.07.2010
comment
Я собираюсь отметить это как принятый ответ, потому что это то, что я в итоге сделал. Это не идеально, но мне это нравится, и это было довольно весело делать. :) Проверьте это: picof.net/colors . Проблемы: я не знаю, как выбрать фотографии с более чем одним цветом и упорядочить их по чему-то значимому. Я попытался упорядочить их по (color_A_percent + color_B_percent + ...), но в итоге я получил фотографии, в которых 99% цвета_A и 1% цвета_B. - person liviucmg; 20.07.2010
comment
Я только что сделал правку. Дайте мне знать, если мой запрос полезен. Бафта! - person Narcis Radu; 21.07.2010
comment
Еще раз спасибо. Ваш запрос сработал, но я нашел лучшее решение, используя трехмерный индекс (вкладной модуль PostgreSQL Cube). Это гораздо точнее, и можно запросить любой цвет RGB, а не только цвета из палитры. Он есть в сети, если хотите, посмотрите. - person liviucmg; 25.07.2010

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

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

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

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

C.

person symcbean    schedule 19.07.2010
comment
Я нашел модуль PostgreSQL под названием cube, который может работать с многомерными индексами: postgresql.org/docs/8.4/static/cube.html . Думаю попробовать. поскольку должна быть возможность выбирать фотографии на основе любого цвета RGB, а не только определенных из ограниченной палитры. - person liviucmg; 24.07.2010

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

M.M.

person Matthew Mangion    schedule 25.03.2012
comment
Есть ли у этого преимущества по сравнению с решением postgres Cube, на котором остановился OP? - person FoolishSeth; 27.10.2012