Определить местоположение изображения на большом изображении - PullRequest
12 голосов
/ 15 февраля 2010

Как определить местоположение изображения на большом изображении? У меня есть неизмененная копия изображения. Это изображение затем изменяется на произвольное разрешение и размещается случайным образом внутри гораздо большего изображения, которое имеет произвольный размер. Никаких других преобразований на полученном изображении не проводится. Код Python был бы идеальным, и, вероятно, потребовал бы libgd . Если вы знаете хороший подход к этой проблеме, вы получите +1.

Ответы [ 4 ]

7 голосов
/ 15 февраля 2010

Существует быстрое и грязное решение, которое состоит в том, чтобы просто сдвинуть окно над целевым изображением и вычислить некоторую меру сходства в каждом месте, а затем выбрать место с наибольшим сходством. Затем вы сравниваете сходство с порогом, если оценка выше порога, вы заключаете, что изображение есть, и это местоположение; если оценка ниже порогового значения, изображение отсутствует.

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

Правильное решение - использовать аффинные инварианты. Попробуйте найти «широкополосное соответствие стерео», люди смотрят на эту проблему в этом контексте. Используемые методы, как правило, примерно такие:

Предварительная обработка исходного изображения

  • Запустите «детектор точек интереса». Это позволит найти несколько точек на изображении, которые легко локализуются, например, углы. Существует много детекторов, детектор под названием «harris-affine» работает хорошо и довольно популярен (так что реализации, вероятно, существуют). Другой вариант - использовать детектор разности Гаусса (DoG), он был разработан для SIFT и также хорошо работает.
  • В каждой интересующей точке выделите небольшое вспомогательное изображение (например, 30x30 пикселей)
  • Для каждого подизображения вычисляется «дескриптор», некоторое представление содержимого изображения в этом окне. Опять же, существует множество дескрипторов. Следует обратить внимание на то, насколько хорошо дескриптор описывает содержимое изображения (вы хотите, чтобы два дескриптора соответствовали, только если они похожи), и насколько он инвариантен (вы хотите, чтобы он был одинаковым даже после масштабирования). В вашем случае, я бы порекомендовал использовать SIFT. Он не так инвариантен, как некоторые другие дескрипторы, но может хорошо справляться с масштабированием, и в вашем случае масштаб - это единственное, что изменяется.

В конце этого этапа у вас будет набор дескрипторов.

Тестирование (с новым тестовым изображением).

  • Сначала вы запускаете тот же детектор точек интереса, что и на шаге 1, и получаете набор точек интереса. Вы вычисляете тот же дескриптор для каждой точки, что и выше. Теперь у вас есть набор дескрипторов для целевого изображения.
  • Далее вы ищете совпадения. В идеале, для каждого дескриптора вашего исходного изображения в целевом изображении должен быть какой-то довольно похожий дескриптор. (Поскольку целевое изображение больше, также будут присутствовать «оставшиеся» дескрипторы, то есть точки, которые ничему не соответствуют на исходном изображении.) Так что, если достаточное количество исходных дескрипторов совпадает с достаточным сходством, то вы знаете, что цель там. Более того, поскольку дескрипторы зависят от местоположения, вы также будете знать, где на целевом изображении находится исходное изображение.
3 голосов
/ 15 февраля 2010

Возможно, вы хотите кросс-корреляция . (Автокорреляция коррелирует сигнал с самим собой; взаимная корреляция коррелирует два разных сигнала.)

Что коррелирует для вас, вместо простой проверки на точные совпадения, так это то, что она скажет вам, где находятся лучшие совпадения и насколько они хороши. Обратная сторона в том, что для двумерного изображения это что-то вроде O (N ^ 3), и это не так просто алгоритм. Но это волшебство, когда ты заставишь его работать.

РЕДАКТИРОВАТЬ: Аааа, вы указали произвольный размер. Это сломает любой корреляционный алгоритм. Извините, вы сейчас вне моего опыта, и ТАК не позволит мне удалить этот ответ.

2 голосов
/ 15 февраля 2010

Взгляните на Преобразования, зависящие от масштаба ; Есть много разных вкусов, которые могут быть более или менее адаптированы к типу изображений, с которыми вы работаете.

2 голосов
/ 15 февраля 2010

http://en.wikipedia.org/wiki/Autocorrelation - мой первый инстинкт.

...