OpenCV(8) --- Простое приложение преобразования цветового пространства и HSV

OpenCV
OpenCV(8) --- Простое приложение преобразования цветового пространства и HSV

предисловие

После предыдущего введения теоретических знаний мы освоили различные типы цветового пространства. В этом сообщении блога в основном рассказывается, как использовать код для преобразования типов цветового пространства в OpenCV.

Преобразование между RGB и GREY

В OpenCV мы используем функцию cv2.cvtColor() для преобразования цветового пространства. Тип цветового пространства этой функции представлен типом перечисления, из которых тип перечисления COLOR_BGR2GRAY специально предоставлен для перехода от RGB к GRAY.

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

import cv2

img = cv2.imread("4.jpg", -1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("rgb", img)
cv2.imshow("gray", gray)
cv2.waitKey()
cv2.destroyAllWindows()

После запуска эффект будет таким, как показано ниже:BGR转GRAYДалее давайте посмотрим, как GRAY преобразуется в RGB Конкретный код выглядит следующим образом:

import cv2

img = cv2.imread("4.jpg", 0)
bgr = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
cv2.imshow("gray", img)
cv2.imshow("rgb", bgr)
cv2.waitKey()
cv2.destroyAllWindows()

После запуска эффект отображения показан ниже:GRAY转BGRСледует отметить, что цветовая 3-мерная матрица RGB-изображения — это BGR, поэтому при ее преобразовании мы используем BGR2GRAY и GRAY2BGR. Отсюда мы также можем видеть, что его константа типа перечисления на самом деле очень проста для понимания, это не что иное, как обращение имени типа преобразования.

Однако мы обнаружили, что в преобразовании изображения в градациях серого в изображение RGB нет никаких изменений, потому что изображение в градациях серого не имеет значения цвета, и операцию нельзя восстановить с помощью воображения, но изображение в градациях серого в изображение RGB по-прежнему имеет определенное значение, Если вам нужно раскрасить, то изображение в градациях серого представляет собой двумерную матрицу, это не трехмерная матрица значений цвета, вы не можете присваивать значения. После преобразования в RGB через GRAY вы можете изменить значение цвета пикселя точно так же, как изображение RGB, хотя оно будет серым.

Преобразование между RGB и HSV

Как и в приведенном выше коде, преобразуйте цветовое пространство с помощью cv2.cvtColor():

import cv2

img = cv2.imread("4.jpg", -1)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow("bgr", img)
cv2.imshow("hsv", hsv)
cv2.waitKey()
cv2.destroyAllWindows()

После запуска получаем вот такую ​​картинку:BGR转HSVВ предыдущих теоретических знаниях мы можем получить определенный цвет в соответствии со значением оттенка, то есть мы можем извлечь определенный цвет через значение на канале H HSV. Это преимущество извлечения и анализа цвета можно использовать для определения цвета кожи при распознавании лиц и т. д.

Далее попробуем с синим, конкретный код выглядит следующим образом:

import cv2

img = cv2.imread("4.jpg", -1)
img[:, :, 0] = 255
Blue = img
blueHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow("imgBlue", Blue)
cv2.imshow("blueHSV", blueHSV)
cv2.waitKey()
cv2.destroyAllWindows()

После запуска эффект следующий:蓝色Теперь давайте извлечем его красную область, полный код выглядит следующим образом:

import cv2
import numpy as np

img = cv2.imread("4.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow("hsv", hsv)
minBlue = np.array([0, 50, 50])
maxBlue = np.array([30, 255, 255])
# 确定蓝色区域
mask = cv2.inRange(hsv, minBlue, maxBlue)
# 通过按位与获取蓝色区域
blue_img = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow("blue", blue_img)
cv2.waitKey()
cv2.destroyAllWindows()

Здесь мы используем новый метод cv2.inRange(), который определяется следующим образом:

def inRange(src, lowerb, upperb, dst=None):

src: указывает массив или аватар для проверки

lowerb: указывает нижнюю границу диапазона

upperb: указывает верхнюю границу диапазона

С помощью этого метода мы можем определить, находится ли значение пикселя в изображении в определенном диапазоне.

После предыдущего теоретического объяснения мы знаем, что H HSV равен 0 для красного цвета. Для совместимости нам нужно расширить значение красного вверх и вниз, но сам цветовой диапазон не может быть меньше 0, поэтому мы можем расширить только верхнюю границу, то есть расширить диапазон до 30.

И канал S в HSV, диапазон значений канала V составляет [100,255]. Итак, здесь мы ограничиваем предел от [0, 50, 50] до [30, 255, 255], чтобы получить значение красного цвета изображения.После запуска красный цвет изображения извлекается:提取红色Как видно из этого примера, мы можем пометить значение указанного диапазона на изображении через cv2.inRange() и вернуть его в маску. Если значение изображения находится в этом интервале, значение соответствующей позиции маски равно 255, иначе — 0. Затем указанный цвет извлекается с помощью маскированной операции побитового И.

Здесь у нашего побитового_и есть третий параметр mask, который использует маску для выполнения операции «И», то есть белая область изображения маски является резервированием пикселей изображения, которые необходимо обработать, а черная область это отбраковка пикселей изображения, которые необходимо обработать.