Часть 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.