Pesquisei bastante e descobri métodos como limiar adaptativo, divisor de águas, etc., que podem ser usados para detectar veias nas folhas. No entanto, o limiar não é bom, pois introduz muito ruído
Todas as minhas imagens são cinzentas, por favor, alguém poderia sugerir quais abordagens adotar, considerando esse problema com necessidade urgente de ajuda
EDIT: Minha imagem original
Após limiar
Conforme sugerido pela resposta, tentei a seguinte detecção de borda
- Canny
Muito barulho e distúrbios indesejados
- Sobel
- Roberts
EDIT: Tentei mais uma operação, recebo o seguinte resultado é melhor do que o que eu tentei com astuto e adaptável O que você sente?
Respostas:
Você não está procurando arestas (= bordas entre áreas estendidas de alto e baixo valor de cinza), está procurando arestas (linhas finas mais escuras ou mais brilhantes que a vizinhança); portanto, os filtros de arestas podem não ser o ideal: um filtro de aresta será dê a você dois flancos (um de cada lado da linha) e uma resposta baixa no meio da linha:
ADICIONAR : Se você foi solicitado a explicar a diferença entre um detector de borda e um detector de cume mais claramente. Peço desculpas antecipadamente se esta resposta estiver ficando muito longa.
Um detector de borda é (geralmente) o primeiro operador derivado: se você imaginar a imagem de entrada como uma paisagem 3D, um detector de borda mede a inclinação da inclinação em cada ponto da paisagem:
Se você deseja detectar a borda de uma região brilhante ou escura estendida, tudo bem. Mas, para as veias da imagem do OP, você fornecerá exatamente o mesmo: os contornos esquerdo e direito de cada veia:
Isso também explica o "padrão de linha dupla" nos resultados do detector de borda Canny:
ou, em forma de matriz:
Que tipo de formas essa aproximação de função pode ter? Na verdade, não tantos:
Para detectar sulcos, queremos encontrar áreas na imagem que se pareçam com a última das plotagens acima, portanto, estamos procurando áreas em que o autovalor principal do Hessian seja grande (comparado ao autovalor menor). A maneira mais simples de detectar isso é apenas calcular o valor próprio principal em cada pixel - e é isso que o filtro de crista abaixo faz.
Um filtro de cume provavelmente dará melhores resultados. Eu tentei o Mathematica embutido
RidgeFilter
(que calcula o principal autovalor da matriz Hessian em cada pixel) na sua imagem:Como você pode ver, há apenas um pico para cada linha fina e escura. Rendimentos de binarização e esqueletização:
Depois de podar o esqueleto e remover pequenos componentes (ruído) da imagem, recebo este esqueleto final:
Código completo do Mathematica:
ADICIONAR, ACRESCENTAR:
Não sou especialista em Matlab, não sei se ele possui um filtro de cume interno, mas posso mostrar como implementá-lo "manualmente" (novamente, usando o Matematica). Como eu disse, o filtro de crista é o principal autovalor da matriz de Hessian. Eu posso calcular esse valor próprio simbolicamente no Mathematica:
fonte
Ao usar a detecção de borda Canny (em Halcon), com alfa sendo 1 e o limite baixo 8 e o limite alto 13 (em uma escala de 1-255), obtenho o seguinte resultado:
Com os ajustes dos parâmetros, o resultado obtido com o Canny pode ser muito mais aprimorado. Usando esta imagem, você pode pular as bordas curtas para remover o ruído e conectar as bordas longas para o resultado final.
Entre: uma cor diferente indica uma borda diferente.
Posso obter um resultado bastante semelhante usando este detector de borda Canny online :
fonte
Seguindo a excelente resposta acima, veja como fazê-lo em python usando as funções do scikit.
fonte
img
deveria ser? Eu tenho umpng
arquivo e ele não funciona.i1
é o maior dos autovalores, portanto, você deve usá-lo.Em vez de limiar, apliquei a detecção de borda simples.
GIMP usado com diferença de Gaussian - Radious Outer: 3.0 e Inner: 1.0.
Aqui está como é.
Você também pode aplicar um filtro mediano ou erosão / dilatação para remover parte do ruído granulado.
Aqui está a página que explica a implementação do gimp.
Você deve consultar técnicas diferentes, como Laplaciano de Gaussiano ou Diferença de Gaussin, etc. Veja o seguinte: http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm#7
E esta resposta Como o Laplacian é usado para a Máscara Unsharp?
fonte
Este tópico sempre atraiu muito interesse e, no entanto, não existe um consenso real sobre o assunto. Por isso, decidi soltar algumas palavras.
Minhas respostas para perguntas semelhantes feitas anteriormente sobre stackexchange ( Q1 e Q2 ) envolveram um algoritmo de extração de estrutura curvilínea subpixel por Steger. Este método teve um desempenho razoavelmente bom em muitos casos e, felizmente, incluindo este. Portanto, eu posto a imagem de saída aqui: e aqui com uma configuração de parâmetro diferente e sem coloração de conexão: Para obter detalhes e referências apropriadas, consulte os posts de troca de pilha a que me referi.
fonte
Como parte do meu último ano de estudos de engenharia, tive que estudar métodos de segmentação de vasos sanguíneos em imagens de fundo ocular. Achei esse método de reconstrução de árvores (de Cohen, Laurent D. e Mille, Julien particularmente interessante de usar junto com os métodos de marcha rápida).
Outros documentos que você pode querer procurar:
Links úteis: - Propagação frontal em 2D e 3D
Espero que isso ajude um pouco, embora não seja exatamente o estado da arte.
fonte