Алгоритм сравнения двух изображений

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

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

Как определить, какой из них оригинал?

jfs 23.08.2008 07:50

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

unfa 21.12.2016 11:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
160
2
135 378
8

Ответы 8

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

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

@Satoru Logic: поиск в Google показывает совпадения на бумаге: google.com/….

Nick 10.08.2010 07:40

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

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


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

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.

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

Есть дополнительная информация о том, как водяные знаки сохраняются после тяжелого редактирования? Звучит очень интересно.

Tom Gullen 10.08.2010 13:06

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

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

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

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

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

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

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

Tom Gullen 10.08.2010 05:34

Возникает вопрос: работает ли копия, сохраненная с другим разрешением?

Dr. belisarius 13.08.2010 06:54

Я считаю, что если вы готовы применить этот подход ко всем возможным ориентациям и негативным версиям, хорошим началом распознавания изображений (с хорошей надежностью) будет использование собственных лиц: 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 в том, что чем больше вариантов вы сравниваете с исходным изображением, тем точнее становится алгоритм. Обратной стороной является то, что вам понадобится каталог изображений, чтобы сначала обучить систему.

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

Tom Gullen 10.08.2010 05:37

Если я не понимаю ваше намерение использовать

Tom Gullen 10.08.2010 05:39

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

Nick Udell 10.08.2010 19:03

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

Nick Udell 10.08.2010 19:11

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

Niki 12.08.2010 16:35

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

Nick Udell 13.08.2010 00:44

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

Niki 13.08.2010 04:24

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

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

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

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

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

Идея:

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

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

Варианты:

  • Обнаруживайте края или другие объекты вместо точек.

Я тоже считаю, что это правильный подход. Просто деталь: SIFT, SURF, GLOH не являются детекторами ключевых точек. Это дескрипторы ключевых точек. Распространенными детекторами ключевых точек являются (масштабно-инвариантные) детекторы DoG, Харриса или собственные значения.

Niki 12.08.2010 16:29

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

MobileCushion 06.05.2011 18:37

Если вы используете 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 должен исправить любое смещение, чтобы команда сравнения действительно имела шанс обнаружить те же пиксели.

Другие вопросы по теме