5.8. Заливка и глифы обнаружения

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

5.8.1. Заливка

flood_fill() начинает с одного пикселя – затравки – и разрастается наружу, закрашивая каждый пиксель, который достаточно похож на затравку и связан с ней цепочкой других похожих пикселей. Результат – залитая область, граница которой определяется самим изображением, а не чем-либо переданным в вызов.

Простейшая форма принимает координаты затравки и цвет для заливки:

img.flood_fill(x=160, y=120, color=(0, 255, 0))

Два параметра-порога управляют тем, насколько агрессивно разрастается заливка. seed_threshold (нормированная доля от 0.0 до 1.0) задаёт, насколько пиксель может отличаться от значения исходной затравки, оставаясь при этом включённым. floating_threshold задаёт, насколько он может отличаться от каждого уже включённого соседа. Два порога работают вместе: щедрый floating_threshold позволяет заливке следовать за градиентом по изображению, тогда как жёсткий seed_threshold не даёт ей слишком далеко уходить от значения затравки даже вдоль этого градиента.

Несколько флагов дополнительно уточняют результат:

  • invert=True закрашивает каждый пиксель, который не соответствует – дополнение к соответствующей области – вместо самих соответствующих пикселей.

  • clear_background=True обнуляет каждый пиксель за пределами области заливки. Полезно для извлечения только залитой области в качестве маски.

  • Ключевое слово mask имеет своё обычное значение: пиксели, выключенные в маске, остаются нетронутыми независимо от того, достигла бы их заливка в противном случае или нет.

Заливка наиболее полезна для двух сценариев. Первый – визуализация того, что нашёл какой-то детектор областей, путём заливки обнаруженной области отличительным цветом, чтобы она выделялась на фоне остального кадра. Второй – извлечение самой области путём сочетания clear_background=True с известной затравкой внутри области и чтения получившегося изображения как маски для последующих операций.

5.8.2. Рисование результатов обнаружения

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

draw_keypoints() принимает либо дескриптор ключевой точки, возвращённый экстрактором признаков, либо простой список троек (x, y, rotation), и рисует небольшой глиф в каждой точке. Глиф несёт как положение, так и ориентацию: окружность вокруг точки плюс линия из центра, указывающая поворот. Эта визуализация одним вызовом – самый простой способ убедиться, что экстрактор ключевых точек возвращает ориентации, ожидаемые приложением.

draw_detection() принимает шестёрку (rx, ry, rw, rh, cx, cy) – ограничивающий прямоугольник плюс отдельно сообщённый центроид – и рисует и то, и другое сразу: прямоугольник вокруг ограничивающей рамки, крест в центроиде и опционально текстовую метку в углу прямоугольника. Эта форма соответствует тому, что обычно сообщает обнаружение нейронной сетью или трекер по шаблону, где центроид – более точное положение, чем дал бы центр ограничивающей рамки.

Оба метода-глифа – это удобные надстройки над геометрическими примитивами в начале этого раздела. Приложение всегда может воспроизвести ту же визуализацию, вызвав draw_rectangle(), draw_circle(), draw_cross() и draw_string() напрямую; методы-глифы просто избавляют от учётной работы для сценариев, которые возникают снова и снова.

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