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.)
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:
- Digitalizando em uma janela 3x3, procure vizinhos.
- Atravesse o objeto conectado completo.
- Tente ajustar uma linha (ou talvez um polinômio quadrático).
- 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.
fonte
Respostas:
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.
fonte
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).
fonte