Часть 1: Понимание изображений и цветовых каналов

Всем привет! Это часть I основ компьютерного зрения, где мы разберемся: что такое изображения, цветовые каналы, определение цвета с помощью OpenCV и т. д.

Я также создал видео YouTube для того же блога, если вы предпочитаете смотреть видео, нажмите здесь.

Каналы изображений

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

Импорт пакетов и чтение образа с помощью opencv

import cv2
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
image = cv2.imread("../Images/evolution.jpg")
# Shape of image
print(image.shape)
plt.figure(figsize=(10, 12))
plt.imshow(image)
  • Чтение изображения с помощью OpenCV
  • Нахождение размеров изображения
  • Построение изображения (OpenCV читает изображение как BGR, изображение RGB)

  • Преобразование BGR в RGB
image_rgb = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
plt.figure(figsize=(10, 12))
plt.imshow(image_rgb)

  • Создание порога для разделения синего фона и объектов изображения.
  • Порог поможет в создании маски для этих объектов изображения.
l_val = np.array([0,78,151])
h_val = np.array([0,78,152])
mask = cv2.inRange(image_rgb,l_val,h_val)
plt.figure(figsize=(10, 12))
plt.imshow(mask,cmap='gray')

  • Превращение маски в темный фон, в некотором смысле сведение на нет синего цвета.
masked_image = np.copy(image)
masked_image[mask !=0] = [0,0,0]
image_masked_rgb = cv2.cvtColor(masked_image,cv2.COLOR_BGR2RGB)
plt.figure(figsize=(10, 12))
plt.imshow(image_masked_rgb)

Далее мы прочитаем новое изображение и сделаем его фоном для изображения выше.

  • Чтение нового изображения.
  • Новое изображение будет выступать в качестве фона для предыдущего изображения.
  • Новое изображение изменяется до предыдущего размера изображения.
bgi = cv2.imread("../Images/space.jpg")
bgi_rgb = cv2.cvtColor(bgi,cv2.COLOR_BGR2RGB)
bgi_crop = bgi_rgb[0:900,0:1440]
plt.figure(figsize=(10, 12))
plt.imshow(bgi_crop)

  • Создание замаскированной области на новом изображении по сравнению с маской предыдущего изображения.
bgi_crop[mask == 0] = [0,0,0]
plt.figure(figsize=(10, 12))
plt.imshow(bgi_crop)

  • Замените замаскированную область в новом изображении предыдущим объектом изображения.
face_space = image_masked_rgb + bgi_crop
plt.figure(figsize=(10, 12))
plt.imshow(face_space)

Определение цвета с помощью HSV

Рассмотрим кучу цветных шаров, и наша задача состоит в том, чтобы извлечь количество красных шаров из коллекций.

color_balls = cv2.imread("../Images/Color_balls.png")
color_ball = cv2.cvtColor(color_balls,cv2.COLOR_BGR2RGB)
image_copy = np.copy(color_ball)
plt.figure(figsize=(10, 12))
plt.imshow(image_copy)

Цветные шарики по каждому каналу R, G, B.

red_ = image_copy[:,:,0]
green_ = image_copy[:,:,1]
blue_ = image_copy[:,:,2]
f, (ax1, ax2, ax3) = plt.subplots(1,3,figsize=(20,10))
ax1.set_title("Red Channel - RGB")
ax1.imshow(red_)
ax2.set_title("Green Channel - RGB")
ax2.imshow(green_)
ax3.set_title("Blue Channel - RGB")
ax3.imshow(blue_)

  • Преобразование из RGB в HSV, канал значений HSV сильно зависит от условий освещения, а также помогает изменить яркость изображения.
color_ball_hsv = cv2.cvtColor(image_copy,cv2.COLOR_RGB2HSV)
hue_ = color_ball_hsv[:,:,0]
saturation_ = color_ball_hsv[:,:,1]
value_ = color_ball_hsv[:,:,2]
f, (ax1, ax2, ax3) = plt.subplots(1,3,figsize=(20,10))
ax1.set_title("Hue Channel - HSV")
ax1.imshow(hue_)
ax2.set_title("Saturation Channel - HSV")
ax2.imshow(saturation_)
ax3.set_title("Value Channel - HSV")
ax3.imshow(value_)

  • Создание маски, чтобы отделить красный шар от других.

Во-первых, мы применим маску к RGB-изображению.

l_red = np.array([30,0,0])
h_red = np.array([255,30,30])
image_rgb = np.copy(image_copy)
red_balls_mask = cv2.inRange(image_rgb,l_red,h_red)
masked_image = np.copy(image_rgb)
masked_image[red_balls_mask==0] = [0,0,0]
plt.figure(figsize=(10, 12))
plt.imshow(masked_image)

Изображение выше приводит к несовершенному распознаванию красного цвета, поскольку некоторые пятна кажутся черными на красных шарах. Используя формат изображения на основе HSV, у нас будет лучшее определение цвета.

l_red_hsv = np.array([0,118,0])
h_red_hsv = np.array([9,255,255])
red_balls_mask = cv2.inRange(color_ball_hsv,l_red_hsv,h_red_hsv)
masked_image = np.copy(color_ball_hsv)
masked_image[red_balls_mask==0] = [0,0,0]
plt.figure(figsize=(10, 12))
plt.imshow(masked_image)

Поскольку мы видим изображения в формате RGB, мы должны преобразовать изображение на основе HSV в формат RGB.

red = cv2.cvtColor(masked_image,cv2.COLOR_HSV2RGB)
plt.figure(figsize=(10, 12))
plt.imshow(red)

Красный цвет, обнаруженный на изображении на основе HSV, намного четче, чем на изображении на основе RGB, поскольку черные пятна резко уменьшаются.

Полный блокнот доступен здесь: shorturl.at/bou13

Подписывайтесь и подключайтесь здесь: YouTube, LinkedIn

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedInи Discord.