Как сравнить два края изображения (в OpenCV)? - PullRequest
6 голосов
/ 10 октября 2011

в моем проекте мне нужно сравнить с изображениями. Одно изображение показывает модель рендеринга, а другое - фотографию, на которой показан реальный объект, представленный в модели. Что я точно хочу:

  • Алгоритм должен сравнивать два изображения и возвращать число, которое описывает сходство. Скажем, чем меньше число, тем лучше картинки сочетаются друг с другом.
  • Оба изображения представлены в виде двоичных изображений, которые содержат только контуры / края реального рендера-изображения / фотографии.
  • На фотографии гораздо больше объектов, чем на рендере. Поэтому я хочу только проверить, является ли точка обзора объекта рендеринга практически такой же, как точка обзора реального объекта на фотографии. (Пример: автомобиль смоделирован так, что он приближается к реальному автомобилю. Я фотографирую реальный автомобиль с особой позиции и ориентации. Теперь я хочу проверить, смотрят ли положение и ориентация моей виртуальной камеры на машину визуализации почти то же самое, что и положение и ориентация моей реальной камеры). Решение состоит только в том, чтобы сравнить белые пиксели изображения рендеринга с пикселями фотографии (как изображение края). Другие пиксели не интересны.
  • Возвращаемое значение сравнения изображений должно уменьшаться, чем лучше моя ориентация, и положение виртуальной камеры соответствует реальной ориентации и положению камеры.

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

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

Вопрос в том, стоит ли попробовать нормализованную взаимную корреляцию или есть более эффективные методы решения моей проблемы!

Алгоритм должен быть максимально быстрым, потому что я сравниваю множество изображений.

Большое спасибо


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

Вопрос в следующем: хорошо ли использовать два алгоритма для сравнения двух изображений одинакового размера?

Вот пример двух изображений, которые нужно сравнить. Сейчас я сравниваю около 120 изображений-пар в секунду.

Очень жаль, что я не могу публиковать изображения как новый пользователь. Так вот прямая ссылка: http://s14.directupload.net/file/d/2674/t8qzbq9i_png.htm

Ответы [ 2 ]

4 голосов
/ 11 октября 2011

Как насчет экспериментов с расстоянием Хауссдорфа в качестве отправной точки?Общая идея и реализация c здесь .Статья здесь:

Сравнение изображений с использованием расстояния Хаусдорфа , Д. П. Хуттенлохер - 1993.

1 голос
/ 11 октября 2011

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

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

Надеюсь, это полезно!

...