Как я могу сравнить изображения того же происхождения, которые были обрезаны? - PullRequest
3 голосов
/ 01 февраля 2011

Предположим, у меня есть файл изображения / URL, и я хочу, чтобы моя программа искала его в наборе до 100 изображений (или, по крайней мере, в таком порядке). Целевое изображение, которое должно найти программное обеспечение, должно быть «тем же» изображением, что и данное изображение, но оно все равно должно «простить» небольшую обработку любого из них (эти два изображения могли быть обрезаны по-разному или они были сжаты по-другому). Вопрос заключается в том, является ли это выполнимой задачей, учитывая, что у меня не будет ни одного из изображений до начала поиска (т. Е. Не будет никакого индексирования до поиска.) Вероятно, оно будет работать в течение секунды время (помните, что сравнительный набор довольно мал). И, если возможно, какие инструменты я могу использовать для этой задачи? Это могут быть программные компоненты или даже онлайн-сервис (я могу согласиться с этим для доказательства концепции). Может ли OpenSURF помочь мне здесь? Чтобы сфокусировать мой вопрос дальше - я не спрашиваю, какие алгоритмы использовать, на данный момент я бы предпочел использовать существующий инструмент / API / сервис.

Ответы [ 3 ]

3 голосов
/ 01 февраля 2011

Целевое изображение, которое должно найти программное обеспечение, должно быть «тем же» изображением, что и данное изображение, но оно все равно должно «простить» небольшую обработку любого из них.

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

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

Чтобы сфокусировать мой вопрос дальше - я не спрашиваю, какие алгоритмы использовать, на данный момент я бы предпочел использовать существующий инструмент / API / сервис.

Вы можете начать с cvMatchTemplate из библиотеки OpenCV (ссылка указывает на C-версию API, но она доступна также для C ++ и Python). Используйте обрезанное изображение в качестве шаблона и ищите его на всех ваших изображениях.

Если сравниваемые изображения имеют темные элементы на светлом фоне, вы можете воспользоваться методами CV_TM_CCOEFF или CV_TM_CCOEFF_NORMED. Они оба вычитают среднее значение по области шаблона из обоих изображений. Нормализованные методы (CV_TM_*_NORMED) обычно работают лучше, но медленнее, чем их ненормализованные аналоги.

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

1 голос
/ 01 февраля 2011

Я знаю, что вы не ищете специально алгоритмы, но, тем не менее, позвольте мне предложить следующее, которое может выполнить то, что вы пытаетесь сделать, очень эффективно ...

Для обрезанных версий того же изображениявключая вращение, преобразование Фурье-Меллина F или логарифно-полярное преобразование (обратите внимание на вычурный полуголый рисунок - хороший источник, однако) даст вам перевод, вращениеи масштабные коэффициенты между двумя изображениями, позволяющие определить, какие операции потребовались для перехода от одного к другому.

1 голос
/ 01 февраля 2011

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

Способ ее решения такой же, как и в ссылке:

  • Выполните обнаружение края на обоихВаш шаблон и целевое изображение.
  • Выбросьте оригинальный шаблон и изображение прочь
  • Выполните обнаружение шаблона с использованием обнаруженного края шаблона и обнаруженного края целевого изображения

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

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