Алгоритм сравнения двух изображений - PullRequest
154 голосов
/ 23 августа 2008

Учитывая два разных файла изображения (в любом формате, который я выберу), мне нужно написать программу, чтобы предсказать вероятность того, что один является нелегальной копией другого. Автор копии может делать такие вещи, как поворот, создание негатива или добавление тривиальных деталей (а также изменение размера изображения).

Знаете ли вы какой-нибудь алгоритм для выполнения такой работы?

Ответы [ 9 ]

291 голосов
/ 10 августа 2010

Это просто идеи, о которых я думал, никогда не пробовал, но мне нравится думать о таких проблемах!

Прежде чем начать

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

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

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

Проверка алгоритмов

Вам следует протестировать (как минимум) большой анализируемый человеком набор тестовых данных, совпадения которых известны заранее. Если, например, в ваших тестовых данных у вас есть 1000 изображений, из которых 5% соответствуют, у вас теперь есть достаточно надежный тест. Алгоритм, который находит 10% позитивов, не так хорош, как алгоритм, который находит 4% позитивов в наших тестовых данных. Тем не менее, один алгоритм может найти все совпадения, но также может иметь большой процент ложных срабатываний 20%, поэтому существует несколько способов оценить ваши алгоритмы.

Данные испытаний должны быть направлены на то, чтобы охватить как можно больше типов динамики, которые вы ожидаете найти в реальном мире.

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

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

Цветные ведра

С двумя картинками отсканируйте каждый пиксель и посчитайте цвета. Например, у вас могут быть «ведра»:

white
red
blue
green
black

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

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

Обнаружение края

Как насчет использования Edge Detection . альтернативный текст http://upload.wikimedia.org/wikipedia/en/thumb/8/8e/EdgeDetectionMathematica.png/500px-EdgeDetectionMathematica.png

С двумя подобными изображениями обнаружение края должно предоставить вам полезный и довольно надежный уникальный след.

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

alt text

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

Регионы интересов

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

альтернативный текст http://meetthegimp.org/wp-content/uploads/2009/04/97.jpg

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

Если у вас есть более 2 областей интереса, вы можете измерить расстояния между ними. Возьмите этот упрощенный пример:

альтернативный текст http://www.per2000.eu/assets/images/3_dots_black_03.jpg

У нас есть 3 прозрачных области интереса. Расстояние между областями 1 и 2 может составлять 200 пикселей, от 1 до 3 400 пикселей и от 2 до 3 200 пикселей.

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

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

морфинг

Морфинг Два изображения - это процесс превращения одного изображения в другое с помощью набора шагов:

alt text

Обратите внимание, это отличается от перехода одного изображения в другое!

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

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

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

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

Архивирование

Ответ Оу в этом вопросе превосходен, я помню, как читал об этих методах изучения ИИ. Он весьма эффективен при сравнении лексиконов корпуса.

Одна интересная оптимизация при сравнении корпусов состоит в том, что вы можете удалить слова, которые считаются слишком общими, например «The», «A», «And» и т. Д. Эти слова ослабляют наш результат, мы хотим выяснить, насколько отличаются два корпуса, так что они могут быть удалены перед обработкой. Возможно, есть похожие сигналы на изображениях, которые можно удалить перед сжатием? Возможно, стоит разобраться.

Коэффициент сжатия - это очень быстрый и достаточно эффективный способ определения того, насколько похожи два набора данных. Читая о , как работает сжатие , вы поймете, почему это может быть настолько эффективно. Для быстрого выпуска алгоритма это, вероятно, будет хорошей отправной точкой.

Прозрачность

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

Инвертирующие сигналы

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

альтернативный текст http://www.themotorreport.com.au/wp-content/uploads/2008/07/noise-cancellation.gif

Инвертируйте изображения и добавьте их на другое изображение. Повторяйте масштабирование позиций / циклов до тех пор, пока не найдете результирующее изображение с достаточным количеством пикселей белого (или черного? Я буду называть его нейтральным холстом), чтобы получить положительное или частичное совпадение.

Однако рассмотрим два одинаковых изображения, за исключением того, что к одному из них применен эффект яркости:

alt text

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

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

древовидные структуры данных

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

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

Возможно, это не сработает, но это идея. Структура данных trie отлично подходит для хранения лексиконов, например словаря. Это префиксное дерево. Возможно, можно создать образ, эквивалентный лексикону (опять же, я могу думать только о цветах), чтобы построить дерево. Если вы уменьшите, скажем, изображение 300x300 до 5x5 квадратов, то разбейте каждый квадрат 5x5 на последовательность цветов, из которых вы могли бы построить три из полученных данных. Если квадрат 2х2 содержит:

FFFFFF|000000|FDFD44|FFFFFF

У нас есть довольно уникальный трехблочный код, который расширяет 24 уровня, увеличивая / уменьшая уровни (IE уменьшая / увеличивая размер нашего квадрата), можно получить более точные результаты.

Сравнение трех деревьев должно быть достаточно простым и могло бы обеспечить эффективные результаты.

Больше идей

Я наткнулся на интересную статью о классификации спутниковых снимков , в ней говорится:

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

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

Другие вопросы для рассмотрения

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

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

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

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

Будьте осторожны, чтобы не попытаться завершить бесконечный проект, удачи!

35 голосов
/ 23 августа 2008

Прочитайте газету: Порикли, Фатих, Онсель Тюзел и Питер Меер. «Отслеживание ковариантности с использованием обновления модели на основе о средствах на римановых многообразиях ». (2006) IEEE Computer Vision и распознавание образов.

Мне удалось обнаружить перекрывающиеся области на изображениях, снятых с соседних веб-камер, с использованием методики, представленной в этой статье. Моя ковариационная матрица состояла из выходных сигналов Sobel, canny и SUSAN, а также из оригинальных пикселей в оттенках серого.

33 голосов
/ 12 августа 2010

Идея:

  1. использовать детекторы ключевых точек для поиска инвариантных по масштабам и преобразованию дескрипторов некоторых точек изображения (например, SIFT, SURF, GLOH или LESH).
  2. попробуйте выровнять ключевые точки с одинаковыми дескрипторами из обоих изображений (как при сшивании панорамы), при необходимости разрешите некоторые преобразования изображения (например, масштабирование и поворот или эластичное растяжение).
  3. если многие ключевые точки хорошо выровнены (существует такое преобразование, ошибка выравнивания ключевых точек низкая или «энергия» преобразования низкая и т. Д.), Вероятно, у вас есть похожие изображения.

Шаг 2 не тривиален. В частности, вам может понадобиться использовать интеллектуальный алгоритм, чтобы найти наиболее похожую ключевую точку на другом изображении. Точечные дескрипторы обычно очень многомерны (например, сто параметров), и есть много точек, которые нужно просмотреть. Здесь могут быть полезны kd-деревья, поиск по хешу не работает.

Варианты:

  • Обнаружение краев или других объектов вместо точек.
15 голосов
/ 17 сентября 2008

Это действительно намного проще, чем кажется :-) Предложение Ника - хорошее.

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


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

http://en.wikipedia.org/wiki/RGB_color_space
http://upvector.com/index.php?section=tutorials&subsection=tutorials/colorspace


Другой пример включает нечто, называемое преобразованием Хафа. Это преобразование по существу разлагает изображение на набор линий. Затем вы можете взять некоторые из «самых сильных» линий на каждом изображении и посмотреть, совпадают ли они. Вы можете проделать некоторую дополнительную работу, чтобы попытаться компенсировать вращение и масштабирование - и в этом случае, поскольку сравнение нескольких строк является НАМНОГО менее вычислительной работой, чем выполнение того же самого для целых изображений - это не будет так плохо. 1011 *

http://homepages.inf.ed.ac.uk/amos/hough.html
http://rkb.home.cern.ch/rkb/AN16pp/node122.html
http://en.wikipedia.org/wiki/Hough_transform

8 голосов
/ 12 августа 2010

Вам нужно будет использовать схему водяных знаков для встраивания кода в изображение. Чтобы сделать шаг назад, в отличие от некоторых низкоуровневых подходов (обнаружение краев и т. Д.), Предложенных некоторыми людьми, метод водяных знаков лучше, потому что:

Устойчив к атакам обработки сигналов ► Усиление сигнала - повышение резкости, контрастности и т. Д. ► Фильтрация - средний, низкий, высокий и т. Д. ► Аддитивный шум - гауссовский, равномерный и т. Д. ► Сжатие с потерями - JPEG, MPEG и т. Д.

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

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

5 голосов
/ 26 августа 2009

Это всего лишь предложение, оно может не сработать, и я готов ответить на этот вопрос.

Это приведет к ложным срабатываниям, но, надеюсь, не к ложным отрицаниям.

  1. Измените размеры обоих изображений, чтобы они были одинакового размера (я предполагаю, что отношения ширины к длине одинаковы на обоих изображениях).

  2. Сжать растровое изображение обоих изображений с помощью алгоритма сжатия без потерь (например, gzip).

  3. Поиск пар файлов с одинаковыми размерами. Например, вы можете просто отсортировать каждую пару файлов по размеру файлов и получить верхний X.

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

4 голосов
/ 10 августа 2010

Я полагаю, что если вы хотите применить подход к любой возможной ориентации и к отрицательным версиям, хорошее начало для распознавания изображений (с хорошей надежностью) должно использовать собственные лица: http://en.wikipedia.org/wiki/Eigenface

Другая идея состояла бы в том, чтобы преобразовать оба изображения в векторы их компонентов. Хороший способ сделать это - создать вектор, который работает в измерениях x * y (x - это ширина вашего изображения, а y - это высота), причем значение для каждого измерения применяется к значению пикселя (x, y). Затем запустите вариант K-Nearest Neighbours с двумя категориями: совпадение и отсутствие совпадения. Если оно достаточно близко к исходному изображению, оно будет соответствовать категории соответствия, если нет, то не будет.

K Ближайшие соседи (KNN) можно найти здесь, также есть другие хорошие объяснения этого в Интернете: http://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm

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

1 голос
/ 03 апреля 2009

Если вы готовы рассмотреть другой подход к обнаружению нелегальных копий ваших изображений, вы можете рассмотреть водяные знаки . (от 1.4)

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

Хотя это также сложное поле, существуют методы, позволяющие сохранять информацию о водяных знаках при существенном изменении изображения: (с 1,9)

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

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

0 голосов
/ 21 декабря 2016

Если вы используете Linux, я бы предложил два инструмента:

align_image_stack из пакета hugin-tools - это программа командной строки, которая может автоматически исправлять поворот, масштабирование и другие искажения (в основном она предназначена для компоновки HDR-фотографий, но работает и для видеокадров и других документов) , Дополнительная информация: http://hugin.sourceforge.net/docs/manual/Align_image_stack.html

сравнить с пакетом imagemagick - программа, которая может находить и подсчитывать количество разных пикселей в двух изображениях. Вот аккуратное руководство: http://www.imagemagick.org/Usage/compare/ используя -fuzz N%, вы можете повысить устойчивость к ошибкам. Чем выше значение N, тем выше погрешность, чтобы считать два пикселя одинаковыми.

align_image_stack должен исправить любое смещение, чтобы команда сравнения действительно имела шанс обнаружить те же пиксели.

...