Rilevazione di aree di diffusione isotropica vs anisotropica in un'operazione di piena (o simile)

7

Salve colleghi programmatori!

Ho un grafico 2D che è meglio descritto come una griglia cartesiana con celle traversibili e non traversibili. Mi piacerebbe essere in grado di rilevare sottoinsiemi di questo grafico dove la diffusione si comporta in modo anisotropico, cioè è limitata da passaggi simili a corridoi.

Inizialmente mi sono rivolto a imaging del tensore di diffusione nelle neuroscienze, ma sto avendo un sacco di problemi di digestione il materiale. Mi chiedo se tutto questo sia già stato distillato in un algoritmo utilizzabile, o se ci siano altri approcci che potrebbero essere fruttuosi.

In particolare, mi piacerebbe essere in grado di determinare quanto segue:

  1. Aree in cui la diffusione è anisotropica : altamente vincolata a due direzioni (pensare all'acqua che scorre attraverso una fetta 2D di una cannuccia).
  2. Aree in cui la diffusione è isotropica : in gran parte non vincolata (cioè, l'acqua si sta diffondendo attraverso uno spazio ampio, benché di forma irregolare

Poiché il grafico contiene solo aree molto strette o aperte, sarebbe sufficiente determinare o anisotropico o diffusione isotropica e dedurre l'altro con un contrasto semplice.

TL; DR : come posso trovare la "media" direzione di una diffusione in un riempimento o un'operazione simile?

EDIT: Ecco un esempio del mio grafico come immagine:

    
posta blz 17.04.2013 - 16:31
fonte

1 risposta

1

Non sono a conoscenza di alcuna soluzione nota, ma all'inizio pensavo che un semplice riempimento di riempimento che si riempisse in base alla connettività potesse funzionare.

Ipotesi:

  • L''apertura' di ogni nodo sarà una funzione della sua connettività ad altri nodi. Cioè, in un grafico bidirezionale che simula una griglia quadrata, un nodo completamente aperto avrà 8 bordi.

Non testato, ma il seguente pseudocodice potrebbe essere in grado di trovare aree aperte.

public class graph
{
    private static List<node> GetArea(node n)
    {
        if (isConnectedEnough(n))
        {
            yield n;
            yield! GetArea(n.neighbours)
        }
    }

    private static bool isConnectedEnough(node n)
    {
        return n.neighbours.Count >= 3;
            /* better: a connectivity threshold function */
    }
}

Ho immaginato di chiamare GetArea in modo sequenziale nell'elenco di tutti i nodi del grafico ordinati per connettività finché non è stata trovata un'area di dimensioni sufficienti. A seconda delle caratteristiche dei tuoi grafici che potrebbero non essere sufficienti, ma stavo partendo dal presupposto che il grafico fosse strutturato in modo tale che vi fossero numerose aree separate da passaggi (ad esempio stanze collegate da corridoi).

La soglia di connettività è la chiave in questa situazione. Alcuni esperimenti sarebbero necessari qui in base alle caratteristiche dei tuoi grafici perché:

  • Se la connettività media dei nodi vicini è uguale alla connettività di n , allora l'area è molto probabilmente consistente in dimensioni (cioè non si avvicina a un punto di strozzatura, anche se non si espande di dimensioni).
  • Se la connettività media dei nodi vicini è maggiore della connettività di n , potremmo espanderci in un'area. A seconda di come tu definisci un'area, potrebbe andare bene (potenzialmente descrive un "pizzico" in un'area). Considerare attentamente questa considerazione perché descrive anche angoli e "corridoi" di larghezza 2 nodi / 1 bordo (soglia minima di 3 consentirebbe angoli nell'area).

Questo è tutto ciò che ho per ora, ma controllerò di nuovo qui. Questo è un problema interessante.

    
risposta data 17.04.2013 - 18:07
fonte

Leggi altre domande sui tag