Подогнать кривую к контуру / границе трехмерного логического массива - PullRequest
0 голосов
/ 06 ноября 2019

Мне нужно подогнать кривую к контуру большого трехмерного логического массива.

Вот упрощенное двухмерное представление того, что я пытаюсь выполнить. Вообразите массив, подобный тому, что слева, как я могу получить аппроксимируемую кривую справа?

  000000010000000000000000000000100                                  X
  001100000000000000000010000000111                                 X
  000100000001000001000000000001111                                X
  000000000000000000000000000111111                               X
  000000000000000000000000011111111                              X
  000001100000000000000001111111111                             X
  000000000000010000000111111011111   ->                       X
  010000000000000000000111111111111                          XX
  000000000000000001111111111111111                        XX
  000000000000001110111111111111111                     XXX
  000001010110111111111111111111111                  XXX 
  111111100010111111111111111111111              XXXX
  111111111010111111111111111111111      XXXXXXXX
  100111111110111111111111111111111                0.5X^2 - Y = 0

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

Мой лучший результат до сих пор заключался в записи для каждого куба / вокселя со значением 1 расстояния до ближайшего 0, а для каждого с 0 -(отрицательное) расстояние до ближайшего 1. Это дает мне поле расстояния со знаком. Исходя из исчисления средней школы, вычитание соседних значений дает мой ... 'dx / dy'? d (signDistance) / d (xyz) ?, который выводит меня на правильный путь для уравнения для плоскости (или в данном случае двумерной линии) (и повторение дает мне попытку подобрать некоторую векторную квадратику, которая кажется верным путем).

Если данные идеальны - этот подход может дать мне трехмерную квадратичную кривую для контура.

Однако недостатки данных сильно мешают этому подходу. На отрицательные значения расстояния для нулей влияют паразитные '1 в верхнем левом углу, и подход вычитания терпит неудачу.

Я также попытался записать все граничные края контура и подгонять плоскость кон использует регрессию наименьших квадратов, однако в приведенном выше примере на «фактической» границе имеется 30 ребер и 44 ребра «шума», поэтому плоскость смещена в сторону шума от очень очевидной плоскости. Я также не знаю, как обобщить его в трехмерный многочлен, более сложный, чем плоскость.

Рассматривал дискретное косинусное преобразование / БПФ в 3D, однако сумма десятков косинусов избыточна для уровнямне нужно здесь.

Я ищу способ описать аппроксимацию этой границы как нечто, что можно будет оценить позже. например:

 F(x,y,z) = ...;

 If (F(point) > 0). Voxel == 1
 If (F(point) <= 0). Voxel == 0

или какое-либо другое, аналогичное разрешимое уравнение, которое приблизит эти исходные данные к некоторому уровню.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...