Encontre os estômatos em uma imagem de microscopia de planta


26

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 .

estômatos

Após o filtro passa-banda: passa banda filtrado

A detecção inteligente de arestas não é promissora. Algumas áreas da imagem estão fora de foco: detecção de borda inteligente


11
Talvez, em vez de tentar encontrar os estômatos, você possa tentar remover as linhas confusas?
endolith

11
Quantas imagens você precisa processar? Quão rápido ele precisa ser? Quão automatizado precisa ser?
Endolith 22/11

11
Não precisa ser muito rápido. Estamos processando na ordem de 1000 imagens. Deve ser automático - despeje imagens em um diretório e pronto.
Matt M.

Respostas:


15

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:

    ____ ∧v ____

É 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:

original, girado

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:

passe alto filtrado

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:

saída

Agora, os estômatos são elipses brancos a toda a volta, em vez de brancos em alguns lugares e pretos em outros.

Original:

insira a descrição da imagem aqui

Integrado:

insira a descrição da imagem aqui

from pylab import *
import Image
from scipy.ndimage import gaussian_filter, gaussian_filter1d

filename = 'rotated_sample.jpg'
I = Image.open(filename).convert('L')
I = asarray(I)

# Remove DC offset
I = I - average(I)

close('all')
figure()
imshow(I)
gray()
show()
title('Original')

# Remove slowly-varying features
sigma_2d = 2
I = I - gaussian_filter(I, sigma_2d)

figure()
imshow(I)
title('2D filtered with %s' % sigma_2d)

# Integrate
summed = cumsum(I, 1)

# Remove slowly-changing streaks in horizontal direction
sigma_1d = 5
output = summed - gaussian_filter1d(summed, sigma_1d, axis=1)

figure()
imshow(output)
title('1D filtered with %s' % sigma_1d)

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:


PS O que eu fiz aqui tem um nome? É um tipo de filtro comum?
Endolith 16/04

11
+1 - Ótima resposta! Sobre a automação do ângulo da fonte de luz - você pode usar o detector de borda que calcula a magnitude e o gradiente e depois calcula a média ponderada (por mag.) Do gradiente. As respostas mais fortes devem estar na direção da iluminação.
55517 Andrey Rubshtein

11

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.


7

Resposta parcial. Localizando candidatos com o Mathematica:

p = ColorConvert[Import@"http://i.stack.imgur.com/38Ysw.jpg", 
    "GrayScale"] // ImageAdjust;
m = DeleteSmallComponents[Erosion[Dilation[DeleteSmallComponents[
      Binarize[EntropyFilter[p, 1] // ImageAdjust, .97], 10], 3], 5], 100];
ImageMultiply[Dilation[m, 3], p]

insira a descrição da imagem aqui


Resultado interessante ... talvez combinam com algum outro esquema ...
Matt M.

@ Mattt Sim, acho que descartamos pelo menos 80% da superfície não direcionada. Após dilatar um pouco a máscara, você deve procurar as elipses. Independentemente do método usado (ainda estou pensando no que poderia fazer), é muito mais fácil agora que você sabe que os animais estão cercados.
Dr. belisarius

1

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.