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.
Artigo Diretório
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.
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).
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
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:
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.
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 | ||||||
---|---|---|---|---|---|---|---|---|
|
|
|
||||||
|
|
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 é:
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 é:
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 é:
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 é: