Olá Comunidade CV / Reconhecimento de padrões,
Eu tenho um problema sério em relação à segmentação de uma imagem. O cenário é uma atmosfera dentro de um forno que deixa minha cabeça louca. E preciso detectar contornos de objetos de diferentes materiais (vidro, cerâmica, Al, Ir, ..) em um curto período de tempo (<10 segundos) e não apenas em um caso especial. Também preciso do contorno em uma linha seqüencial de pixels para o código. Portanto, também é necessário um código de cadeia ou o chamado seguimento de borda / contorno, para que os furos abertos não sejam bons. No fundo, existem ruídos não lineares, aproximadamente de poeira, partículas ou algo mais, que aparecem periodicamente.
Sugestões Matlab ou OpenCV são bem-vindas.
Para deixar mais claro, publiquei outra imagem da minha meta e um objeto semitransparente, que também precisa ser detectado. Também exemplos adicionais que precisam estar cientes.
Como você pode ver na imagem nº 1, existem partículas na parte direita da imagem e próximas ao contorno externo da estrela, que é o objeto. Além disso, o contraste geral não é muito bom. O objeto em si fica em um subsolo, o que não é relevante para a detecção de contorno. A imagem 2 mostra um objeto semitransparente, o que também é possível.
Quero encontrar o contorno / perímetro desse objeto, como na próxima tela (linha vermelha). Os dois retângulos (amarelo) estão marcando o ponto inicial (esquerda) e o ponto final (direita). A linha azul é ignorável.
No começo, pensei que poderia resolver o problema daquela atmosfera imunda com apenas filtros. Mas, depois de uma quantidade honrosa de tempo de investimento, acabei de perceber que preciso elimar ou reduzir significativamente os ruídos para aumentar o contraste de primeiro plano e de fundo. Eu tentei vários métodos, como equalização de histograma, equalização adaptativa Otsu, filtros lineares (por exemplo, gauss), filtros não lineares (mediana, difusão), contornos ativos, k-Means, Fuzzy-c-means e também Canny por pura Detecção de Borda em combinação com operadores morfológicos.
- Canny: As partículas e a atmosfera estão causando buracos, mas eu preciso de um contorno completo do objeto. Ainda com fechamento, dilatação de operadores morfológicos, não é suficiente. Canny ainda tem os melhores resultados de todos os métodos que estudei por causa da histerese.
- Contornos ativos: Eles também trabalham em arestas / gradientes, agem completamente malucos após a inicialização dentro do objeto, o que talvez seja causado pelo mapa de arestas resultante do objeto 'aberto'. Até onde eu sei, o contorno precisa ser fechado. Tentei com diferentes derivados (GVF / VFC / Classic Snake).
- k-Meios: Os resultados incluem a atmosfera do forno, devido ao fundo nebuloso. O mesmo para difusa-c-médias. Eu escolhi dois clusters, por separar o objeto do plano de fundo. Mais clusters levam a resultados mais fracos.
- Histograma / Otsu: Devido às intensidades de cinza muito próximas (imho!), Ele está mesclando o objeto com o plano de fundo. Tentei com métodos locais e globais.
- Filtros: Especialmente GLPF ou outro LPF estão manchando as bordas, o que não é tão bom e nem reduz a atmosfera de neblina.
- Os filtros não lineares estão preservando as bordas. A maioria deles demora muito para calcular as imagens grandes. Tomou um filtro bilateral rápido por enquanto. Resultados veja abaixo.
Portanto, nem um único método é bom o suficiente para as etapas de pós-processamento, porque os resultados obtidos no segmento de objeto são pouco competitivos para um algoritmo existente. Esse algoritmo existente é muito local e, portanto, funciona para esse cenário muito especial.
Por isso, estou lhe perguntando, se perdi algo completamente ... Não tenho mais nenhuma idéia de como processar e como obter bons resultados de contorno, sem falhas ou falhas. É possível sem fazer muitas alterações no CCD e o ambiente físico? Desde já, obrigado!
Última abordagem até agora (após uma longa noite de experimentos com MOs):
- Filtro Bilateral (preservação de bordas, mas suavização de áreas homogêneas)
- Canny (Sigma = 2, Limiar = [0,04 0,08])
- Morfológica Operações (MO):
bwareopen
,closing
,remove
&bridge
bwlabel
para selecionar apenas o perímetro do contorno, o que remove ruídos indesejados. ainda não há capturas de tela atualizadas, mas funciona para a estrela. o vidro possui um contorno interno que é conectado ao contorno externo, que também pode ser visto na captura de tela abaixo.
Por isso, tenho medo de precisar de um algoritmo especial para a travessia do contorno externo. Será uma pesquisa de vizinhança no sentido horário / anti-horário. Essa etapa no sentido horário / anti-horário pode mudar, se houver um ponto de canto. se houver um espaço, aumente o raio e olhe novamente. se houver dois ou mais pontos possíveis, siga aquele que seguiu a mesma direção da anterior. Você acha que esse algoritmo de seguimento de contorno faz sentido?
Respostas:
Você pode tentar o seguinte:
Segmentação eficiente de imagens baseadas em gráficos: http://www.cs.brown.edu/~pff/segment/ (código disponível)
Segmentação baseada em GraphCut: http://www.csd.uwo.ca/~olga/OldCode.html (código disponível)
Denoise a imagem primeiro usando métodos esparsos: http://spams-devel.gforge.inria.fr/ (código disponível)
fonte
Eu acho que você desistiu das técnicas de limiar muito cedo. Dê uma olhada no seu histograma, é claramente tri-modal: (removi as colunas brancas à direita da sua imagem manualmente, presumo que elas não fazem parte da imagem - por favor, tire essa imagem antes de executar meu código)
Veja todos os valores no primeiro grupo:
Para encontrar modos no histograma tri-modal, é possível usar o agrupamento de médias K com
K=3
intensidade. O seguinte código do Matlab encontrath1=67
no seu código. A idéia é assumir que você tem os 3 conjuntos e calcular o centróide ponderado em cada um. Então, cada nível de intensidade é atribuído ao seu próprio cluster. Você para quando os centróides pesados param de se mover. Aqui está o resultado da localização de dois limites na sua imagem, mostrados no histograma.Resolver o problema depois é um pedaço de bolo, basta fazer algumas operações morfológicas simples, como abrir.
fonte
imhist
parahist
Como sugerido acima, o limiar pode ser muito eficaz nessa imagem, que é essencialmente binária, exceto que um limiar constante não funciona devido à iluminação irregular. Você precisa de limiar adaptável.
Meu conselho seria fazer a reconstrução de segundo plano com um modelo simples (possivelmente planar [3 DOF] ou quadrádico [6 DOF]), amostrando um pequeno número de valores nas regiões leves. O melhor é usar pequenos ROIs para calcular a média do ruído. Em seguida, corrija o sombreamento subtraindo (ou dividindo por) os valores de segundo plano.
Se a interação humana não for uma opção, você pode automatizar a pesquisa de áreas de fundo primeiro pelo Otsu direto e considerando ROIs uniformes (baixa variação) bem abaixo do limite. Após uma primeira reconstrução do plano de fundo, você provavelmente poderá melhorar aplicando esse processo à imagem corrigida horizontalmente.
Todo o processo pode ser implementado para executar bem abaixo de um segundo.
fonte
Eu acho que a melhor maneira é usar contornos ativos. Se você não souber quais são os contornos ativos, veja este vídeo no youtube http://www.youtube.com/watch?v=ijNe7f3QVdA
Basicamente, você precisa fornecer uma segmentação de inicialização e isso melhorará a forma. Minha sugestão é para um dos métodos discutidos neste post e usar contornos ativos como uma segunda etapa, ou seja. como uma etapa de melhoria.
Aqui está uma implementação de contornos ativos que você pode usar http://www.mathworks.com/matlabcentral/fileexchange/19567
fonte
Você sabe claramente do que se trata, mas não mencionou o uso do limiar, em particular, tentou aplicar um limiar global usando o Otsu para calcular o nível certo, encontrar contornos e selecionar o maior?
[Editar para esclarecer]
Obviamente, o limite global não funcionará devido ao graident visível na imagem.
Eu brinquei rapidamente com isso e descobri que, se você dividir a imagem em 6 partes (2 linhas de 3 colunas de tamanho igual), executar limiares usando Otsu em cada uma delas e, em seguida, remontá-la, fará um ótimo trabalho de deus na limpeza do imagem.
Ainda existem alguns artefatos menores na parte superior direita da estrela.
Ocorre-me que, como o objeto tem limites de linha reta, convém considerar uma transformação Hough para extrair essas arestas, cruzá-las para localizar vértices e usar o resultado como contorno do objeto.
fonte
Os contornos são sempre linhas retas ou curvas conhecidas?
Nesse caso, em vez de tentar corrigir cada pixel ao longo da borda, eu usaria as transformações de Hough para obter as equações das linhas e, em seguida, recriar os contornos das linhas e das seções
fonte