OpenCV - SimpleBlobDetector - Проблемы с пороговой областью - PullRequest
0 голосов
/ 24 января 2020

Я использую OpenCV - SimpleBlobDetector для обнаружения капель (черного цвета) в двоичном изображении. Когда для minArea установлены низкие значения (от 50 до 100), алгоритм возвращает большинство ожидаемых больших двоичных объектов. Как показано ниже (обратите внимание на область, обведенную синим цветом):

enter image description here

Однако, когда minArea увеличивается до> 200. Алгоритм возвращает области без BLOB-объектов в виде BLOB-объектов. Пожалуйста, проверьте изображение ниже, обратите внимание на область, обведенную синим цветом.

Мои вопросы: алгоритм возвращает белую область в виде капель? (Я так не думаю). Я установил для filterByColor и filterByConvexity значение false. Не могли бы вы объяснить, почему эти две капли внутри синего круга возвращаются. Спасибо.

enter image description here

1 Ответ

0 голосов
/ 24 января 2020

В этом случае вам требуется простое обнаружение контура вместо обнаружения BLOB-объектов. Поскольку обнаружение BLOB-объектов также пытается сгруппировать меньшие близлежащие контуры, чтобы сформировать BLOB-объект. Таким образом, у нас есть две опции:

  • Настройте параметры обнаружения BLOB-объектов, чтобы отключить объединение меньших контуров.
  • Используйте простое обнаружение контуров и фильтруйте контуры, используя cv2.contourArea.

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

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

  2. Тогда мы можем использовать cv2.findContours() методы для двоичного изображения, полученного на шаге 1.

  3. На шаге 2 вы получите список контуров. Теперь мы можем перебрать список и отфильтровать меньшие контуры, используя cv2.contourArea().

  4. На шаге 3 у нас будет список контуров, площадь которых превышает определенный порог. Теперь вы можете нарисовать круг вокруг этих контуров или просто нарисовать контур, используя метод cv2.drawContours.

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