Visão computacional (2) - separação de cores e rastreamento de alvos em HSV

  HSV é um espaço de cores criado pela ARSmith em 1978 com base nas características intuitivas das cores, também chamado de modelo de cone hexagonal. Os parâmetros de cor neste modelo são: matiz (H), saturação (S) e luminosidade (V) . O HSV pode perceber as cores com mais precisão do que o espaço de cores RGB tradicional e ainda manter o cálculo simples.
  As etapas básicas da separação de cores HSV são: converter a representação HSV, definir o limite de destino, definir a máscara e filtrar a cor de destino.



1. Modelo de cores RGB

  O modo de cor RGB é um padrão de cor na indústria. Ele obtém uma variedade de cores alterando os três canais de cores de vermelho (R), verde (G) e azul (B) e sobrepondo-os entre si. Sim, RGB é a cor que representa os três canais de vermelho, verde e azul. Este padrão inclui quase todas as cores que a visão humana pode perceber e é um dos sistemas de cores mais amplamente usados.

RGB

Dois, modelo de cores HSV

1. Modelo de cores

  HSV é um espaço de cores criado pela ARSmith em 1978 com base nas características intuitivas das cores, também chamado de modelo de cone hexagonal. Os parâmetros de cor neste modelo são: matiz (H), saturação (S) e luminosidade (V).
   Matiz H : medido por um ângulo, o intervalo de valores é 0 ° ~ 360 °, começando no vermelho e contando no sentido anti-horário, vermelho é 0 °, verde é 120 ° e azul é 240 °. Suas cores complementares são: amarelo é 60 °, ciano é 180 ° e roxo é 360 °.
   Saturação S : Saturação S indica quão próxima a cor está da cor espectral. Uma cor pode ser vista como o resultado da mistura de uma determinada cor espectral com o branco. Dentre eles, quanto maior a proporção da cor espectral, quanto maior a cor próxima à cor espectral, quanto maior a saturação da cor, maior a saturação e mais escura e mais clara a cor. O componente de luz branca da cor espectral é 0 e a saturação é a mais alta. Normalmente, o intervalo de valores é 0% ~ 100%, quanto maior o valor, mais saturada é a cor.
   Brilho V : Brilho indica o brilho da cor. Para a cor da fonte de luz, o valor está relacionado ao brilho do corpo luminoso; para a cor de um objeto, este valor está relacionado à transmitância ou refletância do objeto . Normalmente, o valor varia de 0% (preto) a 100% (branco).
Insira a descrição da imagem aqui

2. Algoritmo de conversão

  Sejam (r, g, b) as coordenadas vermelha, verde e azul de uma cor, e seus valores são números reais entre 0 e 1. Seja max equivalente ao maior de r, g e b. Seja min igual ao menor desses valores. Para encontrar o valor (h, s, v) no espaço HSV, onde h ∈ [0, 360) é o ângulo de matiz do ângulo, e s, v ∈ [0,1] é a saturação e brilho do
cálculo h
cálculo s
cálculo v
  HSV para o usuário disse ser um modelo de cores intuitivo. Podemos começar com uma cor pura, ou seja, especificar o ângulo de cor H e deixar V = S = 1, e então podemos obter a cor de que precisamos adicionando preto e branco a ela. Aumentar o preto pode reduzir V sem alterar S, e aumentar o branco pode reduzir S sem alterar V. Por exemplo, para obter o azul escuro, V = 0,4 S = 1 H = 210 graus. Para obter o azul claro, V = 1 S = 0,4 H = 210 graus.
  De modo geral, o olho humano pode distinguir 128 cores diferentes, 130 saturações de cores e 23 tons. Se usarmos 16 bits para representar HSV, podemos usar 7 bits para armazenar H, 4 bits para armazenar S e 5 bits para armazenar V, ou seja, 745 ou 655 podem atender às nossas necessidades.
  Como o HSV é um modelo de cor relativamente intuitivo, ele é amplamente utilizado em muitas ferramentas de edição de imagem, como o Photoshop (chamado de HSB no Photoshop), etc., mas isso também determina que não é adequado para uso em modelos de iluminação. cálculos, cálculos de intensidade de luz, etc. não podem ser implementados diretamente usando HSV.
  A propósito, outro modelo de cor intuitivo é o modelo HSL, no qual os dois primeiros parâmetros são iguais a HSV e L representa o brilho. Sua representação tridimensional é uma pirâmide dupla.
  Os valores específicos de cada cor são os seguintes:
Insira a descrição da imagem aqui

Terceiro, a máscara

  O conceito de máscara no processamento de imagem digital é emprestado do processo de fabricação de placas de PCB. Na fabricação de semicondutores, muitas etapas do processo de chip usam tecnologia de fotolitografia. O "negativo" gráfico usado para essas etapas é chamado de máscara e sua função é: no silício Um modelo de padrão opaco é oculto na área selecionada no chip e, em seguida, a corrosão ou difusão seguinte afeta apenas a área fora da área selecionada.
  O mascaramento de imagem é semelhante a ele, usando imagens, gráficos ou objetos selecionados para cobrir a imagem processada para controlar a área ou processo de processamento de imagem .
  No processamento de imagem digital, a máscara é uma matriz dimensional e, às vezes, imagens de vários valores são usadas. A máscara de imagem é usada principalmente para:
  ① Extrair a região de interesse e multiplicar a imagem a ser processada com a região pré-fabricada de máscara de interesse. Para a imagem da região de interesse, o valor da imagem dentro da região de interesse permanece o mesmo, enquanto o valor da imagem fora da região é 0 .
  ② Função de blindagem , que utiliza uma máscara para blindar certas áreas da imagem para que não participem do processamento ou cálculo dos parâmetros de processamento, ou apenas a área protegida é processada ou contada.
  ③ Extração de recursos estruturais , usando variáveis ​​de similaridade ou métodos de correspondência de imagem para detectar e extrair recursos estruturais semelhantes à máscara na imagem.
  ④ A produção de imagens de formas especiais .

Quatro, implementação de código de separação de cores HSV (python)

1. Apresente a biblioteca

import numpy as np
import cv2 

2. Importe o vídeo 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 a navegação, todos os vídeos neste artigo são convertidos para o formato gif e carregados.
Vídeo original

3. Converta o vídeo original em espaço de cor hsv

A conversão para o espaço de cores hsv requer o uso da função cv2.cvtColor (input_image, flag)

parâmetro Descrição valor de retorno
input_image
A imagem que precisa ser convertida
Matriz de imagem após conversão de espaço de cor
bandeira
Tipo de conversão

Tipo de conversão:

Tipos de Descrição
cv2.COLOR_BGR2GRAY BGR -> Cinza
cv2.COLOR_BGR2RGB BGR -> RGB
cv2.COLOR_BGR2HSV BGR -> HSV

O código específico é:

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

O resultado após a conversão é:
HSV

4. Pegue a máscara

Para calcular a máscara, primeiro você precisa determinar os limites das cores e, em seguida, usar a função cv2.inRang para definir a máscara, deixando apenas a parte verde. A expansão da matriz na quarta linha serve apenas para visualizar essa etapa em um vídeo, o que não é necessário na operação 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) #矩阵拓展

O resultado da máscara obtido é:
mascarar

5. Filtre a cor alvo

Depois de obter a máscara, use a função cv2.bitwise_and para "E" a máscara com a imagem original para filtrar a cor verde e obter o resultado final.

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

O resultado filtrado é:
finalmente

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, rastreamento de alvo

  Por meio da separação de cores hsv, podemos identificar os objetos verdes no vídeo, para que possamos usar esse método posteriormente para rastrear os objetos verdes no vídeo. As idéias específicas são as seguintes:
  1. Use a operação aberta em morfologia para remover o ruído verde no vídeo. Abra cálculos detalhados.
  2. De acordo com a matriz bidimensional (0-255) obtida pela máscara, o alcance do objeto é obtido.
  3. Desenhe uma caixa retangular de acordo com o escopo do objeto.

O código envolvido é o seguinte:

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) #根据每一帧中物体的左上角坐标以及右下角坐标绘制矩形框

O resultado final é:
Insira a descrição da imagem aqui

Acho que você gosta

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