Обнаружение равенства изображений при разных разрешениях - PullRequest
9 голосов
/ 10 ноября 2009

Я пытаюсь создать скрипт для просмотра моих оригинальных фотографий в высоком разрешении и замены старых фотографий в низком разрешении, которые я загрузил на Flickr до того, как у меня появился профессиональный аккаунт.

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

Итак, не в состоянии полагаться на метаданные, я вынужден прибегнуть к самому контенту. Проблема в том, что оригиналы имеют разрешение, отличное от оригинала на Flickr (в этом и заключается весь смысл). Так есть ли для меня способ сравнить их с неким нечетким показателем сходства, который позволил бы мне установить порог, требующий участия человека, или нет?

Полагаю, знание того, что одно изображение является измененной версией другого, может дать лучшие результаты, чем общее сходство. Решение на любом языке подойдет, но Ruby будет плюсом:)

Ответы [ 3 ]

7 голосов
/ 10 ноября 2009

Интересная проблема, кстати:)

Медленное решение - отличный шанс на успех

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

Я бы порекомендовал SIFT , который генерирует 128-целочисленный дескриптор с инвариантом масштаба и поворота для функции, найденной на изображении. SURF (доступно в OpenCV) - еще один (более быстрый) детектор характерных точек.

Вы можете сопоставить объекты на двух изображениях с помощью грубой силы (сравните каждый дескриптор с дескриптором на другом изображении), что равно O (n ^ 2), но довольно быстро (особенно в реализации VL SIFT). Но если вам нужно сравнить элементы одного изображения с несколькими изображениями (что может потребоваться), вы должны построить дерево объектов, чтобы запросить его с функциями другого изображения. K-D деревья полезны, и у OpenCV есть хорошая реализация.

Быстрое решение - может сработать

Уменьшите изображение в высоком разрешении до размеров низкого разрешения и используйте меру подобия, например SAD (где сумма различий между, скажем, 3x3 пикселями вокруг пикселя в обоих изображениях равна оценка) для определения соответствия.

3 голосов
/ 10 ноября 2009

Вычислите нормализованную цветную гистограмму обоих изображений и сравните их, используя некоторый метод (например, пересечение гистограммы - см. Ссылку выше). Обратите внимание, что нормализованная гистограмма необходима, поскольку изображения имеют разное разрешение. Если изображения настолько разные, они не совпадают. Но если они похожи, у вас есть один из этих двух случаев: (i) они - одно и то же изображение, или (ii) они - разные изображения, но имеют схожие глобальные цветовые распределения.

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

3 голосов
/ 10 ноября 2009

Я бы порекомендовал написать решение для ImageMagick. Следующее (из документации сравнения изображений с IM ) выведет сравнительное значение, которое вы можете использовать.

convert image1 image2 \
        -compose difference -composite -colorspace gray miff:- |\
  identify -verbose - |\
    sed -n '/^.*Mean: */{s//scale=2;/;s/(.*)//;s/$/*100\/32768/;p;q;}' | bc
...