Обнаружение, если два изображения визуально идентичны - PullRequest
38 голосов
/ 03 декабря 2008

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

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

редактировать: соответствующий код из 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: Warning! Объект ImageMagick $ image, похоже, содержит информацию о времени создания файла изображения, который был прочитан. Это означает, что полученный вами двоичный объект будет отличаться даже для одного и того же изображения, если он был найден в другое время. Чтобы убедиться, что отпечаток остается прежним, используйте $ image-> getImageSignature () в качестве последнего шага.

Ответы [ 8 ]

14 голосов
/ 03 декабря 2008

findimagedupes довольно хорошо. Вы можете запустить «findimagedupes -v фингерпринт изображения», чтобы позволить ему напечатать «проницательный хэш», например.

5 голосов
/ 15 августа 2009

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

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

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

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

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

4 голосов
/ 03 декабря 2008

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

1 голос
/ 03 декабря 2008

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

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

0 голосов
/ 03 декабря 2008

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

0 голосов
/ 03 декабря 2008

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

0 голосов
/ 03 декабря 2008

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

и т.д ...

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

0 голосов
/ 03 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...