Aqui está uma pergunta para especialistas em processamento de imagem.
Estou trabalhando em um problema difícil de visão computacional. A tarefa é contar os estômatos (marcados abaixo) em imagens de microscopia DIC. Essas imagens são resistentes às técnicas mais superficiais de processamento de imagens, como operações morfológicas e detecção de bordas. Também é diferente de outras tarefas de contagem de células.
Estou usando o OpenCV. Meu plano é revisar recursos potencialmente úteis para a discriminação de estômatos.
- Classificadores de textura
- DCT (Transformação discreta de cosseno / análise no domínio da frequência)
- LBP (padrões binários locais)
- HOG (Histograma de gradientes orientados)
- Detectores de recursos robustos (eu sou cético)
- Cantos de Harris
- SIFT, SURF, STAR, etc.
- Classificador em cascata Haar / recursos Viola-Jones
E, possivelmente, crie um novo descritor de recursos. Por enquanto, estou deixando de fora a seleção de um classificador.
O que eu perdi? Como você resolveria isso? Soluções para problemas de detecção de objetos semelhantes seriam muito úteis.
Amostra de imagens aqui .
Após o filtro passa-banda:
A detecção inteligente de arestas não é promissora. Algumas áreas da imagem estão fora de foco:
fonte
Respostas:
Desculpe, eu não conheço o OpenCV, e esta é mais uma etapa de pré-processamento do que uma resposta completa:
Primeiro, você não quer um detector de borda. Um detector de borda converte transições (como esta do escuro para a luz):
em cristas (linhas brilhantes no escuro) assim:
Ele realiza uma diferenciação, em outras palavras.
Mas nas suas imagens, há uma luz brilhando em uma direção, o que nos mostra o relevo da superfície 3D. Percebemos isso como linhas e arestas, porque estamos acostumados a ver coisas em 3D, mas elas não estão realmente, e é por isso que os detectores de bordas não estão funcionando, e a correspondência de modelos não funciona facilmente com imagens rotacionadas (um perfeito a correspondência a 0 graus de rotação cancelaria completamente a 180 graus, porque claro e escuro se alinhavam).
Se a altura de uma dessas linhas confusas se parecer com esta do lado:
então a função de brilho quando iluminada de um lado ficará assim:
É isso que você vê nas suas imagens. A superfície oposta fica mais brilhante e a superfície posterior fica mais escura. Então você não quer se diferenciar. Você precisa integrar a imagem na direção da iluminação, e ela fornecerá o mapa de altura original da superfície (aproximadamente). Então será mais fácil combinar as coisas, seja por meio da transformação de Hough, da correspondência de modelos ou qualquer outra coisa.
Não sei como automatizar a localização da direção da iluminação. Se é o mesmo para todas as suas imagens, ótimo. Caso contrário, você teria que encontrar a maior linha de contraste e assumir que a luz é perpendicular a ela ou algo assim. No meu exemplo, eu girei a imagem manualmente para o que eu achava que era a direção certa, com a luz vindo da esquerda:
Você também precisa remover todas as alterações de baixa frequência na imagem, para destacar apenas os recursos semelhantes a linhas que mudam rapidamente. Para evitar tocar artefatos, usei o desfoque Gaussiano 2D e subtraí o do original:
A integração (soma acumulada) pode sair facilmente, o que produz riscos horizontais. Eu os removi com outro passe alto gaussiano, mas apenas na direção horizontal desta vez:
Agora, os estômatos são elipses brancos a toda a volta, em vez de brancos em alguns lugares e pretos em outros.
Original:
Integrado:
A transformação Hough pode ser usada para detectar elipses de cume como este, feitos de "pixels de borda", embora seja muito caro em computação e memória, e não sejam elipses perfeitas, portanto seria um detector "desleixado". Eu nunca fiz isso, mas existem muitos resultados do Google para " detecção de elipse de hough ". Eu diria que se você detectar uma elipse dentro da outra, dentro de um determinado tamanho de espaço de pesquisa, ela deve ser contada como um estoma.
Veja também:
fonte
A primeira coisa que eu tentaria é a correspondência de modelos, com modelos rotacionados para todos os ângulos com algum passo. Modelo rotativo essencial aqui. Além disso, a escolha do modelo pode não ser trivial - pode haver vários com iluminação diferente e pode ser borrada para permitir diferenças nas formas.
http://en.wikipedia.org/wiki/Template_matching#Template-based_matching_and_convolution
Em seguida - HOG parece promissor aqui. Outra solução poderia ser usar um detector de canto forte como Moravec ou Shi-Tomasi (com supressão não máxima) e procurar grupos de 2 ou 3 cantos na mesma linha dos candidatos. Depois de encontrar candidatos, você pode aplicar o contorno ativo à verificação (não tenho certeza se isso realmente ajudaria, mas é possível)
http://en.wikipedia.org/wiki/Corner_detector
http://en.wikipedia.org/wiki/Active_contour
Ainda outra possibilidade é usar a transformação de Hough para elipses, possivelmente com não 2, mas 3-4 parâmetros livres.
fonte
Resposta parcial. Localizando candidatos com o Mathematica:
fonte
Eu começaria usando um detector de borda sensível (por exemplo, magnitude do gradiente com um limiar baixo) e depois usaria a transformação Hough para tentar encontrar as elipses. Canny ainda pode funcionar também. Tenho certeza de que existem parâmetros que você pode ajustar para torná-lo mais sensível e capturar as bordas desfocadas.
fonte