Определите, является ли изображение обрезанной версией другого изображения - PullRequest
0 голосов
/ 23 апреля 2020

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

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

Один случай хеширования восприятия был неадекватным в том случае, когда одно изображение является обрезанной версией другого изображения. Поскольку я работал с 64-битными хэшами, мой показатель c - это расстояние Хемминга. Расстояние 0 - всегда идеальное совпадение, в то время как расстояние 2-3 - это обычно одна и та же фотография, но это могут быть две фотографии из одного сеанса, снятые за секунду или около того. Некоторые из моих примеров для обрезанных изображений имеют расстояние 10 или даже расстояние 20. Кажется, что хеширование восприятия работает очень плохо, когда изображение B в основном является изображением A, за исключением добавления области без фотографии c с текстом. Например, изображение A может быть фотографией людей, занимающихся йогой, а изображение B - это та же фотография с баннером внизу, описывающим, какая это студия йоги и где можно найти информацию о занятиях.

Хорошая новость заключается в том, что восприятие ha sh, по крайней мере, в этом случае делает достаточно хорошо, чтобы создать «короткий список» фотографий для запуска более дорогой процедуры сравнения и с использованием поиска. Дерево может найти этот короткий список за минимальное время. Однако большинство совпадений в коротком списке на расстоянии 10 или 15 не представляют избыточности, а вместо этого другие фотографии из той же фотосессии или даже ложные позитивы, которые имеют подобные перцептивные хеши просто по совпадению.

Что было бы правильным способом сравнить два изображения и определить, насколько вероятно, что одно является обрезанным вариантом другого? Я пробовал skimage.measure.compare_ssim, но это требует, чтобы два изображения имели одинаковый размер, и дает бессмысленные результаты, если размер B изменяется в соответствии с А. Я пробовал cv2.matchTemplate, но это, похоже, всегда возвращает совпадение, даже для совершенно не связанных изображений. Кажется, что он просто делает все возможное, чтобы найти регион, который является наилучшим возможным совпадением (даже если наилучшее возможное совпадение не является хорошим). matchTemplate отлично показал область B, представляющую A, но я не смог найти способ использовать это в , является ли A областью B. Он также асимметричен, с шаблоном и исходное изображение, которое не подходит для этой цели. Возможно, изображение A на самом деле больше по количеству пикселей, а B добавляет текстовую область к A, а также сокращается. Это означает, что я не могу легко определить, какой должен быть источником, а какой должен быть шаблоном.

Какие существуют другие решения? Я в порядке с решением, которое работает «довольно хорошо», с последующим этапом проверки человеческим глазом.

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