Как выделять объекты по цвету

Наша цель — сказать программе, какие пиксели оставить. Например, оставить синий колпачок и убрать стол. Сначала подбираем диапазон цвета в лаборатории, затем пишем Python-программу и проверяем её на фотографиях.

Что такое HSV

В RGB цвет задают доли красного, зелёного и синего. В HSV эти свойства разделены на оттенок, насыщенность и яркость. Поэтому проще выбрать «синие и достаточно яркие пиксели», не подбирая отдельно три RGB-канала.

КаналЧто означаетШкала в нашей среде
H — Hue, оттенокКакой это цвет: красный, жёлтый, зелёный, синий…0–179. Примерные ориентиры: красный 0/179, жёлтый 30, зелёный 60, голубой 90, синий 120, пурпурный 150.
S — Saturation, насыщенностьНасколько цвет отличается от серого.0 — серый; 255 — максимально насыщенный цвет.
V — Value, яркостьНасколько светлый пиксель.0 — чёрный; 255 — максимальная яркость. Высокое V само по себе не означает белый: красный тоже может быть ярким.

Круг оттенков показан в виде полосы: справа он возвращается к красному.

Здесь используется обычный 8-битный HSV OpenCV. В других редакторах H часто задаётся в градусах 0–360, а S и V — в процентах. Такие значения нельзя переносить напрямую.

Что делают шесть ползунков

Для каждого канала есть минимум и максимум. Пиксель проходит отбор, только если одновременно находится внутри всех трёх интервалов, включая их границы:

H min ≤ H ≤ H max
S min ≤ S ≤ S max
V min ≤ V ≤ V max

Сужая H, оставляем нужные оттенки. Поднимая S min, исключаем серые и почти белые участки. Поднимая V min, исключаем тени и тёмный фон. Уменьшая V max, исключаем самые яркие участки. Следите, чтобы минимум не превышал максимум: лаборатория упорядочивает границы, но в Python их нужно записать правильно.

Как читать маску и рамки

Белый пиксель маски (255) подходит под настройки; чёрный (0) — не подходит. Маска — отдельное чёрно-белое изображение, а не перекрашенная фотография. В окне результата рамками отмечаются связные группы подходящих пикселей.

Минимальная и максимальная площадь фильтруют группы для рамок и счётчика объектов. Площадь — число белых пикселей группы, а не площадь её прямоугольной рамки. Эти ползунки не меняют маску. Пиксели, соприкасающиеся по стороне или диагонали, считаются связанными. Размер считается после уменьшения фотографии в лаборатории, поэтому на другом разрешении площадь изменится.

Пошагово: выделяем синий колпачок

  1. Откройте лабораторию, нажмите img.jpg и «Сбросить». Установите H=0…179, S=0…255, V=0…255: при полном диапазоне вся маска белая.
  2. Оставьте H от 100 до 140. Посмотрите, какие участки попали в маску.
  3. Установите S от 100 до 255, чтобы убрать малонасыщенные участки.
  4. Установите V от 50 до 255, чтобы убрать слишком тёмные участки. Колпачок должен выделяться на фоне стола.
  5. При необходимости увеличьте минимальную площадь, чтобы мелкие пятна не получали рамки. Помните: в маске они останутся.
  6. Перейдите к задаче про колпачок, напишите преобразование и проверку диапазонов. Нажмите «Проверить решение» — тесты исполняются в вашем браузере.

Почему красному нужны два диапазона

Красный расположен у обоих концов шкалы H. Например, для мяча подходят H=0…15 или H=170…179 при одинаковых ограничениях S и V. Один интервал 15…170, наоборот, исключит нужный красный. Лаборатория показывает один диапазон за раз: изучите оба по очереди. В программе создайте две маски и объедините их операцией cv2.bitwise_or.

Как перенести настройки в Python

cv2.imread читает изображение в порядке BGR. Преобразуйте его через cv2.cvtColor(image, cv2.COLOR_BGR2HSV). Затем cv2.inRange(hsv, lower, upper) создаёт маску по тройкам (H, S, V). Под лабораторией показан код именно для выбранного вами диапазона.

Если задача просит маску, сохраните её в output.png. Если просит цветной объект на чёрном фоне, примените маску к исходной BGR-фотографии через cv2.bitwise_and с аргументом mask. Не сохраняйте HSV как обычную цветную фотографию: её цвета будут отображаться неверно.

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

Если результат не получается

Начать упражнения → · Вернуться к ползункам