Мне нужно подогнать кривую к контуру большого трехмерного логического массива.
Вот упрощенное двухмерное представление того, что я пытаюсь выполнить. Вообразите массив, подобный тому, что слева, как я могу получить аппроксимируемую кривую справа?
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
или какое-либо другое, аналогичное разрешимое уравнение, которое приблизит эти исходные данные к некоторому уровню.
Я предположил, что это будет решенной проблемой - например, сжатие данныхили упрощение геометрии вокселей, однако я не могу найти никаких исследований, указывающих мне правильное направление.