Como detecto objetos distintos quando suas bordas se tocam?

21

Preciso encontrar todos os contornos de uma imagem recuperada da câmera. Então, primeiro uso o detector de arestas astutos para encontrar as arestas e depois os contornos. Bem simples.

No entanto, meus contornos são "mesclados". Por exemplo, na imagem abaixo, tenho claramente 4 objetos diferentes. As bordas tocam levemente em alguns pontos, então eu recebo um grande contorno em vez de quatro separados. Tentei mudar os limites, as operações de erosão, morfologia e coisas semelhantes, mas as bordas continuam se tocando levemente. Alguém tem alguma sugestão sobre como obter contornos separados em imagens semelhantes à abaixo? (A imagem abaixo é obviamente apenas um exemplo, minhas imagens reais são muito mais complexas, mas têm o mesmo problema básico).

insira a descrição da imagem aqui

Lorem Ipsum
fonte
A segmentação de bacias hidrográficas pode funcionar.
sm176357
Portanto, você também deve considerar os casos em que o contato é uma linha e não apenas um ponto (tocar, mas não se sobrepor)
Shravya Boggarapu

Respostas:

11

Detectando diferentes componentes:

Se você estiver tentando detectar os diferentes componentes, provavelmente existem outras abordagens para fazê-los além de detectar os contornos. Aqui está um exemplo no Mathematica. Uma erosão seguida de dilatação é usada para fechar a lacuna no segundo componente antes da detecção (se você não fizer isso, ele não detectará).

img = Binarize@Import["http://i.stack.imgur.com/yqDyu.png"];
Colorize[MorphologicalComponents[Dilation[Erosion[img,1],1]]]

A figura à esquerda abaixo mostra a detecção imperfeita de objetos (sem fechar a lacuna) e à direita mostra a detecção correta (executando o código acima).

insira a descrição da imagem aqui insira a descrição da imagem aqui

Detectando os diferentes contornos:

No entanto, se você realmente deseja separar apenas os contornos, aqui está um exemplo. A erosão e a dilatação são realizadas como antes para fechar a lacuna e a imagem resultante é executada através de um detector de borda Canny. Tornei explícitas as opções padrão, para que você possa ver o que está sendo usado.

img2 = EdgeDetect[Dilation[Erosion[img, 1], 1], Method -> "Canny"]

Isso fornecerá a borda interna e externa (veja a figura à esquerda abaixo), pois a largura do pixel é maior que 1 ao redor. Não tive muita sorte em tentar diminuí-lo, pois o desempenho diminui (pode ser diferente para as outras imagens). Os contornos internos são os que você deseja e o contorno externo é apenas o contorno combinado de todos os 4 componentes. Agora tudo o que precisamos fazer é soltar o mais externo com:

SelectComponents[img2, "EnclosingComponentCount", # > 0 &]

que fornece os contornos internos (veja o canto inferior direito). Em outras palavras, ele seleciona apenas os contornos que são delimitados por pelo menos um outro contorno, que desqualifica automaticamente o mais externo. Eu não sei o equivalente desses comandos / operações no openCV.

insira a descrição da imagem aqui insira a descrição da imagem aqui

Observe que as quebras aparentes na figura devem ser salvas no jpeg em um tamanho menor. Não parece assim na minha tela.

Lorem Ipsum
fonte
2

Tente pré-processar suas imagens com um filtro morfológico como erosão . Isso permitirá que os contornos tocantes sejam separados. Depois de detectar seus contornos, você pode aplicar uma operação de dilatação para completar as treliças.


fonte
Eu tentei isso, mas os resultados não mostraram melhora.
1
Você pode mostrar uma imagem de exemplo real?
2

Não é uma resposta para sua pergunta, mas a análise de contorno é propensa a erros. Você não pode fazer muito sobre isso e funciona apenas em cenários muito simples.

Se você tiver problemas para usá-lo, procure um algoritmo completamente diferente. Existem maneiras mais complexas e robustas de resolver as coisas, mas isso depende do que você deseja alcançar (detecção de objetos, rastreamento, etc ...)


fonte
Obrigado. Meu programa é usado para detecção manual, então eu acho que seria muito semelhante à detecção de objeto. Você deu sugestões para algoritmos mais complexos e robustos? Recursos Haar, SURF e algoritmos de aprendizado de máquina semelhantes não são algo que eu posso fazer.
Você olhou para esses recursos? paginas.fe.up.pt/~hgc2011 São principalmente bancos de dados / resultados, mas espero que você consiga encontrar alguns bons artigos aqui.
0

Os contornos não são necessariamente abertos, considere que você usou o asny para detectá-los. Os problemas com Canny já foram discutidos aqui . A discussão sobre o canny fornece a idéia básica de que ainda existem operações como fechamento e dilatação que são necessárias, além do canny, para avaliar contornos fechados.

Isso também depende se estamos procurando contornos ou segmentações (Canny versus métodos como Graphcuts ). Então, acho que procurar uma solução robusta depende da sua aplicação final.

beedot
fonte