Обнаружение областей изотропной и анизотропной диффузии при наводнении (или аналогичной) операции

Привет, коллеги-программисты!

У меня есть 2D-граф, который лучше всего описывается как декартово сетка с пересекающимися и непересекающимися ячейками. Я хотел бы иметь возможность обнаруживать подмножества этого графика, где диффузия ведет себя анизотропно, т. Е. Она ограничена коридороподобными проходами.

Вначале я превратился в изображение тензора диффузии в области нейронауки, но у меня есть большая проблема переваривания материала. Мне интересно, если какой-либо из них уже перегоняется в пригодный для использования алгоритм, или если есть другие подходы, которые могут быть плодотворными.

В частности, я хотел бы иметь возможность определить следующее:

  1. Области, в которых диффузия анизотропна : сильно ограничена двумя направлениями (думайте о воде, текущей через двумерный срез соломы).
  2. Области, в которых диффузия изотропна : в значительной степени без ограничений (т. е. вода диффундирует через большое, хотя и неправильной формы пространство.

Поскольку граф содержит только узкие или открытые области, достаточно будет определить либо анизотропную анизотропную , либо изотропную диффузию, а другую - с простым контрастом.

TL; DR : как я могу найти «среднее» направление диффузии при заполнении флуда или аналогичной операции?

EDIT: Вот пример моего графика как изображения:

введите описание изображения здесь>> </p></body></html>

7 голосов | спросил blz 17 PMpWed, 17 Apr 2013 18:31:25 +040031Wednesday 2013, 18:31:25

1 ответ


1

Я не знаю никаких известных решений, но сначала подумал, что простая заливка заливки, заполняемая на основе подключения, может работать.

Предположения:

  • «открытость» каждого узла будет функцией его подключения к другим узлам. То есть, в двунаправленном графике, который имитирует квадратную сетку, полностью открытый узел будет иметь 8 ребер.

Неподтвержденный, но следующий псевдокод может найти открытые области.

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 */
    }
}

Я предусмотрел последовательный вызов GetArea последовательно в списке всех узлов в графе, отсортированных по подключению, до тех пор, пока не будет найдена область с достаточным размером. В зависимости от характеристик вашего графика (ов), которые могут быть недостаточными, но я исходил из предположения, что график был структурирован таким образом, что были многочисленные участки, разделенные проходами (т. Е. Номера, соединенные коридорами).

Порог подключения является ключевым в этой ситуации. Некоторые эксперименты потребуются здесь, основываясь на характеристиках вашего графика (ов), потому что:

  • Если средняя связность соседних узлов равна связности n, то область очень возможно согласована по размеру (т. е. не приближаясь к точке затвора, также не расширяясь по размеру).
  • Если средняя связность соседних узлов больше, чем связь n, тогда мы можем разворачиваться в область. В зависимости от того, как вы определите область, это может быть хорошо (потенциально описывает «щепотку» в области). Здесь следует учитывать тщательное рассмотрение, поскольку это также описывает углы и «коридоры» ширины 2 узла /1 край (минимальный порог 3 разрешает углы в области).

Вот и все, что у меня есть, но я вернусь сюда. Это интересная проблема.

ответил Steven Evers 17 PMpWed, 17 Apr 2013 20:07:31 +040007Wednesday 2013, 20:07:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132