Пороговое значение OpenCV, адаптированное к различным условиям освещения

Для школьного проекта я пытаюсь написать программу на Python, которая отслеживает движение ученика. Для этого я использую OpenCV. После просмотра некоторых учебных пособий в Интернете я заметил, что почти все используют пороговое значение для достижения этой цели, поскольку бинарное изображение необходимо почти для каждого дальнейшего шага (например, HoughCircle Transofrmation, Contours). Однако, насколько я понимаю, пороговое значение чрезвычайно чувствительно к свету, поэтому такой подход даст хорошие результаты только в оптимальных условиях освещения. Итак, вот мой вопрос: Есть ли альтернативный или лучший подход, чем просто пороговое значение изображения? Или мое понимание порогового значения в OpenCV изначально неверно?

Вот пример изображения:

пример изображения


person Alex1    schedule 07.02.2020    source источник
comment
Вы можете установить порог в других цветовых пространствах, которые менее чувствительны к изменениям освещения. Порог RGB ужасен для такого сценария.   -  person karlphillip    schedule 07.02.2020
comment
Пожалуйста, поделитесь некоторыми из ваших изображений, чтобы увидеть, какие другие варианты мы можем рассмотреть.   -  person MH304    schedule 07.02.2020
comment
@karlphillip Изображение уже окрашено в оттенки серого перед пороговым значением, но глобально установленное пороговое значение по-прежнему возвращает очень ненадежные результаты, и OTSU также работает только при определенных условиях освещения.   -  person Alex1    schedule 08.02.2020
comment
@MH304 добавил пример изображения   -  person Alex1    schedule 08.02.2020


Ответы (1)


Целью пороговой обработки является отделение желаемых объектов от фона, после чего вы можете выполнить дополнительную обработку (применив морфологические операции), а затем выполнить контурную фильтрацию для дальнейшего выделения нужных объектов. Вместо применения методов обработки изображения к изображению BGR (3-канальному) или изображению в градациях серого (1-канальному) с диапазоном [0...255] пороговая обработка позволяет нам получить бинарное изображение, в котором каждый пиксель имеет значение либо 0, либо 1, что упрощает различение объектов. В зависимости от вашей ситуации есть много способов получить бинарное изображение, вот несколько способов:

  • cv2.Canny — обнаружение границ, которое использует minVal и maxVal для определения ребер

  • cv2.threshold – Простое пороговое значение с выбранным пользователем произвольным глобальным пороговым значением

  • cv2.threshold + cv2.THRESH_OTSU - пороговое значение Otsu для автоматического расчета порогового значения.

  • cv2.adaptiveThreshold – Адаптивная пороговая установка, когда изображение имеет разные условия освещения в разных областях. По сути, он автоматически вычисляет пороговое значение для разных областей изображения и дает лучшие результаты для изображений с разным освещением.

  • cv2.inRange — сегментация по цвету. Идея состоит в том, чтобы использовать нижний и верхний пороговые диапазоны для получения бинарного изображения. Полезно при попытке выделить один цветовой диапазон

person coffeewin    schedule 07.02.2020