Visión por computadora (2) -Separación de color HSV y seguimiento de objetivos

  HSV es un espacio de color creado por ARSmith en 1978 basado en las características intuitivas de los colores, también llamado modelo de cono hexagonal. Los parámetros de color en este modelo son: tono (H), saturación (S) y luminosidad (V) . HSV puede percibir los colores con mayor precisión que el espacio de color RGB tradicional y aún así mantener el cálculo simple.
  Los pasos básicos de la separación de colores HSV son: convertir la representación HSV, establecer el umbral de destino, establecer la máscara y filtrar el color de destino.



1. Modelo de color RGB

  El modo de color RGB es un estándar de color en la industria. Obtiene una variedad de colores cambiando los tres canales de color rojo (R), verde (G) y azul (B) y superponiéndolos entre sí. Sí, RGB es el color que representa los tres canales de rojo, verde y azul.Este estándar incluye casi todos los colores que la visión humana puede percibir y es uno de los sistemas de color más utilizados.

RGB

Dos, modelo de color HSV

1. Modelo de color

  HSV es un espacio de color creado por ARSmith en 1978 basado en las características intuitivas de los colores, también llamado modelo de cono hexagonal. Los parámetros de color en este modelo son: tono (H), saturación (S) y luminosidad (V).
   Hue H : medido por un ángulo, el rango de valores es 0 ° ~ 360 °, comenzando desde rojo y contando en sentido antihorario, el rojo es 0 °, el verde es 120 ° y el azul es 240 °. Sus colores complementarios son: el amarillo es de 60 °, el cian es de 180 ° y el morado es de 360 ​​°.
   Saturación S : La saturación S indica qué tan cerca está el color del color espectral. Un color puede verse como el resultado de mezclar un determinado color espectral con blanco. Entre ellos, cuanto mayor es la proporción del color espectral, mayor es el color cercano al color espectral, mayor es la saturación del color, mayor es la saturación y más oscuro y brillante es el color. El componente de luz blanca del color espectral es 0 y la saturación es la más alta. Por lo general, el rango de valores es 0% ~ 100%, cuanto mayor es el valor, más saturado es el color.
   Brillo V : El brillo indica el brillo del color. Para el color de la fuente de luz, el valor está relacionado con el brillo del cuerpo luminoso; para el color de un objeto, este valor está relacionado con la transmitancia o reflectancia del objeto. . Por lo general, el valor varía entre 0% (negro) y 100% (blanco).
Inserte la descripción de la imagen aquí

2. Algoritmo de conversión

  Sean (r, g, b) las coordenadas rojo, verde y azul de un color, y sus valores son números reales entre 0 y 1. Sea max equivalente al mayor de r, gy b. Sea min igual al más pequeño de estos valores. Para encontrar el valor (h, s, v) en el espacio HSV, donde h ∈ [0, 360) es el ángulo de tono del ángulo, y s, v ∈ [0,1] es la saturación y el brillo de
h cálculo
s cálculo
v cálculo
  HSV a el usuario dice que es un modelo de color intuitivo. Podemos comenzar con un color puro, es decir, especificar el ángulo de color H y dejar V = S = 1, y luego podemos obtener el color que necesitamos agregándole blanco y negro. 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 = 210 grados. Para obtener un azul claro, V = 1 S = 0.4 H = 210 grados.
  En términos generales, el ojo humano puede distinguir 128 colores diferentes, 130 saturaciones de color y 23 tonos. Si usamos 16 bits para representar HSV, podemos usar 7 bits para almacenar H, 4 bits para almacenar S y 5 bits para almacenar V, es decir, 745 o 655 pueden satisfacer nuestras necesidades.
  Dado que HSV es un modelo de color relativamente intuitivo, se usa ampliamente en muchas herramientas de edición de imágenes, como Photoshop (llamado HSB en Photoshop), etc., pero esto también determina que no es adecuado para su uso en modelos de iluminación. Muchos híbridos ligeros Los cálculos, cálculos de intensidad de luz, etc. no se pueden implementar directamente usando HSV.
  Por cierto, otro modelo de color intuitivo es el modelo HSL, en el que los dos primeros parámetros son los mismos que HSV, y L representa el brillo. Su representación tridimensional es una doble pirámide.
  Los valores específicos de cada color son los siguientes:
Inserte la descripción de la imagen aquí

En tercer lugar, la máscara

  El concepto de máscara en el procesamiento de imágenes digitales se toma prestado del proceso de fabricación de placas de PCB. En la fabricación de semiconductores, muchos pasos del proceso de chips utilizan tecnología de fotolitografía. El "negativo" gráfico utilizado para estos pasos se llama máscara y su función es: en silicio Una plantilla de patrón opaco se oculta en el área seleccionada en el chip, y luego la siguiente corrosión o difusión solo afecta el área fuera del área seleccionada.
  El enmascaramiento de imágenes es similar al uso de imágenes, gráficos u objetos seleccionados para cubrir la imagen procesada para controlar el área o proceso de procesamiento de la imagen .
  En el procesamiento de imágenes digitales, la máscara es una matriz dimensional y, a veces, se utilizan imágenes de varios valores. La máscara de imagen se utiliza principalmente para:
  ① Extraer la región de interés y multiplicar la imagen que se procesará con la región prefabricada de máscara de interés Para la imagen de la región de interés, el valor de la imagen dentro de la región de interés permanece sin cambios, mientras que el valor de la imagen fuera de la región es 0 .
  ②Shielding función , usando una máscara para proteger ciertas áreas de la imagen para que no participan en el procesamiento o el cálculo de los parámetros de procesamiento. ¿O sólo la zona blindada está procesado o contado.
  ③Extracción de características estructurales , utilizando variables de similitud o métodos de comparación de imágenes para detectar y extraer características estructurales similares a la máscara de la imagen.
  ④La producción de imágenes de formas especiales .

Cuatro, implementación de código de separación de color HSV (python)

1. Presentar la biblioteca

import numpy as np
import cv2 

2. Importa el video original

cap = cv2.VideoCapture('green.mp4') #打开同一目录下的视频
while(cap.isOpened()):
    ret, frame = cap.read() #frame保存视频每一帧
    if ret==True: #当读取成功时

        cv2.imshow('frame',frame)
        if cv2.waitKey(10) & 0xFF == ord('q'):
            break
    else:
        break

cap.release()
cv2.destroyAllWindows()

Para facilitar la navegación, todos los videos de este artículo se convierten a formato gif y se cargan.
Video original

3. Convierta el video original al espacio de color hsv

La conversión al espacio de color hsv requiere el uso de la función cv2.cvtColor (input_image, flag)

parámetro descripción valor de retorno
input_image
La imagen que debe convertirse
Matriz de imagen después de la conversión del espacio de color
bandera
Tipo de conversión

Tipo de conversión:

Tipos de descripción
cv2.COLOR_BGR2GRAY BGR -> Gris
cv2.COLOR_BGR2RGB BGR -> RGB
cv2.COLOR_BGR2HSV BGR -> HSV

El código específico es:

hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 

El resultado después de la conversión es:
hsv

4. Consigue la mascarilla

Para calcular la máscara, primero debe determinar los umbrales de los colores y luego usar la función cv2.inRang para configurar la máscara, dejando solo la parte verde. La expansión de la matriz en la cuarta fila es solo para visualizar este paso en un video, lo cual no es necesario en la operación real.

lower = np.array([35, 43, 46])
upper = np.array([77, 255, 255])   #设定绿色的hsv阈值
mask2 = cv2.inRange(hsv, lower, upper)#设置掩模 只保留绿色部分
mask=np.stack([mask2] * 3, axis=2) #矩阵拓展

El resultado de la máscara obtenido es:
máscara

5. Filtrar el color de destino

Después de obtener la máscara, use la función cv2.bitwise_and para "Y" la máscara con la imagen original para filtrar el color verde y obtener el resultado final.

res = cv2.bitwise_and(frame, frame, mask = mask2) 

El resultado filtrado es:
por fin

6. Código completo

import cv2

cap = cv2.VideoCapture('green.mp4') #打开原视频
fourcc = cv2.VideoWriter_fourcc(*'mp4v') #设置输出视频格式
fps =cap.get(cv2.CAP_PROP_FPS) #设置输出视频帧数
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))) #视频尺寸

out2 = cv2.VideoWriter('green_hsv.mp4',fourcc, fps, size) #设置输出hsv视频
out3 = cv2.VideoWriter('green_mask.mp4',fourcc, fps, size) #设置输出mask视频
out4 = cv2.VideoWriter('green_res.mp4',fourcc, fps, size) #设置输出最终过滤视频

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)  #rgb通道难以分离颜色 需要先转化到hsv色彩空间

        lower = np.array([35, 43, 46])
        upper = np.array([77, 255, 255])   #设定绿色的hsv阈值
    
        mask2 = cv2.inRange(hsv, lower, upper)#设置掩模 只保留绿色部分
        res = cv2.bitwise_and(frame, frame, mask = mask2 #利用掩模与原图像做“与”操作 过滤出绿色
        mask=np.stack([mask2] * 3, axis=2) #mask矩阵拓展

        out2.write(hsv) #保存hsv视频到本地
        out3.write(mask) #保存mask视频到本地
        out4.write(res) #保存最终视频到本地
        
        cv2.imshow('frame',frame) #显示原视频
        cv2.imshow('hsv',hsv) #显示hsv视频
        cv2.imshow('mask',mask) #显示mask视频
        cv2.imshow('res',res) #显示最终视频
        
        if cv2.waitKey(10) & 0xFF == ord('q'):
            break
    else:
        break

cap.release()
out.release()
out2.release()
out3.release()
out4.release()
cv2.destroyAllWindows()

Cinco, seguimiento de objetivos

  A través de la separación de color hsv, podemos identificar los objetos verdes en el video, por lo que podemos usar este método para rastrear los objetos verdes en el video. Las ideas específicas son las siguientes:
  1. Utilice la operación abierta en morfología para eliminar el ruido verde en el video. Abra cálculos detallados.
  2. De acuerdo con la matriz bidimensional (0-255) obtenida por la máscara, se obtiene el rango del objeto.
  3. Dibuja una caja rectangular de acuerdo con el alcance del objeto.

El código involucrado es el siguiente:

kernel = np.ones((10,10), np.uint8) #设置开运算所需核
opening = cv2.morphologyEx(mask2, cv2.MORPH_OPEN, kernel)  # 对得到的mask进行开运算
rectangle = np.where(opening == 255) #找出开运算后矩阵中为255的部分,即物体范围
cv2.rectangle(frame, (min(rectangle[1]), min(rectangle[0])), (max(rectangle[1]), max(rectangle[0])), (0, 0, 255), 3) #根据每一帧中物体的左上角坐标以及右下角坐标绘制矩形框

El resultado final es:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_41433002/article/details/115309090
Recomendado
Clasificación