Pergunta

Como uma imagem 2D faço segmento em bolhas de valores semelhantes de forma eficiente? A entrada de dados é uma matriz N de número inteiro, que inclui matiz para pixels não cinzento e o brilho dos pixels cinzentos.

Eu estou escrevendo um robô móvel virtual usando Java, e eu estou usando segmentação para analisar o mapa e também a imagem da câmera. Este é um problema bem conhecido na Computer Vision , mas quando se está em um desempenho robô não importa então eu queria alguns insumos. Algoritmo é o que importa, então você pode postar o código em qualquer idioma.

Foi útil?

Solução

Eu downsample, em colourspace e em número de pixels, use um método de visão (provavelmente meanshift) e upscale o resultado.

Isso é bom porque downsampling também aumenta a robustez ao ruído, e torna mais provável que você obtenha segmentos significativos.

Você pode usar floodfill para suavizar as bordas mais tarde se você precisar de suavidade.

Alguns mais pensamentos (em resposta ao seu comentário).

1) Será que você mistura como você downsampled? y [i] = (x [2i] + x [2i + 1]) / 2 Este deve eliminar o ruído.

2) Qual a velocidade que você quer que seja?

3) Você já tentou meanshift dinâmico? (Também google para dinâmico x para todos os algoritmos x)

Outras dicas

Não tenho certeza se é muito eficiente, mas você pode tentar usar um Kohonen neural network (ou, auto-organizar mapa; MOS). agrupar os valores semelhantes, onde cada pixel contém a cor original e posição e só a cor é usada para o agrupamento Kohohen

Você deve ler-se antes de implementar isso, porém, como o meu conhecimento da rede de Kohonen vai tão longe como que ele é usado para agrupar dados -. Então eu não sei o que as opções de desempenho / viabilidade são para o cenário

Há também title="Wikipedia Article"> Hopfield Networks. Eles podem ser mutilado no agrupamento do que eu li.

O que eu tenho agora:

  1. Faça um tampão do mesmo tamanho que a imagem de entrada, inicializado para UNSEGMENTED.
  2. Para cada pixel na imagem em que o valor do padrão correspondente não é UNSEGMENTED, inundar o tampão usando o valor de pixel.

    a. A fronteira verificação das cheias é feito verificando se os pixels está dentro EPSILON (definido como 10) do valor do pixel de origem.

    b. Flood enchendo algoritmo .

Possível problema:

verificação de fronteira do 2.a. é chamado muitas vezes no algoritmo de inundação enchimento. Eu poderia transformá-lo em uma pesquisa se eu poderia precalculate a fronteira usando detecção de bordas, mas que pode adicionar mais tempo do que verificação atual.

private boolean isValuesCloseEnough(int a_lhs, int a_rhs) {
    return Math.abs(a_lhs - a_rhs) <= EPSILON;
}

Enhancement possível:

Em vez de verificar cada pixel único para UNSEGMENTED, eu poderia escolher aleatoriamente alguns pontos. Se você está esperando cerca de 10 gotas, escolhendo pontos aleatórios nessa ordem pode ser suficiente. Desvantagem é que você pode perder uma gota útil, mas pequena.

Confira Eyepatch (eyepatch.stanford.edu). Deve ajudá-lo durante a fase de investigação, fornecendo uma variedade de possíveis filtros de segmentação.

Uma alternativa para inundação-fill é a connnected-componentes . Então,

  1. Cheaply classificar seus pixels. por exemplo. pixels dividem em espaço de cor.
  2. Execute o cc para encontrar as bolhas
  3. Mantenha as bolhas de tamanho significativo

Esta abordagem é amplamente utilizado na visão inicial se aproxima. Por exemplo, no papel seminal " Blobworld: um sistema para Região-Based indexação e recuperação de dados ".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top