Bordas de conexão detectadas por um detector de bordas

14

Eu tenho uma imagem binária obtida de um detector de borda inteligente. As arestas não são bem detectadas no centro e eu preciso me juntar a elas. A conexão das arestas depende da orientação e da vizinhança. Preciso conectar os vértices se estiverem abaixo de um limite (digamos, menos de 5 pixels de distância). Se minhas características quase lineares são bem orientadas, esse limite deve ser relaxado. (Este é o melhor caso.) imagem

Tentei a transformação Hough, mas não funcionou para mim porque não tenho linhas retas. Dilatação e erosão também não são boas; eles tornam as imagens mais confusas.

A abordagem que estou tentando é primeiro detectar vértices e nós (no MATLAB com bwmorph) e depois criar folhas como um recurso separado. Isto se faz do seguinte modo:

  1. Digitalizando em uma janela 3x3, procure vizinhos.
  2. Atravesse o objeto conectado completo.
  3. Tente ajustar uma linha (ou talvez um polinômio quadrático).
  4. Verifique recurso por recurso se vale a pena uma conexão ou não.

A implementação não é direta, uma vez que a parte da tomada de decisões em que os vértices precisam ser conectados é complicada.

Naresh
fonte
Encontrei uma solução interessante para encontrar os galhos. O MATLAB pode facilmente fornecer os nós para a localização. O MATLAB também pode rotular os recursos conectados. Então você pode escolher um recurso conectado. Encontre nós. Defina esses nós como 0. Desconecte basicamente o recurso e rotule-o novamente. Você terá galhos nas árvores. Isso exigiu menos programação manual e os resultados parecem bons. Alguma entrada?
Naresh
Para a parte de conexão, agora estou pensando em encontrar grandes recursos e considerá-los mais confiáveis. Então, se são linhas retas (verifique a qualidade do condicionamento físico), converta-as em coordenadas polares e procure vizinhanças como uma transformação. Para recursos grandes, o raio da pesquisa é grande (proporcional ao tamanho). Estou implementando este código. Resultados a caminho. Comentários pls.
Naresh

Respostas:

4

Esta pode não ser a solução completa, mas lhe dará uma boa direção.

Basicamente, quais são os principais critérios para dizer que as arestas correspondem? Que "localmente" o gradiente da aresta corresponde e, em certa medida, as distâncias são razoáveis ​​em relação ao tempo em que a aresta é contínua.

Se você tiver arestas geométricas, como longas linhas retas, o Hough fará um trabalho perfeitamente contínuo imediatamente. Mas isso não funciona quando as arestas são curvas arbitrárias. Nesse caso, você ainda pode pensar em curva como segmentos constantes aproximadamente sábios (bons o suficiente no seu caso); portanto, você deve usar o Hough localmente. ou seja, você pode tirar uma pequena parte da imagem (digamos, um bloco), calcular o Hough e identificar alguns picos. Com base nisso, você pode identificar que a remoção de houghing está criando uma lacuna significativa; nesse caso, mantenha-a ou siga em frente.

Uma vez preenchidos espaços menores, você pode estender o mesmo para ocupar um tamanho maior. os picos serão maiores, mas você pode selecionar menos.

Dipan Mehta
fonte
obrigado Dipan, pensei nisso também. Será uma operação cara, mas posso extrair algumas informações. Mas às vezes a transfomação Hoguh também não está me dando linhas conectadas. Hough só cuida de linhas retas perfeitas. E não se importa com a conectividade dos pixels. Apenas encaixa uma linha em 3 ou mais pixels aleatórios em uma linha reta. Estou codificando minha hipótese. Vou postar resultados aqui para uma discussão mais aprofundada. Naresh
Naresh
θ
4

Isso não será realmente claro ... Você pode tentar trabalhar inteiramente com uma estrutura Graph. Primeiro, extraia todos os pixels conectados da imagem e insira-os em um gráfico em que os nós vizinhos estejam conectados com uma aresta. Você pode descartar gráficos menores que alguns números M de nós (para excluir pequenos pontos que não são relevantes para a imagem).

No final deste processo, você terá um conjunto de gráficos desconectados. (A julgar pela sua imagem, estas não são exatamente árvores, porque existem ciclos lá)

Você pode encontrar os pontos extremais de cada gráfico (os pixels extremais na periferia de cada gráfico) iniciando em algum nó aleatório e executando um DFS .

No final deste processo, você terá um conjunto de coordenadas de pixel para cada gráfico, correspondendo aos pontos extremais em que as conexões têm maior probabilidade de se formar.

Agora você pode tentar conectar os vizinhos do ponto externo mais próximos (com uma distância <= 5) simplesmente com uma linha reta.

Mas, se você quiser levar em consideração a inclinação do segmento de linha que leva ao pixel externo, tente "ajustar uma linha" a N pixels ANTES de atingir esse pixel externo. Portanto, se N = 5, os últimos 5 pixels de um ramo seriam usados ​​na estimativa de uma linha.

Portanto, para cada par vizinho mais próximo, você também tem outra coisa a ser usada como critério para julgar se dois segmentos devem ser conectados (por exemplo, distância do ponto extremo externo <= 5 pixels E inclinação aproximadamente igual à linha).

Para minimizar o impacto do ruído que pode fazer com que suas linhas pareçam serrilhadas perto das dicas do ramo (e, portanto, distorça sua estimativa de inclinação), tente aplicar uma etapa de simplificação ao seu gráfico (este é outro ponto (além do DFS acima) em que vale a pena trabalhar com uma estrutura de gráfico). Você pode, por exemplo, remover os nós subsequentes do gráfico que tornariam a linha "dobrada" em ângulos maiores que alguns pontos de corte (para algo mais complexo, consulte aqui ). Dessa maneira, você ajustará linhas "mais simples", aproximadamente na direção de uma parte maior do segmento formado pelos pixels da imagem.

Provavelmente, isso resultará em conexões decentes para a maioria dos casos (a julgar pela imagem que você postou), mas ainda assim você deixará algumas com problemas. Por exemplo, como um padrão interrompido em forma de "Y", onde um dos ramos é interrompido perto do ponto de conexão, é conectado? (ou seja, você tem uma dobra "contínua" que deve ser conectada a um segmento de linha que "combina" com ela). Talvez você possa revisar como esses casos são comuns e revisar seus critérios de conexão posteriormente.

Além disso, talvez valha a pena examinar como você pode melhorar sua aquisição de imagens (aumente a resolução, por exemplo).

A_A
fonte
Obrigado por uma boa resposta. Sim, sua observação está certa. Não é uma árvore, é melhor fazer um gráfico. Isso vai me ajudar a encontrar ciclos também. O problema é que o MATLAB implementou o gráfico na caixa de ferramentas de bioinfo, o que não posso supor que a maioria das pessoas terá. O máximo que posso fazer é caixa de ferramentas para processamento de imagens. Douglas-Peucker também é algo que eu considerei. Mas depois de consultar um especialista em GIS, percebi que isso poderia tornar as coisas mais complexas e que eu poderia ter linhas que se cruzam. Além disso, também preciso olhar para diferentes segmentos de linhas em um gráfico, pois preciso de 10 pixels para fazer uma linha, e talvez eu já tenha uma bifurcação.
Naresh