Как сравнить два изображения и определить, являются ли они на 100% похожими или изменены только цветом или обрезкой?Как сравнить два изображения для обнаружения дубликатов и обрезанных дубликатов?
ответ
Ниже приведен довольно упрощенный подход к проблеме и не будет хорошо работать с двумя разными фотографиями одного и того же предмета, взятыми с немного разных ракурсов, но будет работать, если у вас есть две копии того же изображения, которое вы хотели проверить.
Случай с двумя идентичными изображениями прост - просто проведите по пиксельным массивам, вычитая значение RGB из другого. Если разница меньше, чем малый допуск, то пиксель идентичен. Таким образом, как только вы обнаружите разницу в пикселях, превышающую толерантность, вы знаете, что изображения разные.
Вы можете разрешить определенное количество или процент различий, чтобы допускать различия в артефактах сжатия.
Чтобы проверить цвет в зависимости от цвета, вы можете посмотреть значения HLS (оттенок, легкость и насыщенность). Если пиксели имеют одинаковые значения L & S, но другое значение H, то это просто цвет, который отличается (я думаю).
Обрезка сложнее, поскольку вам нужно попытаться найти расположение меньшего изображения в более крупном.
Это очень интересно и полезно. Мне нужно будет определить, как подойти к этому для каждого формата изображения. – LamonteCristo
Ну, абстрактно говоря, вам нужно определить функцию подобия, которая сравнивает два изображения. Для того, чтобы определить, если изображения «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)
Предполагается, что это внутренняя петля пикселей или может работать без циклического перехода через все пиксели «if (sum (abs (pixel_1_i - pixel_2_j))/num_pixels
Линия, которую вы цитировали, должна быть суммой абсолютных различий, поэтому имеет смысл делать это по всем пикселям. Вы можете размыть изображение и уменьшить его, если вам нужно сравнить его со многими другими изображениями. – bjoernz
Не могли бы вы помочь мне с кодом C#? – Josh
Вы можете использовать объект дескрипторы, такие как:
SIFT - http://en.wikipedia.org/wiki/Scale-invariant_feature_transform
SURF - http://en.wikipedia.org/wiki/SURF
Затем сравните изображения с помощью вычисленных дескрипторов. Эти дескрипторы позволят вам обрабатывать повернутые, масштабированные и слегка измененные изображения.
Также дескрипторы состоят из ориентированных градиентов, что означает, что эти дескрипторы являются надежными для освещения и изменения цвета.
Вы можете использовать Accord.NET (реализация SURF).
Вы говорите о точных дубликатах, которые были искусственно окрашены? Или вы имеете в виду две разные фотографии одного и того же. Это может существенно повлиять на подход. – Pace
Я ищу только цифровые копии, включая цветные. Никакой подход контрольной суммы, скорее всего, не будет работать здесь ... – LamonteCristo