Обнаружение, если два изображения визуально идентичны

Иногда два файла изображений могут отличаться на уровне файлов, но человек считает их восприимчивыми одинаковыми. Учитывая, что теперь предположим, что у вас есть огромная база данных изображений, и вы хотите знать, будет ли человек думать, что какое-то изображение X присутствует в базе данных или нет. Если все изображения имели проницательный хэш/отпечаток пальца, то можно было бы хэш-изображение X, и было бы просто проверить, находится ли он в базе данных или нет.

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

edit: соответствующий код от findimagedupes, используя ImageMagick

try $image->Sample("160x160!");
try $image->Modulate(saturation=>-100);
try $image->Blur(radius=>3,sigma=>99);
try $image->Normalize();
try $image->Equalize();
try $image->Sample("16x16");
try $image->Threshold();
try $image->Set(magick=>'mono');
($blob) = $image->ImageToBlob();

edit: Предупреждение! ImageMagick $image object, похоже, содержит информацию о времени создания файла изображения, который был прочитан. Это означает, что blob, который вы получите, будет отличаться даже для одного и того же изображения, если он был получен в другое время. Чтобы убедиться, что отпечаток остается неизменным, используйте $image- > getImageSignature() в качестве последнего шага.

Ответ 1

findimagedupes довольно хорошо. Например, вы можете запустить "findimagedupes -v отпечатки пальцев", чтобы напечатать "перцептивный хеш", например.

Ответ 2

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

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

Пример MATLAB: Регистрация изображения с использованием нормализованной кросс-корреляции

Википедия называет это " фазовая корреляция", а также описывает , делая его масштабным - и вращение-инвариант:

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

Ответ 3

Гистограмма цвета хороша для того же изображения, которое было изменено, изменено и т.д.

Если вы хотите совместить разные фотографии людей с одной и той же достопримечательностью, это сложнее - посмотрите на классификаторы хара. Opencv - отличная бесплатная библиотека для обработки изображений.

Ответ 4

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

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

Ответ 5

измените размер изображения на 1x1 пиксель... если они точны, есть небольшая вероятность, что они представляют собой одну и ту же картинку... теперь измените размер до изображения 2x2, если все 4 пикселя точны, есть большая вероятность, что они точны... то 3x3, если все 9 пикселей точны... хорошие шансы и т.д. то 4x4, если все 16 пикселей точны,... лучший шанс.

и т.д...

делая это таким образом, вы можете сделать улучшения эффективности... если сетка 1x1 пикселей отключена много, зачем беспокоиться о сетке 2x2? и др.

Ответ 6

Если у вас много изображений, можно использовать цветовую гистограмму, чтобы получить грубую близость изображений, прежде чем выполнять полное сравнение изображений каждого изображения друг с другом (т.е. O (n ^ 2)).

Ответ 7

Вы можете использовать diff, чтобы увидеть, являются ли они ДЕЙСТВИТЕЛЬНО разными. Думаю, он удалит много бесполезного сравнения. Тогда для алгоритма я бы использовал вероятностный подход. Каковы шансы, что они будут выглядеть одинаково. Я основывал это на количестве rgb в каждом пикселе. Вы также можете найти некоторые другие показатели, такие как светимость и тому подобное.

Ответ 8

Существует DPEG, " Диспетчер дублирующих носителей, но его код не открыт. Это очень старый инструмент - я помню, как его использовали в 2003 году.