Problema de segmentação de imagem de diferentes materiais

15

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. Exemplo 1 exemplo2 exemplo3 exemplo4

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. exemplo2

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
  • bwlabelpara 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?

Bordas de vidro Estrela

mchlfchr
fonte
Você já tentou o limiar adaptável? Você não parece mencionar isso. Eu acho que o OTSU deve funcionar de alguma forma após remover o ruído, mas talvez o limiar adaptável seja melhor.
Rui Marques
Oi Rui, eu tentei o limiar adaptável com esta extensão do Matlab: limiar adaptável Aqui estão os resultados para brincar com os parâmetros da janela: 1ª tentativa 2ª tentativa 3ª tentativa Como você pode ver, com o aumento dos parâmetros, a parte do meio passa de branco para preto (o que é bom, imho) mas o resto do fundo também fica preto, o que é ruim.
Mchlfchr 12/10/12
3
Você já tentou algumas técnicas básicas de redução de imagem? Como subtrair uma correção de campo plano para se livrar do escurecimento no canto superior direito ( en.wikipedia.org/wiki/Flat-field_correction ). Além disso, se as partículas forem estáticas, elas serão removidas instantaneamente. Então, você pode usar qualquer método de detecção de borda que você quer ...
PhilMacKay
Olá Phil, no que me diz respeito e ao que sei, há uma série de fotos que são tiradas antes que um objeto entre no forno. O tipo de calibração está, portanto, aqui. Conversarei com o físico responsável pelo CCD e pelo meio ambiente na segunda-feira. Mas obrigado pelo conselho, vou tentar!
Mchlfchr 12/10/12
A segunda imagem que você adicionou parece totalmente diferente. Você pode postar todas as imagens possíveis?
Andrey Rubshtein

Respostas:

2

Você pode tentar o seguinte:

oli
fonte
Oi oli, sobre métodos esparsos: você poderia ser mais específico sobre quais métodos desse código eu deveria usar? Não sou muito aprofundado nessa seção e não encontrei algo útil nos documentos sobre remover ruído ou desfocar ... Agradecemos antecipadamente.
Mchlfchr 12/10/12
1
Você pode encontrar uma versão "mais fácil de usar", lá: lear.inrialpes.fr/people/mairal/denoise_ICCV09.tar.gz
oli
desculpe-me por reclamar outra vez ;-) ... você tem fontes win32 também? obrigado novamente!
Mchlfchr 12/10/12
Estou affraid eu não ...
oli
2

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)

insira a descrição da imagem aqui

Veja todos os valores no primeiro grupo:

insira a descrição da imagem aqui

Para encontrar modos no histograma tri-modal, é possível usar o agrupamento de médias K com K=3intensidade. O seguinte código do Matlab encontra th1=67no 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.

insira a descrição da imagem aqui

function [th1,th2]=SegmentHistTo3()
    im = imread('http://i.stack.imgur.com/U2sc5.png');
    h = imhist(im(:,:,1)); %# Calculate histogram

    th1new = round(256/3); %# Initial thresholds
    th2new = round(256*2/3);
    th1 = 0;
    th2 = 0;

    while (th1~=th1new) || (th2~=th2new) %# While the centroids keep on moving
        th1 = th1new;
        th2 = th2new;

        wa1 = WeightedAverage(h,1,th1);  %# Calculate 3 weighted averages
        wa2 = WeightedAverage(h,th1+1,th2);
        wa3 = WeightedAverage(h,th2,numel(h));

        th1new = round( (wa1+wa2)/2 );  %# The thresholds are middle points between the averages
        th2new = round( (wa2+wa3)/2 );
    end

    figure; hist( double( reshape(im(:,:,1),1,[]) ),256);
    hold on;
    plot( [th1 th1],[0 max(h)],'r','LineWidth',2);
    plot( [th2 th2],[0 max(h)],'r','LineWidth',2);

    figure;imshow( im(:,:,1)<th1);
end

function wa = WeightedAverage(region,th1,th2)    
    regionNonEmpty(th1:th2) = region(th1:th2);
    wa = sum( regionNonEmpty .* (1:numel(regionNonEmpty))) / sum(regionNonEmpty);    
end

Resolver o problema depois é um pedaço de bolo, basta fazer algumas operações morfológicas simples, como abrir.

Andrey Rubshtein
fonte
1
Oi Andrey, mas como devo fazer uma generalização desse limiar que você mencionou? Eu tenho vários casos, não apenas esse, e ainda preciso de automação. E o Otsu Thresholding (função no matlab) não me deu bons resultados. Alguma outra dica? Atenciosamente
mchlfchr
Olá novamente, obrigado até agora, mas o código não funciona. A tela de figura em branco é exibida. Tentei com meus dados originais (bitmaps) e o PNG que você postou acima. Estou depurando, enquanto isso ... #
130012 mchlfchr
@mchlfchr, você tem uma caixa de ferramentas para processamento de imagens? Caso contrário, é possível mudar imhistparahist
Andrey Rubshtein 13/10
@mchlfchr, consulte a versão atualizada
Andrey Rubshtein
Andrey, se eu inserir o arquivo bitmap original, os resultados serão os que mencionei no meu post de origem. Talvez isso esteja acontecendo em relação à resolução? A imagem de origem é 576x768 pixels e escala de cinza (256). Aqui estão os resultados, se eu usar sua função com a minha imagem original: i.imgur.com/UXALJ.png histograma-figura da sua função: i.imgur.com/7RiPP.png Obrigado pela ajuda! relação
mchlfchr
1

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.

Yves Daoust
fonte
Oi Yves, um processamento automatizado é o preferido. O aspecto DOF é interessante, mas não tenho certeza sobre o método Otsu, porque o próprio Otsu não está funcionando bem. Estou entendendo direito que você deseja selecionar áreas aleatórias da imagem e depois limiar após o valor médio sobre todas as áreas selecionadas? Atenciosamente
mchlfchr
1

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

mkuse
fonte
Bem-vindo ao dsp.se :) Obrigado por contribuir, você forneceu uma boa resposta. Se você quiser melhorar ainda mais, acho interessante fornecer respostas para algumas dessas perguntas: Por que você acha que essa é a melhor abordagem (por exemplo, você tem experiência pessoal com a técnica)? Qual das abordagens já sugeridas você acha que funcionaria bem em combinação com a sua sugestão? Ofereça uma breve explicação da técnica ou, se tiver tempo, tente fornecer resultados experimentais usando a técnica nas imagens de exemplo fornecidas. E divirta-se no dsp!
Penelope
@mkuse, como você deve ter lido o post inicial, eu já havia experimentado os contornos ativos, combinados com redução de ruído e mapas de bordas. os resultados foram ruins e tiveram um tempo de execução ruim para imagens grandes.
Mchlfchr 27/10/12
Que tal dar uma olhada nas técnicas de redução de ruído. Você pode encontrar um resumo desses aqui: lnmiitdip.files.wordpress.com/2011/12/…
mkuse
1
@mkuse, eu já mencionei a mecânica que você postou no seu arquivo PPT no meu post inicial. Editei minha postagem inicial, para ficar mais claro, que tipo de filtro eu usei.
Mchlfchr 27/10/12
0

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.

Comunidade
fonte
Oi Dave, eu tentei o Otsu, mas traz o efeito de que o plano de fundo superior direito está se mesclando com o objeto, o que é absolutamente inaceitável.
Mchlfchr 12/10/12
Olá Dave, Hough não é uma opção, por causa dos requisitos de tempo de execução e, tanto quanto eu tenho conhecimento sobre o HT, é muito demorado para imagens grandes.
Mchlfchr 13/10/12
0

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

Martin Beckett
fonte
1
Como já mencionei: preciso de abordagens próximas em tempo real. E até onde eu sei o HT, consome muito tempo. Outro aspecto é que não conheço as curvas e as linhas nem sempre são retas. O contorno depende do material que está no forno (para obter mais informações, consulte meu post de origem).
Mchlfchr 13/10/12
Para linhas retas é muito rápido, e se você sabe mais ou menos onde as linhas são (por exemplo, a partir de um quadro anterior), você pode pesquisar somente esse espaço paramter
Martin Beckett