Определение сходства изображений, обработанных с помощью обнаружения краев

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

Теперь, когда это не так, позвольте мне дать некоторые определения:

Цель проекта: цель проекта, как и многие другие, которые пытались достичь в различных вопросах SO (многие из которых были очень полезны для меня в ходе этой работы), состоит в том, чтобы определить, является ли место для парковки заполнено или доступно, в конечном итоге сообщая об этом пользователю (в идеале через iPhone, Droid или другое мобильное приложение для простоты использования — этот аспект был быстро признан выходящим за рамки моих усилий из-за нехватки времени).

Используемые инструменты: я интенсивно использовал ресурсы библиотеки AForge.Net, которая предоставила мне все строительные блоки для объединения проекта с точки зрения захвата видео с IP-камеры. , применяя фильтры к изображениям и в конечном итоге достигая цели обнаружения. В результате вы узнаете, что я решил программировать на C#, в основном из-за простоты использования для начинающих. Другие варианты включали MATLAB/C++, C++ с OpenCV и другие альтернативы.

Проблема

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

http://i.stack.imgur.com/u6eqk.jpg

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

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

Целевой вопрос:
Есть ли способ взять сегмент изображения (посредством обрезки), а затем сравнить обнаруженную последовательность краев с будущими новыми кадрами с камеры? В частности, есть ли способ сделать это, допуская свободу действий/по сути, создавая порог допуска для незначительных различий в краях?

Личные мысли/Мозговой штурм по этому вопросу:
-- Я уверен, что есть способ буквально сравнить попиксельно -- обрезать только прямоугольник по краям, а затем сдвинуть обрезанный изображения через новый обработанный кадр для сравнения по пикселям, но это не особенно поможет, если у вас нет точного совпадения с обнаруженными краями.

Любая помощь приветствуется, и я более чем счастлив уточнить, если это необходимо.


person Mike D.    schedule 25.04.2011    source источник
comment
Извините, но я не могу понять вопрос из-за слишком большого количества информации (и я не могу сказать, что актуально, а что нет). Может быть, я медленно, но я думаю, что вы должны сосредоточить свой вопрос.   -  person Neowizard    schedule 25.04.2011
comment
Попытался дать небольшое пояснение. Я склоняюсь к многословной стороне, как вы можете видеть.   -  person Mike D.    schedule 25.04.2011


Ответы (2)


Позвольте мне попробовать.

У вас есть два изображения. Назовем их BeforePic и AfterPic. Для каждого из этих двух изображений у вас есть ROI (прямоугольник интереса) — также известный как обрезанный сегмент.

Вы хотите увидеть, сильно ли AfterPic.ROI отличается от BeforePic.ROI. Под «очень разными» я подразумеваю, что разница превышает некоторый порог.

Если это действительно ваша проблема, то ее следует разделить на три части:

  1. получить BeforePic и AfterPic (и ROI для каждого).
  2. Переведите абстрактное понятие разницы картинок\краев в числовое.
  3. сравнить разницу с некоторым порогом.

Первая часть на самом деле не является частью вашего вопроса, поэтому я проигнорирую ее. Последняя часть основана в основном на поиске правильного порога. Опять же вне рамок вопроса. Вторая часть - это то, что я думаю, является сутью вопроса (надеюсь, я не совсем ошибся). Для этого я бы использовал алгоритм ShapeContext (В PDF вам будет лучше реализовать его до раздела 3.3, так как он становится слишком надежным для ваших нужд, начиная с 3.4 и далее).

Shape Context — это алгоритм сопоставления изображений, использующий края изображения с большими показателями успеха. Реализация этого была моим финальным проектом, и кажется, что он идеально подходит (без каламбура) для вас. Если ваши края в порядке, а рентабельность инвестиций точна, это вас не подведет.

Это может занять некоторое время, но если все сделано правильно, это будет работать идеально для вас. Имейте в виду, что плохая реализация может работать медленно, и я видел худший случай 5 секунд на изображение. С другой стороны, хорошая (но не идеальная) реализация займет менее 0,1 секунды на изображение.

Надеюсь, что это помогает и удачи!

Изменить: я нашел реализацию ShapeContext в C# @ CodeProject, если это представляет интерес

person Neowizard    schedule 25.04.2011
comment
@Neowizard, поскольку мы говорим о сходстве изображений, будет ли подход на основе собственных значений быстрее, поскольку OpenCV предоставляет простые реализации? Первой мыслью было бы получить собственные значения обоих изображений и найти корреляцию между ними. Идентичный будет означать коэффициент корреляции, близкий к единице. Можно определить экспериментальный порог, при котором непохожие изображения будут отбрасываться. - person AruniRC; 27.04.2011
comment
Это первый раз, когда я слышу об этом подходе к распознаванию объектов, основанном на собственных значениях, но после беглого просмотра связанной статьи я все еще не уверен, даст ли он хорошие результаты для исходной задачи. Обнаружение дефектов представляет собой другую проблему в CV, поэтому я не уверен в этом. С другой стороны, это реализовано (и, вероятно, оптимизировано) в OpenCV, и это придает ему большое значение. Мне это кажется солидным подходом, и с ним стоит поэкспериментировать. Если он дает хорошие результаты и нет причин пробовать другой. - person Neowizard; 27.04.2011
comment
что бы ни работало. на самом деле теперь я думаю, что этот метод может быть не таким подходящим, поскольку он специально не предназначен для использования на картах краев. Работал с собственными значениями, поэтому он появился сначала. - person AruniRC; 27.04.2011
comment
Спасибо за отклик и идеи! И вы, и Дэн Брайант пришли к некоторым замечательным моментам и идеям, но, возможно, что более важно, к некоторым мыслительным процессам, которые я действительно искал. Большая проблема, с которой я столкнулся в проекте как начинающий программист, заключается в том, чтобы научиться мыслить как менталитет CS, если хотите, с точки зрения стратегий решения проблем. Действительно, сравнение After.ROI и Before.ROI — это именно тот подход, который я в конечном итоге использовал и смог добиться довольно приличного показателя успеха с минимальным количеством ложных срабатываний. - person Mike D.; 28.04.2011
comment
@AruniRC Собственные значения определенно были темой / стратегией, с которой я столкнулся в своем исследовании, но она казалась немного более высокоуровневой, чем у меня было время или знания для эффективной реализации. Большая часть моих усилий была построена на знании библиотеки Aforge C# и Open/EmguCV, и такая функция там не реализована. Однако, поскольку OpenCV, как правило, является лучшим в линейке / стандартом для программирования CV, как сказал Неовизард, определенно стоит продолжать экспериментировать и исследовать потенциал для помощи в более надежных решениях. - person Mike D.; 28.04.2011

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

Несколько вещей, которые следует учитывать:

  1. Есть ли заранее определенные парковочные места на улице? Есть ли у вас возможность вручную предварительно определить области парковки, которые будут наблюдаться камерой? Это может значительно упростить задачу.

  2. Разрешено ли вам предоставлять неверные результаты, когда автомобили припаркованы неправильно (например, занимают более одного места)?

  3. Разрешено ли вам предоставлять неверные результаты, когда в помещении возникают неожиданные условия окружающей среды, такие как мусор, выбоины, скопившаяся вода или снег?

  4. Вам нужно поддерживать все категории транспортных средств (автомобили, грузовики с безбортовой платформой, фургоны, грузовики для доставки, мотоциклы, мини-электромобили, треножники,?)

  5. Можно ли сделать базовый снимок улицы без машин?

Что касается сравнения двух наборов ребер, вероятно, наиболее надежный подход известен как поиск геометрической модели (математическое описание интересующих ребер в виде серии «ребер», объединение их в цепочки и сравнение геометрии), но это слишком много. для вашего приложения. Я бы больше обратил внимание на пороги количества «краевых пикселей», присутствующих в зоне парковки или отличающихся от базового изображения (однако нужно быть осторожным со сдвигом изображения, поскольку расширение материала из-за изменений температуры наружного воздуха может привести к тому, что поле зрения слегка измениться из-за механического перемещения камеры.)

person Dan Bryant    schedule 25.04.2011
comment
Дэн, спасибо за ваши идеи и помощь. Многие из ваших моментов для рассмотрения были вещами, которые я уже начал рассматривать, обдумывать или исследовать, но вы назвали ряд полезных моментов и стратегий для рассмотрения, некоторые из которых определенно вошли в мой окончательный дизайн и код. Я хотел бы дать вам и Neowizard проверку принятых ответов, поскольку вы оба этого заслуживаете благодаря полезной информации, которую вы предоставили. - person Mike D.; 28.04.2011