[Original] Serie OpenCV-Python de cambio del espacio de color (13)

A partir de este tutorial, ingresamos formalmente a los conceptos básicos del aprendizaje. La parte más importante del procesamiento de imágenes OpenCV es el espacio de color de la imagen. Hemos visto ejemplos de imágenes en escala de grises antes, pero este es solo uno de ellos. Un tipo.

Espacio de color

Color / espacio de color (inglés: espacio de color) es la organización de los colores. Con la ayuda del espacio de color y las pruebas de dispositivos físicos, se pueden obtener representaciones de colores analógicas y digitales fijas. El espacio de color se puede definir simplemente eligiendo algunos colores arbitrariamente. Por ejemplo, el sistema Pantone solo toma un conjunto de colores específicos como muestras y luego define el nombre y el código para cada color; también puede basarse en definiciones matemáticas rigurosas, como Adobe RGB , SRGB.

Mucha gente sabe que se pueden usar tres colores primarios, rojo, amarillo y azul, para generar diferentes colores al pintar, que definen un espacio de color. Definimos la cantidad de magenta como eje de coordenadas X, la cantidad de cian como eje de coordenadas Y y la cantidad de amarillo como eje de coordenadas Z, de manera que se obtiene un espacio tridimensional, y cada color posible es único en este espacio tridimensional. De un lugar.

Sin embargo, este no es el único espacio de color. Por ejemplo, cuando se muestran colores en un monitor de computadora, generalmente se define en el espacio de color RGB (rojo, verde, azul). Esta es otra forma de generar el mismo color. El rojo, el verde y el azul se tratan como X, Ejes de coordenadas Y y Z. Otra forma de generar el mismo color es usar tono (eje X), saturación (cromaticidad) (eje Y) y luminosidad (eje Z). Este método se llama espacio de color HSB. Además, hay muchos otros espacios de color, muchos de los cuales se pueden representar en tres dimensiones (X, Y, Z), más o menos dimensiones de esta manera, pero algunos no se pueden representar de esta manera en absoluto.

La mayoría de las imágenes en color que vemos en nuestras vidas son de tipo RGB, pero al realizar el procesamiento de imágenes, necesitamos usar escala de grises, binario, HSV, HSI y otros sistemas de color. OpenCV proporciona la función cvtColor () para lograr estos Caracteristicas. Primero observe la definición de la función cvtColor:

cvtColor (InputArray src, OutputArray dst, código int, int dstCn = 0);

. InputArray src: la imagen de entrada es la imagen original que se va a transformar en el espacio de color, que puede ser una clase Mat

. OutputArray dst: la imagen de salida es para almacenar la imagen después de la transformación del espacio de color, o clase Mat

. int code: El código o logotipo de la conversión, es decir, aquí para determinar qué formato de imagen se convertirá en qué formato de imagen, que se describirá en detalle más adelante.

. int dstCn = 0: el número de canales de imagen de destino, si el valor es 0, está determinado por src y código

La función de la función es convertir una imagen de un espacio de color a otro espacio de color, pero al convertir de RGB a otros tipos, el canal de color de la imagen debe estar claramente indicado.Como mencionamos anteriormente, en OpenCV, su color predeterminado La disposición del sistema es BGR en lugar de RGB. Entonces, para una imagen en color de 24 bits, los primeros 8 bits son azules, los 8 bits centrales son verdes y los últimos 8 bits son rojos. El rango de valores de los canales R, G y B comunes es:

0-255: Imagen tipo CV_8U

0-65535: Imagen tipo CV_16U

0-1: Imagen tipo CV_32F

En este tutorial, solo estudiamos varios métodos importantes de conversión de espacio de color, incluida la conversión de escala de grises y espacio HSV. Primero veamos el código:

	view plaincopy to clipboardprint?
import cv2  
  
img = cv2.imread("cat.jpg")  
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  
hls = cv2.cvtColor(img, cv2.COLOR_BGR2HLS)  
LAB = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)  
LUV = cv2.cvtColor(img, cv2.COLOR_BGR2LUV)  
  
cv2.imshow("gray", gray)  
cv2.imshow("hsv", hsv)  
cv2.imshow("hls", hls)  
cv2.imshow("LAB", LAB)  
cv2.imshow("LUV", LUV)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

Veamos el efecto:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
vimos seis gatos de diferentes colores. Por supuesto, hay más de 150 conversiones de espacio de color dentro de OpenCV. Es imposible demostrar uno por uno aquí. Solo hablamos de los dos más importantes: escala de grises y HSV, escala de grises, no hace falta decir más, mire principalmente HSV, HSV generalmente se usa con seguimiento de color y se puede considerar como un método de seguimiento de objetivo primario. Es más fácil rastrear objetos de cierto color que BGR, y a menudo se usa para segmentar colores designados. Objetos.

La forma en que HSV expresa imágenes en color consta de tres partes:

· Matiz (matiz, matiz)

· Saturación (saturación, pureza del color)

· Valor (ligereza)

Utilice el siguiente cilindro para representar el espacio de color HSV. La sección transversal del cilindro se puede considerar como un sistema de coordenadas polares. H está representado por el ángulo polar en coordenadas polares, S está representado por la longitud del eje polar en coordenadas polares y V está representado por el eje central del cilindro. Representación de altura.
Inserte la descripción de la imagen aquí
El tono se mide por ángulo, con un rango de valores de 0-360 °, que representa la información del color, es decir, la posición del color espectral. Expresado como sigue:
Inserte la descripción de la imagen aquí

Todos los colores en el círculo de color son colores en el espectro, comenzando desde el rojo y girando en sentido antihorario, Hue = 0 significa rojo, Hue = 120 significa verde, Hue = 240 significa azul y así sucesivamente.

En GRB, el color está determinado por tres valores. Por ejemplo, el amarillo es (255,255,0); en HSV, el amarillo está determinado por un solo valor, Hue = 60.

Media sección transversal del cilindro HSV (Hue = 60):
Inserte la descripción de la imagen aquí
la dirección horizontal representa la saturación, y la saturación representa qué tan cerca está el color del color espectral. Cuanto mayor es la saturación, más oscuro es el color, más cerca del espectro, menor es la saturación, más claro es el color, más cerca del blanco. Una saturación de 0 significa blanco puro. El rango de valores es 0-100%. Cuanto mayor sea el valor, más saturado será el color.

La dirección vertical indica el brillo, que determina el brillo del color en el espacio de color. Cuanto mayor es el brillo, más brillante es el color y el rango es 0-100%. Una claridad de 0 significa negro puro (el color es el más oscuro en este momento).

Puede entenderse como:

En el caso de un cierto tono, se reduce la saturación, es decir, se agrega blanco al color espectral, y también se reduce la proporción del color espectral. La saturación se reduce a 0, lo que significa que la proporción del color espectral es cero, resultando en todo el color Aparece blanco.

La luminosidad disminuye, es decir, se agrega negro al color espectral, y también se reduce la proporción del color espectral. La claridad disminuye a 0, lo que significa que la proporción del color espectral es cero, lo que hace que todo el color aparezca negro.

HSV es un modelo de color relativamente intuitivo para nosotros. Podemos obtener fácilmente un solo color, es decir, especificar el ángulo de color H, y dejar V = S = 1, y luego agregarle blanco y negro para obtener el color que necesitamos. Aumentar el negro puede reducir V sin cambiar S, y aumentar el blanco puede reducir S sin cambiar V. Por ejemplo, para obtener azul oscuro, V = 0.4 S = 1 H = 240 grados. Para obtener un color azul claro, V = 1 S = 0.4 H = 240 grados.

La mejora del contraste de estiramiento de HSV es normalizar los dos componentes de S y V, y H permanece sin cambios.

Nota: El rango de los tres componentes de HSV en OpenCV es:

· H = [0,179]

· S = [0,255]

· V = [0,255]

Seguimiento de color de destino

Como se mencionó anteriormente, el seguimiento de color se implementa de acuerdo con el espacio de color HSV. Primero, necesitamos realizar la conversión del espacio de color en un valor BGR para obtener el valor HSV.

Para identificar objetos de un color específico, es importante obtener el valor HSV correspondiente al color, aquí damos una tabla de conversión:
Inserte la descripción de la imagen aquí

Para implementar estos rangos de datos con código, necesitamos conocer una función de OpenCV:

cv2. inRange (InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst), el análisis de cada parámetro:
1. src es la matriz de entrada

2.lowerb es la matriz o componente de valor mínimo que contiene lowerb, el valor mínimo utilizado en la tabla anterior en este tutorial

3. upperb es la matriz de valor máximo o componente que contiene upperb, el valor máximo utilizado en la tabla anterior en este tutorial

4. La matriz de salida, el tamaño y el número de canales son los mismos que src, y es de tipo CV_8V

Veamos el código, que se usa para abrir la cámara y reconocer el movimiento del objeto verde:

view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
cap = cv2.VideoCapture(0)  
  
while True:  
    ret, frame = cap.read()  
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)  
  
    lower_black = np.array([35, 43, 46])  
    upper_black= np.array([77, 255, 255])  
  
    mask = cv2.inRange(hsv, lower_black, upper_black)  
    res = cv2.bitwise_and(frame, frame, mask=mask)  
  
    cv2.imshow('frame', frame)  
    cv2.imshow('mask', mask)  
    cv2.imshow('res', res)  
    k = cv2.waitKey(5) & 0xFF  
    if k == 27:  
        break  
  
cv2.destroyAllWindows()  

Veamos el efecto:
Inserte la descripción de la imagen aquí

Perfecto, por lo que puede usar HSV para rastrear el objeto. Lo más importante es calibrar el rango de valores. Está perfectamente bien realizar el valor de acuerdo con la tabla anterior.

Consulte la página de resumen del artículo https://blog.csdn.net/weixin_44237705/article/details/107864965
Se puede intercambiar más información técnica de openvino en el grupo ~
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_44237705/article/details/108121584
Recomendado
Clasificación