Как сравнить два изображения для обнаружения дубликатов и обрезанных дубликатов? - PullRequest
3 голосов
/ 04 ноября 2010

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

Ответы [ 3 ]

3 голосов
/ 04 ноября 2010

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

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

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

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

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

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

  • взаимная корреляция : FFT (быстрое преобразование Фурье, link1 , link2 , FFT в C # ), заполнение нулями ( необходим для БПФ, если входные сигналы имеют разные размеры)
  • обнаружение края: Sobel , Canny (это очень распространенные фильтры обработки изображений, они должны быть доступны в библиотеке C#, как FFT)
2 голосов
/ 04 ноября 2010

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

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

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

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

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

1 голос
/ 13 апреля 2014

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

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

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

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

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

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

...