Skip to content

associate soma matrizes

Mateus de Assis Silva edited this page Nov 16, 2020 · 14 revisions

Funções encontradas nesse arquivo:

  1. associate_soma_matrizes

Introdução

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.

Como usar

O usuário define como input os seguintes valores:

  • bc2_avg_vector: a saída do blob_colours_2 (as cores encontradas para cada blob). Um datatype cell com formato #blobs x 3 ;
  • centroids: a saída de calcula_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.

Como funciona

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.

Exemplo

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 matriz D_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 matriz D, 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.