Mean-shift é um método de segmentação baseado em cores, ou seja, no caráter multidimensional das imagens coloridas. Hoje vou mostrar um exemplo de uso, com um plugin do ImageJ. A teoria toda não cabe num post, por isso deixo para mais adiante.
Uma Imagem
Já trabalhei com a imagem escolhida em outro post (sobre como agrupar imagens em pilhas), e naquela a segmentação não ficou tão boa, no final. é uma imagem difícil justamente por causa da variedade de cores.
Vamos considerar que, no exemplo de hoje, meu interesse á contar quantos lápis aparecem na imagem. Por uma questão de amostragem, vou contar apenas aqueles em que a parte colorida (a que desenha) ficou inteira dentro do enquadramento.
O plug-in
O plug-in que vamos usar pode ser obtido em http://rsb.info.nih.gov/ij/plugins/mean-shift.html, e foi desenvolvido por Kai Uwe Barthel (thanks!), de Berlin, na Alemanha.
Instruções de instalação estão lá no link também (se você tem Ubuntu, vai querer dar uma olhada aqui).
O processo de segmentação
Passo 1: Mean-shift
Se a instalação do plugin funcionou, você vai encontrar um item Mean Shit na parte de baixo do Menu plugin. Clique aí.

O diálogo que aparece pede dois valores: Spatial Radius e Color Distance. Como não vou entrar na teoria agora, não tenho como explicar o que cada um faz, mas pense que alterá-los muda um pouco o resultado, e que se você tem uma imagem diferente da minha provavelmente vai querer testar algumas combinações escolher a que der um resultado melhor.
Eu fiquei com Spatial Radius = 7 e Color Distance = 25.
Passo 2: Filtro de mediana
O resultado do mean-shift foi bom, mas aqueles pontinhos escuros e ranhuras nos lápis podem atrapalhar a deteção de bordas (passo 3), então usei um filtro de mediana (valor 7 resolve) pra eliminá-los.
Passo 3: Detecção de bordas
Se o ImageJ tivesse um algoritmo de rotulagem para imagens coloridas poderíamos usá-lo aqui e estaria tudo pronto. Mas não tem, então precisamos de alguns passos adicionais, só para chegarmos lá com as ferramentas que temos.
Use a detecção de bordas a partir do menu Process –> Find Edges. O resultado pode ser visto na primeira imagem da montagem abaixo.
Passo 4: Elimine as cores
O threshold só funciona em tons de cinza, então converta esta imagem par a 8-bits, usando Image –> Type –> 8-bit.
Passo 5: Treshold
Ache um ponto de threshold em que as linhas dos objetos que interessam (a parte interna dos lápis) ficam tem nítidas. Será necessário selecionar a opção “Dark backgroud” no diálogo de treshold para que as linhas fiquem brancas e todo o resto, preto.
Passo 6: Análise
Use o Particle Analyser para rotular e obter o número de objetos.
O truque aqui é preencher os buracos (isso vai pintar dentro das bordas) e limitar a partículas com circularidade alta, (usei 0.9) – o que elimina tudo que não for muito parecido com um círculo.
O resultado é perfeito – 14 bolinhas, que representam os 14 lápis que apareceram no enquadramento da foto.
A tabela de resultados mostra todas as 14 regiões e seus valores de área o outro que tenham sido pedidos.
Crédito da imagem:
A imagem dos lápis é de *L*u*z*a*.



Muito interessante esse Mean-Shift, não conhecia. Já valeu o post.
Olah, Gabriela:
Gostei muito do post sobre o Mean-Shift. Jah conhecia e jah havia aplicado algumas vezes em problemas de segmentacao de imagens (implementei no ImageJ uma versao para imagens com 2^8 e 2^16 niveis de cinza).
Entretanto, a parte que mais me deixa curioso nesse algoritmo voce nao explicou: o Spatial Radius e o Color Distance. Tentei varios valores para os dois e percebi que eles alteram a imagem final, mas de uma forma que eu nao consegui relacionar muito bem (apesar de ter lido os artigos que descrevem o metodo).
Estou ansioso pela segunda parte desse post, pois espero que voce possa esclarecer essa minha duvida.
Um abraco,
JanKees
Olá Antonio!
Bom te ver por aqui… o Mean-shift é um dos melhores, mas nossos computadores ainda são lentos prá ele.
Olá JanKees,
É difícil de explicar, mesmo. Estou preparando o post teórico ainda.
Bom te ver por aqui! Até mais!
Realmente, como voce mesmo disse, Gabriela, o Mean-shift é um excelente metodo de segmentacao, mas ele demooooooooooora uma pa de tempo para ser aplicado em uma imagem grande. Tanto eh que u, apesar de saber das consequencias, faco um resampling das imagens grandes para um tamanho (bem) menor antes de aplica-lo.
Aih voce veja meu caso: trabalho com imagens mamograficas (entre 20 e 50 M de tamanho, 16 bits de cinza) e imagina o tempo que iria demorar para aplicar o Mean-Shift nessas “pequenas” imagens!
Um abraco,
JanKees
Oi, JanKees!
A boa notícia é que tem um aluno de mestrado aqui trabalhando em uma versão do mean-shift em CUDA – isto significa que ele vai usar a mesma tecnologia que acelera os video-games para acelerar também o mean-shift. Só vai funcionar em computadores que tenham um conjunto de placas gráficas do tipo certo, mas já é um começo.
Até mais.