Найдите изображения схожего цвета

В приведенном выше коде есть ошибка, так как он не принимает абсолютные значения на каждой итерации. Приведенный выше код всегда будет возвращать ноль. (Математически это разница между взятием продукта со знаком или клина и реальной площадью http://en.wikipedia.org/wiki/Exterior_algebra .) Вот некоторый альтернативный код.

def area(vertices):
    n = len(vertices) # of corners
    a = 0.0
    for i in range(n):
        j = (i + 1) % n
        a += abs(vertices[i][0] * vertices[j][1]-vertices[j][0] * vertices[i][1])
    result = a / 2.0
    return result

7
задан Shaheeb Roshan 1 June 2009 в 18:08
поделиться

3 ответа

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

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

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

3
ответ дан 7 December 2019 в 05:27
поделиться

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

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

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

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

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

1
ответ дан 7 December 2019 в 05:27
поделиться

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

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

0
ответ дан 7 December 2019 в 05:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: