associate soma matrizes
associate_soma_matrizes
O nosso objetivo é melhorar a associação blob-peixe, certo? Para tanto, podemos imaginar o seguinte cenário: dois peixes que se movem para posições próximas, e se encontram sob uma iluminação diferente. O processamento do extractnblobs
gera os blobs, e precisamos selecionar aqueles que melhor estimam as novas localizações do animal (pxn
/pyn
).
Como é dito na documentação do blob_colours_2
, o conceito de cor é introduzido como proposta de melhoria. Utiliza-se o calcula_centroids_cov_rgb
para se identificar cores médias de cada peixe, no espaço RGB.
Após aplicarmos blob_colours_2
, possuímos a listagem das cores identificadas para cada blob (vamos chamar variável bc_2
).
Ora, vamos supor que de um quadro a outro a iluminação não varia bruscamente (ou seja, não existem variações de intensidade capazes de mesclar as cores), e que cada peixe não está demasiado distante de suas posições anteriores. Assim sendo, podemos supor que a localização anterior do peixe (tomando apenas um como exemplo) está mais próxima do blob correto (dentre todos) e que a coloração do blob se encontra mais próxima, no espaço RGB, do centróide relacionado ao peixe correto. A implicação prática dessa consequência é que, se formos capazes de definir duas matrizes específicas (uma que computa a distância entre as posições anteriores dos peixes e os blobs encontrados; e outra que computa a distância entre as cores estimadas dos blobs e os centróides RGB), a soma de ambas gera uma matriz que indica os blobs que melhor estimam a nova posição dos peixes.
Ok, mas como definir tais matrizes? Note que existem, por definição, tantos centróides quanto animais. A quantidade de blobs é uma característica do frame em questão. Isso implica que é possível computar matrizes de distâncias que possuem as dimensões corretas, de forma a serem somadas.
O usuário define como input
os seguintes valores:
-
bc2_avg_vector
: a saída doblob_colours_2
(as cores encontradas para cada blob). Um datatype cell com formato #blobs x 3 ; -
centroids
: a saída decalcula_centroids_cov_rgb
(centroides das nuvens de pontos no espaço RGB). Um datatype mat com formato nanimais x 3; -
cx
/cy
: centróides das boundingbox, na imagem (não confundir com os centróides do espaço RGB). Dois objetos com formato nanimais x 2 e datatype mat; -
px_ant
/py_ant
: as posições em que os peixes se encontravam, no quadro anterior. Dois objetos com formato nanimais x 2 e datatype mat.
O código retorna as estimativas das posições: pxn
/pyn
. Dois objetos com formato nanimais x 2 e datatype mat.
A primeira etapa do código é transformar o data type do parâmetro bc2_avg_vector de cell para vector.
Após concluída essa etapa, calcula-se a distância euclidiana entre todos os pontos a serem avaliados e todos os centróides, executando o comando pdist2(). O resultado é armazenado em D_cores
. Da forma como o comando está sendo executado, o elemento i,j da matriz D_cores
é a distância entre o ponto RGB i e o centróide j.
Aloca-se na variável centroides_boundingbox
uma matriz cujas colunas são as variáveis cx
e cy
. Na variável pontos_anteriores_imagem
a matriz composta por px_ant
e py_ant
.
Após concluída essa etapa, calcula-se a distância euclidiana entre todos os pontos anteriores e todos os centróides das boundigbox, executando o comando pdist2(). O resultado é armazenado em D_imagem
. Da forma como o comando está sendo executado, o elemento i,j da matriz D_cores
é a distância entre o centróide da boundingbox i e o ponto anterior j.
Define-se uma matriz D
como a soma de D_cores
e D_imagem
. Aplica-se a função min(D,[],1)
de forma a descobrir os menores valores entre as colunas. Por que assim? Lembre-se que queremos descobrir qual boundingbox gera menos variação em relação ao frame anterior (ou seja, maior proximidade na imagem e cor mais adequada). Para isso, precisamos identificar qual é o elemento para cada coluna. O resultado da aplicação da função de mínimo é registrado na variável I.
Ora, a variável I indica quais linhas de centroides_boundingbox
são as melhores estimativas das posições atuais dos peixes. Guarda-se esses valores em centroides_escolhidos
.
A primeira coluna de centroides_escolhidos
é armazenada em pxn
e a segunda em pyn
.
Considere um experimento em que existem dois peixes que precisamos acompanhar. Os centróides das nuvens de pontos, no espaço de cores, possuem valores iguais a: [ 72.8047 22.3412 30.9006 ]
(C1) e [ 23.3055 25.0995 57.2719 ]
(C2). Suponha, também, que as posições passadas (isto é, posições no frame anterior) desses animais são [ 275.5008 272.0408 ]
(E) e [ 231.5912 289.9099 ]
(O).
Suponha que, para o frame atual, identificou-se três blobs. Para eles, temos os centróides dos boundingboxes: [287.3282 270.3820]
(a), [282.0642 315.9358]
(i) e [295.0000 322.0000]
(u). Após a aplicação da função blob_colours_2
, são identificados, respectivamente, os seguintes valores médios de cor: [22 28.5 58.05]
(alpha), [52 24 25]
(beta) e [0 0 0]
(gamma).
Atenção! Provavelmente esse valor de cor do vetor nulo foi obtido de um boundingbox inválido (nenhuma cor identificada).
Atenção! As legendas alpha, gamma, beta, C1, C2, a, i, u,E e O são arbitrárias e não carregam nenhum significado. Isto é, são nomenclaturas cuja única função é distinguir os objetos matemáticos (vetores, no caso) sendo manipulados.
Ao definir as distâncias entre as cores das boundingboxes e os centróides no espaço de cores (isto é, D_cores
), temos o resultado:
>> D_cores
ans =
[ 57.9322 3.7247
21.6888 43.1979
82.1858 66.7323]
Ao definir as distâncias entre os centróides das boundingboxes e os pontos anteriores (D_imagem
):
>> D_imagem
[ 11.9432 59.0589
44.3830 56.7879
53.6297 71.0665]
Para entendermos melhor o que as matrizes acima significam, pensemos nelas como tabelas, em que cada elemento se refere a distância entre o objeto descrito na linha e o objeto descrito na coluna.
Para D_cores
, temos nas linhas as cores das boundingboxes , enquanto que as colunas se referem aos centróides definidos no espaço RGB. A legenda para cada um desses objetos já foi definida acima.
cor dos boundingboxes/centroides no espaço de cor | C1 | C2 |
---|---|---|
alpha | 57.9322 | 3.7247 |
beta | 21.6888 | 43.1979 |
gamma | 82.1858 | 66.7323 |
Como ler essa matriz (ou tabela)? Ora. A distância da cor alpha (um vetor RGB) ao centróide RGB C1 é 57.9322, enquanto que a distância da mesma cor ao centróide C2 vale 3.7247. Isso implica que a cor alpha está mais próxima, no espaço de cores, do centróide C1 que do centróide C2.
Para D_imagem
, temos nas linhas as posições dos centróides das boundingboxes no frame atual, enquanto que as colunas se referem às posições dos peixes definidos no frame imediatamente anterior. A legenda para cada um desses objetos já foi definida acima.
centróides das boundingboxes/posições anteriores | E | O |
---|---|---|
a | 11.9432 | 59.0589 |
i | 44.3830 | 56.7879 |
u | 53.6297 | 71.0665 |
Essa tabela pode ser lida da seguinte forma (por exemplo): a posição da boundingbox a está mais próxima da posição anterior E (distância vale 11.9432) que da posição O (distância vale 59.0589).
Atenção! O objetivo do cálculo que está sendo feito pela função
associate_soma_matrizes
é identificar quais centróides das boundingboxes devem ser utilizados como novas posições dos peixes, certo? Vamos focar na matrizD_imagem
desse exemplo. Já vimos como cada elemento indica a distância entre as posições anteriores e as recentes. Ora, queremos dois centróides de boundingboxes apenas (pois sabemos que existem apenas dois animais no vídeo), e temos três. O que fazer? Escolher aqueles que estão mais próximos das posições anteriores. Para cada coluna devemos escolher os menores valores. A linha escolhida indica o centróide da boundingbox a ser escolhido. Note que uma linha não pode ser escolhida duas vezes! Para o exemplo mencionado, deveríamos escolher o centróide a como próxima posição em relação a E e o centróide i como próxima posição para O.
Tenha cuidado! Utilizei a matriz
D_imagem
como exemplo por ser mais fácil de visualizar. Na aplicação utiliza-se a matrizD
, que será definida abaixo.
Ao definirmos D
como a soma entre D_imagem
e D_cores
, temos:
D =
69.8753 62.7836
66.0718 99.9859
135.8154 137.7988
O processo de detecção seguinte indica que os centróides das boundingbox
que melhor se aproximam das posições anteriores são os a e i. Isso porque os menores elementos de distância são aqueles que se encontram nas posições 2,1 (66.0718) e 1,2 (62.7836). Note que, se checarmos essas posições na tabela D_imagem
, confirmaremos a escolha dos centróides.