it-swarm.com.ru

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

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

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

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

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

RGB Average за изображение отстой, есть что-то похожее?

90
The Unknown

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

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

Если вы ищете что-то более простое, но определенно более специальное, у этого SO вопроса есть несколько приличных идей.

68
Naaff

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

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

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

Вы можете обменять хранение и точность, увеличив или уменьшив k.

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

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

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

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

49
Edward KMETT

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

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

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

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

15
Luke Francl

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

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

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

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

10
Neil

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

8
Andrew Medico

Вы должны решить, что является "похожим". Контраст? Оттенок?

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

Могу поспорить, что вы можете найти много "близких вызовов", разбив изображения на 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. Вес зеленый самый высокий, затем красный, затем синий, чтобы соответствовать визуальной чувствительности человека.

5
Nosredna

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

5
zproxy

Вопрос Хороший способ идентифицировать похожие изображения?, кажется, дает решение для вашего вопроса.

2
Alix Axel

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

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

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

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

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

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

1
ton4eg

Например, используя расширение IMMI и IMMI, вы можете изучить много разных способов измерения сходства между изображениями: http://spl.utko.feec.vutbr.cz/en/component/content/article/46-image- обработка-расширение-для-RapidMiner-5

Определив порог и выбрав метод, вы можете измерить сходство.

1
Radim Burget

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

1
Paul