Обнаружение почти повторяющихся изображений [закрыто]

93

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

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

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

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

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

Неизвестный
источник
5
Ключевой вопрос, размышляя о том, что вы написали, и о некоторых ответах на связанный вопрос, который указал Наафф, вы можете более четко определить, что означает «сходство». Будет ли изображение, идентичное, но со смещением в пять пикселей, «похожим»? Визуально да ... но для алгоритма ... вероятно, нет, если вы не подумали об этом и не учли его. Вы можете предоставить более подробную информацию? Дубликаты будут точными или просто «близкими»? Вы смотрите на сканы, где они могут отличаться на небольшой угол? Как насчет интенсивности? Здесь много переменных ...
Беска
Чем отличаются «дубликаты»? например, будут ли они изображения одного и того же места с разной позой / сдвигом? Кажется, вам нужно что-то, что составляет O (nlog (n)) с количеством изображений. Кто-нибудь знает возможно ли это? Кажется, это может быть ..
Джастин Шайнер
@The Unknown: Если вас не устраивает ни один из текущих ответов, не могли бы вы дать нам еще какие-нибудь рекомендации? Мы постарались ответить на ваш вопрос, но без обратной связи вряд ли придумаем что-то лучшее.
Naaff
В настоящее время это одна из больших нерешенных проблем компьютерных наук. Удачи, приятель.
Джон Ктеджик

Ответы:

70

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

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

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

Naaff
источник
3
эта статья датирована 2004 годом, не уверены, что это лучший ответ?
Эндрю
50

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

Более качественный дайджест вашего изображения может быть получен, если вы возьмете двумерный вейвлет Хаара изображения (это намного проще, чем кажется, это просто большое усреднение и некоторые квадратные корни, используемые для взвешивания ваших коэффициентов) и просто сохраните k наибольшего взвешенные коэффициенты в вейвлете как разреженный вектор, нормализуйте его и сохраните, чтобы уменьшить его размер. Вы должны изменить масштаб RG и 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

Эдвард КМЕТТ
источник
Похоже, вы косвенно описываете kd-деревья и тому подобное для поиска места для потенциальных кандидатов. Возможно, стоит отметить это.
Boojum
1
Что ж, причина, по которой я не указал методы, кроме некой расплывчатой ​​аллюзии, заключается в том, что kd-деревья хорошо работают, когда у вас относительно небольшое количество измерений в вашем пространстве. Здесь у вас, вероятно, ~ 128 или более измерений, которые редко заполнены. Поскольку они редкие, большинство значений будет нулевым, поэтому циклический перебор по измерениям для разделения в стиле kd практически бесполезен. По той же причине ломаются R-деревья, и, скорее всего, ваш лучший выбор - X-деревья. К сожалению, они также близки к пределу своих возможностей, когда сталкиваются с таким количеством измерений.
Эдвард КМЕТТ 04
«и просто сохранить k наибольших взвешенных коэффициентов в вейвлете как разреженный вектор» - сохранить для каждой строки или для всего вейвлета?
ivan.ukr
«Вы должны изменить масштаб RG и B заранее, используя перцепционные веса, по крайней мере, или я бы рекомендовал переключиться на YIQ (или YCoCg, чтобы избежать шума квантования), чтобы вы могли сэмплировать информацию о цветности с пониженной важностью». - а что тогда? Сделать вейвлет только для Y или сделать это для всех каналов? Если сделать для всех каналов - как измерить сходство изображений с несколькими каналами? добавить скалярные произведения каждого канала и учитывать это как меру сходства или должно быть какое-то взвешенное дополнение?
ivan.ukr
15

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

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

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

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

Люк Франкл
источник
Может ли он по-прежнему распознавать повернутые изображения?
endolith
Я сомневаюсь, что это сработает очень хорошо. Вероятно, вы захотите кодировать изображения для каждого поворота, чтобы максимизировать соответствующие совпадения.
Люк Франкл,
Ссылка на retrievr не работает - это где-нибудь заархивировано?
mmigdol
10

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

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

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

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

Нил
источник
1
Это спорный вопрос, но вы МОЖЕТЕ использовать одно целое число для представления комбинации любого количества функций, если, например, функция x = 2 и функция y = 3, функция z = 5 и функция aa = 7 и так далее, тогда степень, до которой было возведено это простое основание в факторизованной форме единственного целого числа, будет значением свойства для этого конкретного изображения. Опять же, спорный вопрос, потому что размер числа был бы абсурдным. Хотя этот размер можно еще уменьшить ... мы просто говорим о структурированных данных.
argyle 02
Правда. Но самое главное - расположить числа так, чтобы похожие изображения численно были близки друг к другу. Несмотря на то, что я сказал выше, это возможно. Короче говоря, вы можете решить задачу «Коммивояжер», чтобы найти минимальный (или почти минимальный) путь через изображения в n-мерном пространстве (где n - количество функций, которые вы хотите использовать для сравнения изображений). Но это дорого.
Нил
8

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

никто
источник
5

Вы должны решить, что такое «подобное». Контраст? Оттенок?

Изображение "похоже" на то же изображение в перевернутом виде?

Бьюсь об заклад, вы можете найти множество «близких вызовов», разбив изображения на части 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

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

zproxy
источник
3
Код, стоящий за tineye, кажется, именно то, что нужно спрашивающему, но я не думаю, что как веб-сервис это очень полезно, поскольку нет (очевидного) способа дать ему два изображения и спросить: «Это одно и то же? " - второе изображение должно быть на веб-странице и проиндексировано tineye
dbr 02
1
Может быть, они предоставляют API для бизнес-пользователей? С ними следует связаться по этому поводу.
zproxy
Существует коммерческий API, который предоставляет именно это services.tineye.com/MatchEngine .
Gajus
1

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

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

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

distance = Sqrt(
     (u1-v1)^2 +
     (u2-v2)^2 +
     (u2-v3)^2 +
     ...
     (un-vn)^2);
Ян Бойд
источник
2
Большинство естественных изображений имеют очень похожее частотное содержание, поэтому я сомневаюсь, что это будет очень хороший показатель.
Hannes Ovrén
1

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

Павел
источник
БПФ предоставляет вам только информацию о цвете, но не информацию о положении. При изменении размера игнорируются все элементы, размер которых меньше заданного, независимо от того, как они влияют на результирующее изображение. Серое изображение и шахматная доска могут быть идентичны по этому показателю. Вейвлет-подход (Добеши, Хаара и т. Д.) Имеет преимущества предоставления информации как о положении, так и о цвете за счет компромисса между информацией о положении и цвете в каждой точке данных.
Эдвард КМЕТТ
2
Нет, БПФ изображения содержит всю пространственную информацию оригинала. Вы можете восстановить оригинал из БПФ. homepages.inf.ed.ac.uk/rbf/HIPR2/fourier.htm Однако гистограмма, о которой вы, возможно, думали, не соответствует действительности.
Пол
1

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

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

ton4eg
источник
1

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

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

Радим Бургет
источник