понеділок, 12 квітня 2021 р.

Сегментація за кольором

Mathedemo Сегментацію за кольором зручно виконувати в колірному просторі HSV у якому колір визначається лише одним каналом Н, а канали V визначають насиченість і яскравість відповідно:

Приклад зміни кольорів при переході простору HSV:

В OрenCV шкали каналів змінюються у таких діапазонах
  • H: 0--179
  • S: 0--255
  • V: 0--255
Палітра HSV кольорів має такий вигляд
Діапазон горизонтальної шкали H змінюється в діапазоні $[0, 179]$.

Для того щоб провести сегментацію зображення за конкретним кольором або кількома кольорами, спочатку потрібно визначити його діапазон, тобто виділити межі області у HSV-циліндрі . Наприклад, жовтий колір знаходиться в діапазоні $H=[25,33]$ при значеннях $S=[50,100]$ і значеннях $V=[150,255]$.

Аналогічно шукаються діапазони каналу H для інших кольорів, а діапазони для каналів S i V можна залишити такими як вище. Наприклад для зеленого кольору канал H змінюється приблизно в діапазоні від $50$ до $90$. В загальному випадку діапазони кольоів можна визначити в інтерактивному режимі, код тут.

Білий колір визначається так


lower_white = np.array([0,0,0], dtype=np.uint8)
upper_white = np.array([0,0,255], dtype=np.uint8)
Чорний колір визначається нульовим значенням каналу V.

Для сегментації за кольоровим діапазоном потрібно перевести зображення у HSV простір, визначити діапазон кольору, створити маску і накласти її на початкове $BGR$-зображення

 
hsv_image = cv2.cvtColor(img ,cv2.COLOR_BGR2HSV)
lower_yellow = np.array([15, 50, 150])
upper_yellow = np.array([33, 255, 255])
y_mask = cv2.inRange(hsv_image , lower_yellow , upper_yellow)
filtered_image = cv2.bitwise_and(img , img , mask=y_mask)
Виділення об'єктів оранжевого і жовтого кольорів
При сегментації за кількома кольорами, їхні маски додаються для створення спільної маски.

Немає коментарів:

Дописати коментар