2010-11-04 3 views
3

Как сравнить два изображения и определить, являются ли они на 100% похожими или изменены только цветом или обрезкой?Как сравнить два изображения для обнаружения дубликатов и обрезанных дубликатов?

+0

Вы говорите о точных дубликатах, которые были искусственно окрашены? Или вы имеете в виду две разные фотографии одного и того же. Это может существенно повлиять на подход. – Pace

+0

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

ответ

2

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

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

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

Чтобы проверить цвет в зависимости от цвета, вы можете посмотреть значения HLS (оттенок, легкость и насыщенность). Если пиксели имеют одинаковые значения L & S, но другое значение H, то это просто цвет, который отличается (я думаю).

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

+0

Это очень интересно и полезно. Мне нужно будет определить, как подойти к этому для каждого формата изображения. – LamonteCristo

3

Ну, абстрактно говоря, вам нужно определить функцию подобия, которая сравнивает два изображения. Для того, чтобы определить, если изображения «100% похожи» (равно), вы можете сделать следующее:

  • сравнить размеры изображений
  • , если размеры изображения одинаковы просто вычитать пиксели друг от друга
  • if (sum(abs(pixel_1_i - pixel_2_j))/num_pixels < threshold) return true

Для случая, когда изображения по-разному цвета, или обрезано

  • применить е Детектор DGE для обоих изображений
  • вычислить взаимную корреляцию (в частотной области, FFT)
  • найти самый высокий пик
  • установи (меньше) края карты в определенном положении
  • вычислить абсолютную ошибку
  • if (error < threshold) return true

BTW: Этот подход не будет работать, если ваши изображения масштабируются или повернуты.

Дальнейшие исследования:

  • cross-correlation: БПФ (быстрое преобразование Фурье, link1, link2, FFT in C#), нулевая обивка (необходимо для быстрого преобразования Фурье, если входные сигналы имеют разные размеры)
  • края обнаружение: Sobel, Canny (это очень распространенные фильтры для обработки изображений, они должны быть доступны в C# библиотеки, так же, как FFT)
+0

Предполагается, что это внутренняя петля пикселей или может работать без циклического перехода через все пиксели «if (sum (abs (pixel_1_i - pixel_2_j))/num_pixels Josh

+0

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

+0

Не могли бы вы помочь мне с кодом C#? – Josh

1

Вы можете использовать объект дескрипторы, такие как:

SIFT - http://en.wikipedia.org/wiki/Scale-invariant_feature_transform

SURF - http://en.wikipedia.org/wiki/SURF

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

Также дескрипторы состоят из ориентированных градиентов, что означает, что эти дескрипторы являются надежными для освещения и изменения цвета.

Вы можете использовать Accord.NET (реализация SURF).