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

    Введение


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



    Данный алгоритм был впервые реализован мной во время разработки алгоритмов видеоаналитики для 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: Смешанный метод


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



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

    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 17

      +9
      Может ещё применить морфологическое замыкание, чтобы избавиться от дырок?
        +3
        А если это тень от бублика?
          0
          Надо правильно подобрать размер структурного элемента, чтобы замыкались только маленькие дырки.
        0
        А вы не пробовали с цветным изображением? Если изображение конвертировать из RGB в HSV, возможно, будет проще определить тень (т.к. цветовой тон внутри тени и снаружи нее будет один и тот же, а вот S и V будут различаться).
          0
          Внутри конвейера только черно белое изображение, потому мне к сожалению ваш вариант не подходит.
            0
            Неверно, если источник света не белый. Даже обычные лампы имеют различные характеристики температуры цвета, а есть и «цветные» лампы. Или, допустим, свет от монитора.
            –1
            Спасибо за полезную информацию.
            Один вопрос — я так понимаю, этот метод годится только для неподвижной камеры? А если изображение дрожит? И фон имеет небольшие постоянные сдвиги? Тогда градиентный метод наверно работать не будет?
              +1
              Если изображение дрожит, то нужно применять цифровую стабилизацию изображения. У нас для этого реализован достаточно эффективный алгоритм, позволяющий стабилизировать изображение с субпиксельной точностью.
                0
                слушайте, а насчёт повышения резкости кадра за счёт этой субпиксельной стабилизации у Вас наработки успешные есть?
                  0
                  А как цифровая стабилизация может поднять резкость? При наличии дрожания камеры, резкость обычно только понижается. В основном по двум причинам: 1) смазывание изображения из-за движения камеры 2) размытие изображения из-за его компенсационного субпиксельного сдвига, если последний выполняется при помощи билинейной интерполяции. Можно конечно накладывать специальные фильтры для устранения смазывания изображения, да и компенсацию выполнять другими методами (например, бикубической интерполяцией), однако это все довольно ресурсоёмко. Кроме того, для наших целей (аналитическая обработка изображения и детектирование движения) это размытие особо не мешает, а иногда даже помогает.
                    0
                    Если разбираться на субпиксельном уровне, то следующий кадр содержит информацию о практически той же картинке, но при чуть другом наложении границ элементов снимаемого изображения на другие границы пикселей. Поэтому, должна быть потенциальная возможность таким образом уточнить границы элементов изображения, и тем самым повысить резкость и разрешение снятой картинки. Это почти как избавляться от смаза, только на шаг глубже. Цифровая стабилизация с плюсом.

                    Тот факт, что Вам в Ваших задачах это не оказывается нужным — снимает этот мой вопрос к Вам.
                      0
                      Да такая потенциальная возможность есть — теоретически можно даже повысить разрешение картинки путем анализа последовательных, слегка смещенных изображений (если данные смещения контролируемые). Однако на практике, оказывается у данного метода масса подводных камней — это цифровой шум, смазывание картинки из-за смещения камеры во время захвата кадра, погрешность метода определения субпиксельного сдвига, произвольность направление смещения и амплитуды камеры во время дрожания, как и периодичности этого процесса сводят на нет практическую применимость данного подхода.
                        0
                        Задача действительно математически весьма не проста. Но кстати, её решение может и от шумов избавить, и динамический диапазон подзадрать.
                        Реализуй кто такой алгоритм, да ещё на встраиваемых в фотики процессорах — озолотится!
              0
              Интересно! Сразу возникает идея сделать на основе этого 3d манипулятор. На основании взаимного расположения объекта и тени можн судить о положении самого объекта в 3-х мерной системе координат. Фиксируем свет и вуаля! Можем руками оперировать с тем, что у нас на экране используя только лампочку и веб камеру.
                0
                Еще пара идей:
                Можно попробовать смотреть, меняется ли цвет в каналах A и В, цветовой модели LAB или канала H, пространства HSL. У искомого объекта цвет должен практически гарантированно отличаться, тогда как тень свой цвет будет изменять не так сильно.
                Вторая идея — сравнивать высокие частоты изображения. Ситуация та же — высокие частоты сам объект должен менять намного сильнее, чем тень от него.

                Проверять алгоритмы на работоспособность стоит так же и при нескольких источниках света разного цвета, мне кажется. Это усложняет задачу но сильно уж распространенная ситуация. Как вариант — искать заведомо затемненное место и брать образец цвета тени из него — разный цвет в тени явление более редкое чем просто цветная тень
                  0
                  Можно исходную картинку? Посмотреть что там по каналам
                    0
                    Упс, стоило сначала прочесть все комментарии

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

                Самое читаемое