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() безпосередньо; методи гліфів просто позбавляють від рутини для шаблонів, що зустрічаються знову і знову.

З геометричними примітивами для відомої геометрії, композицією зображень для накладень, заливкою для областей, визначених зображенням, і гліфами виявлення для стандартних шаблонів візуалізації, набір інструментів для малювання є повним. Для всього, що застосунку потрібно зробити видимим як результат роботи алгоритму, є метод на поверхні, який це здійснює.