Обнаружение почти дубликатов изображений

Какой быстрый способ сортировать заданный набор изображений по их сходству друг с другом.

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

Оптимально я ищу алгоритм, который даст каждому изображению оценку (например, целочисленный балл, такой как RGB Average), и я могу просто сортировать по этому счету. Одинаковые оценки или оценки рядом друг с другом возможны дубликаты.

0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994 

RGB Среднее за изображение сосет, есть ли что-то подобное?

Ответ 1

Было проведено много исследований по поиску изображений и методам схожести. Это непростая задача. В общем, одного int будет недостаточно, чтобы определить, являются ли изображения очень похожими. У вас будет высокий уровень ложных срабатываний.

Однако, поскольку сделано много исследований, вы можете взглянуть на некоторые из них. Например, этот документ (PDF) дает алгоритм автоматической печати пальцев, который подходит для быстрого поиска дубликатов изображений и без хранения большого количества данных. Похоже, это правильный подход, если вы хотите что-то надежное.

Если вы ищете что-то более простое, но определенно более adc hoc, этот вопрос SO имеет несколько достойных идей.

Ответ 2

Я бы рекомендовал рассмотреть возможность перехода от использования только гистограммы RGB.

Лучший дайджест вашего изображения может быть получен, если вы возьмете вейвлет изображения 2d Haar (его намного проще, чем кажется, его просто усреднение и некоторые квадратные корни, используемые для взвешивания ваших коэффициентов) и просто сохраняйте k наибольшие взвешенные коэффициенты в вейвлете как разреженный вектор, нормализуют его и сохраняют, чтобы уменьшить его размер. Вы должны повторно масштабировать R G и B с использованием перцептивных весов, по крайней мере, или я бы рекомендовал переключиться на YIQ (или YCoCg, чтобы избежать шума квантования), чтобы вы могли отображать информацию о цветности с уменьшенной значимостью.

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

Вы можете торговать складом и точностью, увеличивая или уменьшая k.

Сортировка по одной числовой оценке будет трудноразрешимой для такой проблемы классификации. Если вы думаете об этом, это потребует, чтобы изображения имели возможность "изменять" вдоль одной оси, но они этого не делают. Вот почему вам нужен вектор функций. В случае вейвлета Хаара примерно такая область, где происходят самые резкие разрывы изображения. Вы можете вычислить расстояние между изображениями попарно, но поскольку все, что у вас есть, является метрикой расстояния, линейный порядок не может выразить "треугольник" из трех изображений, которые все одинаково отдалены. (например, изображение зеленого цвета, изображение красного цвета и все синие).

Это означает, что для любого реального решения вашей проблемы потребуются операции O (n ^ 2) в количестве ваших изображений. Если бы было возможно линеаризовать меру, вы могли бы потребовать только O (n log n) или O (n), если бы эта мера была подходящей, например, для сортировки radix. Тем не менее, вам не нужно тратить O (n ^ 2), так как на практике вам не нужно просеивать весь набор, вам просто нужно найти материал, который ближе к некоторому порогу. Таким образом, применяя один из нескольких методов для разбиения вашего разреженного векторного пространства, вы можете получить гораздо более быструю асимптотику для "нахождения меня в вопросе, который является более похожим, чем заданный порог", чем наивное сравнение каждого изображения с каждым изображением, что дает вам то, что вам, вероятно, понадобится... если не то, что вы просили.

В любом случае, я использовал это несколько лет назад для хорошего эффекта лично, пытаясь свести к минимуму количество различных текстур, которые я хранили, но в этом пространстве также было много исследований, показывающих его эффективность (и в этот случай сравнивает его с более сложной формой классификации гистограмм):

http://www.cs.princeton.edu/cass/papers/spam_ceas07.pdf

Если вам нужна более высокая точность обнаружения, алгоритмы minHash и tf-idf могут использоваться с вейвлером Хаара (или гистограммой) для более эффективной обработки изменений:

http://cmp.felk.cvut.cz/~chum/papers/chum_bmvc08.pdf

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

http://wang14.ist.psu.edu/cgi-bin/zwang/regionsearch_show.cgi

Ответ 3

Я реализовал очень надежный алгоритм для этого, называемый Быстрый запрос на многопользовательский поиск изображений. Мой (древний, неподдерживаемый) код для этого здесь.

Что такое Fast Multiresolution Image Querying делает разбиение изображения на 3 части на основе цветового пространства YIQ (лучше для сопоставления различий, чем RGB). Затем изображение по существу сжимается с использованием вейвлет-алгоритма до тех пор, пока не будут доступны только самые важные функции из каждого цветового пространства. Эти точки хранятся в структуре данных. Изображения запросов проходят один и тот же процесс, а заметные функции изображения запроса сопоставляются с теми, что хранятся в базе данных. Чем больше совпадений, тем больше вероятность, что изображения похожи.

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

Гораздо более впечатляющим, чем мое программное обеспечение, является retrievr, который позволяет вам попробовать алгоритм FMIQ с использованием изображений Flickr в качестве источника. Очень круто! Попробуйте его с помощью эскиза или используя исходное изображение, и вы можете увидеть, насколько он работает.

Ответ 4

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

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

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

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

Ответ 5

Там есть библиотека C ( "libphash" - http://phash.org/), которая рассчитает "перцептивный хеш" изображения и позволит вам обнаруживать похожие изображения, сравнивая хеши (так что вам не нужно сравнивать каждое изображение напрямую со всеми другими изображениями), но, к сожалению, это не показалось очень точным, когда я его пробовал.

Ответ 6

Вам нужно решить, что такое "похоже". Контраст? Оттенок?

Является ли изображение "похожим" на один и тот же рисунок вверх дном?

Готов поспорить, вы можете найти множество "закрытых звонков", разбивая изображения на 4x4 и получая средний цвет для каждой ячейки сетки. У вас будет шестнадцать баллов за изображение. Чтобы судить о сходстве, вы просто делаете сумму квадратов различий между изображениями.

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

Вот ваша идея:

0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994

Прежде всего, я собираюсь предположить, что это десятичные числа, которые являются R * (2 ^ 16) + G * (2 ^ 8) + B, или что-то в этом роде. Очевидно, что нет ничего хорошего, потому что красный весит чрезмерно.

Перемещение в пространство HSV было бы лучше. Вы могли распространять бит HSV вне в хеш, или вы могли бы просто установить H или S или V отдельно, или вы могли бы иметь три хэша на изображение.


Еще одна вещь. Если вы делаете вес R, G и B. Вес зеленый, высокий, затем красный, затем синий, чтобы соответствовать человеческой визуальной чувствительности.

Ответ 7

В эпоху веб-сервисов вы можете попробовать http://tineye.com

Ответ 9

Я предположил, что другое дублирующее программное обеспечение для поиска изображений выполняет БПФ на изображениях и сохраняет значения разных частот в виде векторов:

Image1 = (u1, u2, u3, ..., un)
Image2 = (v1, v2, v3, ..., vn)

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

distance = Sqrt(
     (u1-v1)^2 +
     (u2-v2)^2 +
     (u2-v3)^2 +
     ...
     (un-vn)^2);

Ответ 10

Одним из решений является выполнить сравнение RMS/RSS на каждую пару изображений, необходимых для выполнения сортировки пузырьков. Во-вторых, вы можете выполнить FFT на каждом изображении и сделать некоторое усреднение по оси для получения единственного целого для каждого изображения, которое вы будете использовать в качестве индекса сортировать по. Вы можете рассмотреть возможность сравнения с измененной (25%, 10%) версией оригинала в зависимости от того, насколько мала разница, которую вы предпочитаете игнорировать, и сколько требуется ускорения. Дайте мне знать, если эти решения интересны, и мы можем обсудить или предоставить образец кода.

Ответ 11

Большинство современных подходов к обнаружению ближнего двойного обнаружения изображений используют интересные точки обнаружения и дескрипторы, описывающие область вокруг таких точек. Часто используется SIFT. Затем вы можете quatize дескрипторы и использовать кластеры в качестве словарного словарного словаря.

Итак, если мы увидим на отношение общих визуальных слов двух изображений ко всем визуальным словам этих изображений, вы оцениваете сходство между изображениями. Есть много интересных статей. Одним из них является Обнаружение ближнего Duplicate Image: minHash и tf-idf Weighting