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





Прочтите статью: Порикли, Фатих, Онсел Тузель и Питер Меер. «Отслеживание ковариации с использованием обновленной модели о средствах на римановых многообразиях ». (2006) IEEE Computer Vision and Pattern Recognition.
Я успешно смог обнаружить перекрывающиеся области на изображениях, снятых со смежных веб-камер, используя технику, представленную в этой статье. Моя ковариационная матрица состояла из выходных сигналов Sobel, canny и SUSAN для определения аспекта / края, а также исходных пикселей в градациях серого.
@Satoru Logic: поиск в Google показывает совпадения на бумаге: google.com/….
Это действительно намного менее просто, чем кажется :-) Предложение Ника хорошее.
Для начала имейте в виду, что любой стоящий метод сравнения будет работать, по сути, путем преобразования изображений в другую форму - форму, которая упрощает выбор похожих функций. Обычно такие вещи не годятся для легкого чтения ...
Один из самых простых примеров, который я могу придумать, - это просто использовать цветовое пространство каждого изображения. Если два изображения имеют очень похожее цветовое распределение, вы можете быть уверены, что они показывают одно и то же. По крайней мере, у вас может быть достаточно уверенности, чтобы отметить это или провести дополнительное тестирование. Сравнение изображений в цветовом пространстве также будет препятствовать таким вещам, как поворот, масштабирование и некоторая обрезка. Конечно, он не устоит перед серьезной модификацией изображения или серьезным перекрашиванием (и даже простое изменение оттенка будет несколько сложным).
http://en.wikipedia.org/wiki/RGB_color_space
http://upvector.com/index.php?section=tutorials&subsection=tutorials/colorspace
Другой пример связан с так называемым преобразованием Хафа. Это преобразование по существу разбивает изображение на набор линий. Затем вы можете взять некоторые из «самых сильных» линий на каждом изображении и посмотреть, совпадают ли они. Вы можете проделать некоторую дополнительную работу, чтобы попытаться компенсировать вращение и масштабирование - и в этом случае, поскольку сравнение нескольких строк - это НАМНОГО меньше вычислительной работы, чем выполнение того же самого со всеми изображениями - это будет не так уж плохо.
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
Если вы готовы рассмотреть совершенно другой подход к обнаружению нелегальных копий ваших изображений, вы можете рассмотреть вариант водяные знаки. (с 1.4)
...inserts copyright information into the digital object without the loss of quality. Whenever the copyright of a digital object is in question, this information is extracted to identify the rightful owner. It is also possible to encode the identity of the original buyer along with the identity of the copyright holder, which allows tracing of any unauthorized copies.
Хотя это также сложное поле, существуют методы, которые позволяют сохранить информацию о водяных знаках путем грубого изменения изображения: (с 1.9)
... any signal transform of reasonable strength cannot remove the watermark. Hence a pirate willing to remove the watermark will not succeed unless they debase the document too much to be of commercial interest.
Конечно, в часто задаваемых вопросах реализация этого подхода называется «... очень сложной задачей», но если вам это удастся, вы получите высокую уверенность в том, является ли изображение копией или нет, а не процентную вероятность.
Есть дополнительная информация о том, как водяные знаки сохраняются после тяжелого редактирования? Звучит очень интересно.
Это всего лишь предложение, оно может не сработать, и я готов к тому, что меня вызовут по этому поводу.
Это приведет к ложным срабатываниям, но, надеюсь, не к ложноотрицательным.
Измените размер обоих изображений так, чтобы они были одинакового размера (я предполагаю, что отношение ширины к длине одинаково для обоих изображений).
Сожмите растровое изображение обоих изображений с помощью алгоритма сжатия без потерь (например, gzip).
Найдите пары файлов с одинаковым размером. Например, вы можете просто отсортировать каждую пару файлов, которые у вас есть, по степени схожести размеров файлов и получить верхний X.
Как я уже сказал, это определенно приведет к ложным срабатываниям, но, надеюсь, не к ложным отрицаниям. Вы можете реализовать это за пять минут, тогда как Porikil et. al. вероятно, потребуется большая работа.
Мне очень нравится это решение, его легко реализовать, и я верю, что оно даст более высокую скорость идентификации, чем случайная.
Возникает вопрос: работает ли копия, сохраненная с другим разрешением?
Я считаю, что если вы готовы применить этот подход ко всем возможным ориентациям и негативным версиям, хорошим началом распознавания изображений (с хорошей надежностью) будет использование собственных лиц: http://en.wikipedia.org/wiki/Eigenface
Другая идея - преобразовать оба изображения в векторы их компонентов. Хороший способ сделать это - создать вектор, который работает в размерах x * y (x - ширина вашего изображения, а y - высота), со значением для каждого измерения, применяемым к значению пикселя (x, y). Затем запустите вариант K-ближайших соседей с двумя категориями: совпадение и отсутствие совпадения. Если оно достаточно близко к исходному изображению, оно будет соответствовать категории соответствия, если нет, то нет.
K Nearest Neighbours (KNN) можно найти здесь, есть и другие хорошие объяснения этого в Интернете: http://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm
Преимущества KNN в том, что чем больше вариантов вы сравниваете с исходным изображением, тем точнее становится алгоритм. Обратной стороной является то, что вам понадобится каталог изображений, чтобы сначала обучить систему.
Хорошая идея, но только если в данных присутствуют лица. Также он определяет людей, а не ситуации. Поэтому профессиональный актер, фигурирующий в нескольких публикациях, будет генерировать много ложных срабатываний.
Если я не понимаю ваше намерение использовать
На самом деле я считаю, что алгоритм работает независимо от предмета, поэтому, если вы сравниваете деревья, это тоже было бы полезно. Просто так получилось, что он называется Eigenfaces, потому что он классически ассоциируется с распознаванием лиц. Пока предмет для поиска обладает теми же общими характеристиками, что и предмет, с которым вы сравниваете, он все равно должен работать.
Слишком долго, чтобы добавить к предыдущему комментарию: Также: Eigenfaces сравнивает все изображение, а не только лица на экране. В примерах в Википедии используются только обрезанные лица, потому что традиционным приложением является распознавание лиц, для которого полезно только лицо. Если бы ваш актер появлялся на разных позициях, он был бы помечен как другой.
Собственные лица хорошо работают с лицами, потому что изображения различных выражений лица очень похожи и могут быть аппроксимированы как низкоразмерное линейное подпространство пространства изображения. Я не могу понять, как это приближение может работать для общих аффинных преобразований любого вида изображения.
Моя ошибка, я, должно быть, неправильно понял, как работают собственные лица. Я по-прежнему считаю, что применение многомерного сопоставления и K-ближайших соседей может помочь, в зависимости от его конкретного приложения.
Я сомневаюсь, что применение KNN напрямую к необработанным значениям пикселей тоже сильно поможет. Небольшие перемещения / вращения обычно приводят к огромным различиям в необработанных значениях пикселей, особенно если изображение содержит резкие контрасты или тонкие линии. Таким образом, произвольно преобразованные версии одного и того же изображения не совсем близко друг к другу в этом пространстве (они не распадаются на кластеры), и KNN не будет работать очень хорошо. Я предполагаю, что это могло бы хорошо работать с гистограммами изображений или каким-либо другим инвариантным к преобразованию представлением изображения.
В том виде, в котором вы его описываете, проблема стоит очень остро. Считаете ли вы копирование, вставку части изображения в другое изображение большего размера как копию? и Т. Д.
Если вы сделаете шаг назад, это легче решить, если вы нанесете водяной знак на эталонные изображения. Вам нужно будет использовать схему водяных знаков, чтобы встроить код в изображение. Чтобы сделать шаг назад, в отличие от некоторых низкоуровневых подходов (обнаружение краев и т. д.), Предлагаемых некоторыми людьми, метод водяных знаков лучше, потому что:
Устойчив к атакам обработки сигналов. ► Улучшение сигнала - резкость, контраст и т. д. ► Фильтрация - медиана, низкие частоты, высокие частоты и т. д. ► Аддитивный шум - гауссовский, равномерный и т. д. ► Сжатие с потерями - JPEG, MPEG и т. д.
Устойчив к геометрическим атакам. ► Аффинные преобразования ► Обработка данных - обрезка, обрезка и т. д. ► Случайные локальные искажения ► Деформация
Изучите алгоритмы создания водяных знаков, и вы будете на правильном пути к решению своей проблемы. ( Примечание. Вы можете протестировать свой метод, используя набор данных STIRMARK. Это общепринятый стандарт для приложений такого типа.
Идея:
Шаг 2 нетривиальный. В частности, вам может потребоваться умный алгоритм, чтобы найти наиболее похожую ключевую точку на другом изображении. Дескрипторы точек обычно очень многомерны (например, сотня параметров), и есть много точек, которые нужно просмотреть. Здесь могут быть полезны kd-деревья, поиск по хешам не работает.
Варианты:
Я тоже считаю, что это правильный подход. Просто деталь: SIFT, SURF, GLOH не являются детекторами ключевых точек. Это дескрипторы ключевых точек. Распространенными детекторами ключевых точек являются (масштабно-инвариантные) детекторы DoG, Харриса или собственные значения.
Для шага 2 вы можете использовать ближайших соседей, которые используют евклидово расстояние между дескрипторами.
Если вы используете 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 должен исправить любое смещение, чтобы команда сравнения действительно имела шанс обнаружить те же пиксели.
Как определить, какой из них оригинал?