Pull to refresh

Алгоритм детектирования теней на видеоизображении

Reading time 3 min
Views 8.1K

Введение


В данной статье мне хотелось рассказать об алгоритме, который позволяет разделять на видеоизображении реальные объекты и тени.



Данный алгоритм был впервые реализован мной во время разработки алгоритмов видеоаналитики для IP-видеосервера MagicBox, которое разрабатывает компания Синезис, в которой я работаю в настоящее время. Как известно, при детектировании движения на видеопоследовательности, условия освещенности не всегда идеальны. И простейший детектор движения, основанный на разности текущего кадра и некого усредненного фона будет реагировать не только на реальные объекты, но также и на виртуальные: подвижные тени и световые зайчики. Что является нежелательным, так как может приводить искажению формы детектируемых предметов а также к ложным срабатываниям детектора движения. Это актуально в солнечную погоду, а особенно в случае переменной облачности. Потому наличие алгоритма по выделению теней, может весьма положительно сказаться на точности всего детектора. Но давайте рассмотрим все по порядку.

Детектирование движения


Для детектирования движения выбран самы простой алгоритм: из усредненного фона



попиксельно вычитается текущий кадр



И получается маска, которая к сожалению включает в себя не только реальный объект (мою руку), но и виртуальный (тень от нее).



Свойства теней


Для того, что бы отделить изображение реального обекта от изображения тени (светового зайчика), нужно выделить набор свойств (критериев), которые у них различаются. Самым главным отличительным свойством изображения тени, отличающим его от изображения реального объекта является прозрачность. И деействительно, черерез тень явно проступают черты фона, на который она накладывается, хотя общая освещенность его значительно изменяется. Потому для разделения реального объекта и тени, нужно проверить объект на прозрачность, для чего следует проанализировать корреляцию исходного изображения и фона с учетом изменения освещенности. Для этого есть два достаточно быстрых метода, которые мы рассмотрим ниже.

Метод 1: Направление градиента


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



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

Метод 2: Относительная корреляция


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

Current[x,y] = k*Background[x,y],

где k — некоторый коэффициент затемнения, одинаковый для всего изображения. В реальности затемнение конечно же не является равномерным для всего изображения, однако с высокой степенью достоверности его можно считать равномерным в некоторой окрестности данной точки. Следовательно, если отклонение от равенства

Current[x,y]*AverageBackground[x,y] = Background[x,y]*AverageCurrent[x,y]

не превышает некоторого порога для окрестности точки [x,y], то ее можно считать тенью.



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

Метод 3: Смешанный метод


Логичным следующим шагом будет объедение этих двух методов. Если результаты предыдущих двух методов объеденить (тенью будет считать только те точки, которые совпадают у обоих методов), то получим следующий результат:



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

Tags:
Hubs:
+99
Comments 17
Comments Comments 17

Articles