7

Основываясь на предложениях здесь @ SO, я зарегистрировал средний цвет набора стоковых изображений.
г, г, б = image.convert ("RGB"). Размер ((1,1), Image.ANTIALIAS) .getpixel ((0,0))Найти похожие изображения

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

Я прочитал здесь несколько вопросов, которые рекомендуют «найти расстояние между двумя цветами» и ссылаться на книгу Flickr Hacks.

Алгоритм расстояния Flickr Hack, кажется, в основном:


diffr = checkImage.r - search_r
diffg = checkImage.g - search_g
diffb = checkImage.b - search_b
расстояние = (diffr * diffr + diffg * diffg + diffb * diffb)
если расстояниепорог затем соответствует.


Этот метод потребовал бы, чтобы я вычислил расстояние между моим цветом поиска и цветным отпечатком каждого изображения. Мне было интересно, есть ли способ указать «область поиска» на основе выбранного цвета (центральной точки) и заранее определенного порога (или радиуса поиска). Затем создайте SQL-запрос, чтобы вернуть все изображения, попадающие в эту область.

Возможно ли это?

BTW, я реализую это в Python, используя PIL и связанные библиотеки.

Благодарим за помощь!

SR

+0

Вы нашли то, что искали? – Thariama

ответ

2

Вы можете значительно сэкономить на вычислении, выполнив сравнения на каждом компоненте, а не на квадрат, чтобы найти расстояние.

if abs(check.r - search.r) < threshold and 
    abs(check.g - search.g) < threshold and 
    abs(check.b - search.b) < threshold 

Сочетание этого с кеш-таблицами, вероятно, будет достаточно для всего, что вы делаете.

+0

Это полевой поиск, сумма квадратов в OP является сферическим тестом. Я сомневаюсь, что есть разница между двумя методами: скорость (три 8 бит умножает стихи три добавляет и абс), вы самые большие накладные расходы, как и в большинстве случаев в наши дни, это пропускная способность памяти. – Skizz

+0

Легко самый простой подход, и я отчаянно надеюсь, что он принесет полезные результаты. Спасибо! Я попробую его в ближайшее время и опубликую свои результаты. Я слышал однажды на видео TED, что хоббист достиг 80% функциональности коммерческих продуктов примерно в 2% от стоимости. Мне нравится этот менталитет и его то, к чему я стремлюсь, с моим проектом: да, визуальный цветной поиск не будет идеальным, но если его в основном там с несколькими часами усилий, это будет уже здорово! SR –

1

Если бы это было, я бы немного меньше фантазии и кэшировать поиски в средней таблице, как:

CREATE TABLE `image_search` (
    `id` int not null auto_increment, 
    `image_id` int not null, 
    `r` tinyint not null, 
    `g` tinyint not null, 
    `b` tinyint not null, 
    `distance` tinyint not null, 
    `hit` bool not null, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `image_id_by_rgb_by_distance` (`image_id`,`r`,`g`,`b`,`distance`), 
    KEY `image_id_by_rgb_by_distance_by_hit` (`image_id`,`r`,`g`,`b`,`distance`,`hit`), 
); 

чалочные от того, чтобы найти спички, как

SELECT `image_id` 
FROM `image_search` 
WHERE `r` = $r 
AND `g` = $g 
AND `b` = $b 
AND `distance` = $distance 
AND `hit` = 1 

Если вы не получите никаких результатов, то сделайте

SELECT `image_id` 
FROM `image_search` 
WHERE `r` = $r 
AND `g` = $g 
AND `b` = $b 
AND `distance` = $distance 

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

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

Также бонусные баллы для предварительного вычисления всех ранее выполненных поисков, когда вы добавляете изображение в свой каталог.

+0

хаос, если я правильно вас понимаю, вы предлагаете мне провести анализ сравнения заранее и сохранить отношения в БД. Поэтому для каждого цвета у меня уже был бы список похожих изображений, и операция была бы простым поиском. Это довольно просто, и на самом деле очень умный, я собираюсь попробовать. Однако это можно использовать только в том случае, если начальная точка поиска была изображением уже в моем каталоге. Я бы вычислил его цвет avg, а затем попробовал мой поиск. Я хочу представить цветовое колесо и представить лучшие соответствия выбранному цвету. Есть предположения? –

+0

Вот почему я говорю об этом прежде всего как о механизме кеширования. Если комбинация цвета/расстояния отсутствует в таблице, вы ее вычисляете и храните. Предварительная компрессия используется только для того, чтобы выровнять кеш со значениями, которые, как вы знаете, могут выбрать пользователи. – chaos

0

Мы можем посмотреть на цвет как точку в трехмерном пространстве. Теперь каждое изображение будет находиться в точке в пространстве, определяемой его средним цветом. Пользователь выбирает точку в трехмерном пространстве, и вы хотите найти изображение, ближайшее к этой точке.

Это не просто, но на нем много работы сделано умнее вас или меня (Дон Кнут называет это «проблемой почтового отделения»). Хорошее место для начала - at Wikipedia, как обычно.

3

Color difference (Delta E) - разница или расстояние между двумя цветами - это метрика, представляющая интерес в науке о цветах.

Вы можете найти Python код here

Обратите внимание, что вам нужно преобразовать RGB в Lab перед вычислением Delta E.

RGB -> XYZ -> Lab

Дополнительная информация:

Bruce Justin Lindbloom site

Color conversion math and formulas

Color delta/comparison math

Смежные вопросы