Rastrear um isoline de uma função 2D cara


10

Eu tenho um problema semelhante em formulação a este post, com algumas diferenças notáveis:

Quais métodos simples existem para amostrar adaptativamente uma função 2D?

Como nesse post:

  • Eu tenho um e a avaliação dessa função é um pouco cara de calcularf(x,y)

Ao contrário desse post:

  • Não estou interessado no valor da função com precisão em todos os lugares, mas apenas em encontrar um único isocontorno da função.

  • Eu posso fazer afirmações significativas sobre a autocorrelação da função e, conseqüentemente, a escala da suavidade.

Existe uma maneira inteligente de avançar / provar esta função e encontrar esse contorno?

Mais Informações

A função é o cálculo dos Recursos Haralick sobre pixels ao redor do ponto e a classificação suave por algum tipo de classificador / regressor. A saída disso é um número de ponto flutuante que indica a qual textura / material o ponto pertence. A escala desse número pode ser estimada como probabilidades de classe (SoftSVM ou métodos estatísticos, etc.) ou algo realmente simples como a saída de uma regressão linear / logística. A classificação / regressão é precisa e barata em comparação com o tempo necessário para a extração de recursos da imagem.N

As estatísticas em torno de significam que a janela está tipicamente amostrando regiões sobrepostas e, como tal, existe uma correlação significativa entre amostras próximas. (Algo que eu possa abordar numericamente / simbolicamente). Consequentemente, isso pode ser pensado como uma função mais complexa de que maior fornecerá uma estimativa mais relacionada à vizinhança (altamente correlacionada) e uma menor fornecerá uma estimativa mais variável, mas mais local. f ( x , y , N ) N NNf(x,y,N)NN

Coisas que tentei:

  • Computação Bruta - Funciona bem. 95% de segmentação correta com constante . Os resultados parecem fantásticos quando contornados usando qualquer método padrão depois disso. Isso leva uma eternidade . Posso simplificar os recursos calculados por amostra, mas, idealmente, quero evitar isso para manter esse código geral para imagens com texturas cujas diferenças apareçam em diferentes partes do espaço de recursos. N

  • Mudança de posição - Dê um "passo" de pixel único em cada direção e escolha a direção para mover com base na proximidade do valor iso-line. Ainda bem lento e ignorará a bifurcação de uma isolina. Além disso, em áreas com um gradiente plano, ele "vagará" ou voltará a si próprio.

Eu estou pensando que eu quero fazer algo como a subdivisão proposta no primeiro link, mas podada por caixas que vinculam a isolinha de interesse. Sinto que também devo aproveitar , mas não sei como abordar isso. N


Eu tenho exatamente o mesmo problema, exceto que é uma função de probabilidade que eu quero delinear e é cara porque, a cada momento, preciso realizar uma minimização. Você fez algum progresso e / ou pode apontar como acabou por fazer isso?
11385 adavid

Acabei de verificar a solução em que convergi. (veja abaixo)
meawoppl 10/10/12

Respostas:


4

Existe um trabalho em computação gráfica chamado Provably Good Sampling and Meshing of Surface , que conta com o fornecimento de um oráculo que determina todas as interseções de uma isolina com um determinado segmento de linha. Com isso, ele mostra todos os contornos, supondo que você possa fornecer uma escala de recurso local (algo como a curvatura local máxima) e um conjunto inicial de segmentos de linha que cruzam todos os contornos. Não é a coisa mais simples de implementar, pois depende da computação das triangulações de Delaunay, mas é implementada em 3D na CGAL . É substancialmente mais simples em 2D, pois existe um bom software de triangulação como o Triangle . Em certo sentido, isso é bem próximo do melhor que você pode fazer.


Eu realmente gosto dessa formulação, pois também se estende logicamente para o 3D de maneira bastante limpa. Eu tenho que formular isso em Python, para que eu já tenha acesso ao empacotamento de Delauny do qhull, para que não seja um grande problema. Deixe-me ver se eu entendi direito esse resumo: - Faça algumas amostragens para semear. - amostras trianguladas. - Para todas as arestas que abrangem isoline acima de algum comprimento: calcular interseções de isoline com aresta - todas computadas em amostras e repetir a partir da etapa de triangulação?
precisa saber é o seguinte

@meawoppl: Eu não implementei pessoalmente ou usei esse algoritmo (ainda!), mas isso parece certo.
Victor Liu

Vou limpar isso hoje e postar alguns resultados!
8789 Marcel

Desculpe o atraso. Este método funciona muito bem para o meu conjunto de dados. Basicamente, eu proponho uma malha regular para amostrar para começar e, em seguida, triangular, subdividir as bordas que cruzam o iso-contorno, a repetição. É um pouco difícil expressar o requisito de "melhor recurso", e há mérito na amostragem inicial aleatória vs, regular, pois uma isolinha diagonal leva um pouco mais do que aquela que segue os contratos da amostra. Acabei deixando apenas cinco passes, e isso funcionou como um critério de parada realmente simples. Wooo> 1K
meawoppl 10/10

1

Você pode tentar aplicar os principais recursos do método Efficient Global Reliability Analysis (EGRA). Esse método foi derivado para o cálculo eficiente de uma probabilidade de falha, mas sua essência está focada em fazer o que você descreve - criando um modelo que é preciso apenas perto de um contorno específico de interesse.

Esse pode ser um ponto de partida interessante, mas não tenho certeza de que resolverá o seu problema. Depende muito da forma da sua função. Se é algo que pode ser bem aproximado com um modelo de krigagem , deve ter um bom desempenho. Esses modelos são bastante flexíveis, mas geralmente precisam de uma função subjacente suave. Eu tentei aplicar o EGRA a um aplicativo de segmentação de imagens no passado, mas teve pouco sucesso porque simplesmente não faz sentido ajustar um modelo substituto a algo que não é realmente definido por um relacionamento funcional. Ainda assim, eu o mencionei como algo que você pode querer analisar caso seu aplicativo seja diferente do que estou imaginando.

Se ainda não o convenci, você pode ler mais sobre o EGRA aqui (link em PDF) e aqui , e existe uma implementação existente no projeto DAKOTA de Sandia - que eu saiba, a única implementação de código aberto disponível para o EGRA.

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.