Устранение шумов в сечениях поверхности
лучше уж приблизить поверхность и уже её шевелить в R^3
Это без шансов, никакой поверхности во входных данных нет (даже ее триангуляции).
хотя вероятно я не представляю масштаба задачи или каких-то тонкостей
а то ведь ты вот так регуляризуешь каждый срез, а на стыках вдоль оси z у тебя будут сильные скачки
2. Найти минимум функции N переменных
3. ?
4. PROFIT
2. Это будет вечность считаться.
2. здесь используется какой-то неизвестный мне постулат тормознутости всех методов многомерной оптимизации?
если нет поверхности, то как ты определяешь, внутри поверхности ломаная или снаружи (п. 1. из примеров нерегулярности)?
а то ведь ты вот так регуляризуешь каждый срез, а на стыках вдоль оси z у тебя будут сильные скачкиЯ этого не понял.
Конечно, улучшать срезы по отдельности нельзя. Самый простой пример - поверхность=плоскость. Тогда идеальные сечения это параллельные прямые с одинаковым расстоянием между соседними, например 1. Приблизительные сечения это ломаные, которые не отклоняются от соответствующих прямых более чем на delta.
Допустим мы улучшим каждую ломаную отдельно, получим в идеале опять набор параллельных прямых, но расстояния между ними уже будут колебаться на +-2*delta. Т.е. может оказаться несколько подряд идущих прямых с расстоянием 1-2*delta, а следующая будет на расстоянии 1+2*delta, а потом опять 1-2*delta и т.д. Это плохо (1-й пример нерегулярности в первом посте).
Нет, это следует из предположения, что пункт 1 будет считаться небыстро.
п.2 примеров нерегулярности можно убрать, введя целевую функцию "максимальный из углов между соседним звеньями". Или "сумма квадратов углов между соседними звеньями". И делать многомерную оптимизацию с ограничениями, что передвигать их начальных точек можно не более чем на дельта
Да, это неплохой способ сделать каждую отдельную ломаную гладкой, но никак не решает проблемы с расстояниями между ломаными.
Как-то стрёмно в целом.
0) подразбиение участков ломаных на куски размером с delta
1) стыки ломаных => множество точек в пространстве.
2) Сглаживание этого множества точек. Алгоритмов тонны, выбирай любой. Под твои требования, скорее всего, подойдёт тупое локальное усреднение координат. Веса координат соседних точек взять из ядра Гаусса, дисперсия порядка шага между плоскостями по оси Z и порядка delta по остальным осям.
3) пододвинуть узлы исходных ломаных поближе к сглаженному множеству точек.
Идеи черпать можно из алгоритмов шумоподавления изображений/видео/результатов лазерного сканирования, тема мусолится десятилетиями и понапридумано всего много.
Под твои требования, скорее всего, подойдёт тупое локальное усреднение координат. Веса координат соседних точек взять из ядра Гаусса, дисперсия порядка шага между плоскостями по оси Z и порядка delta по остальным осям.Не подойдет.
Например поверхность=сфера. Пусть все сечения получились хорошими (вершины ломаных лежат на сфере а одно (например по 45-й параллели) плохим (все вершины этой ломаной лежат на delta внутри сферы).
Предложенное тобой усреднение не исправит плохое сечение, оно будет по-прежнему выбиваться из общей кучи. Менее важно, но тоже неприятно, что оно ухудшит хорошие сечения: они были идеальными и изменились.
Забыл раньше написать, расстояние между соседними сечениями по Z сильно больше delta и просто больше длины звеньев ломаных.
Пусть все сечения получились хорошими (вершины ломаных лежат на сфере а одно (например по 45-й параллели) плохим (все вершины этой ломаной лежат на delta внутри сферы)Ну так давай определимся, с какими искажениями боремся.
Усреднение отлично сработает для белого шума.
Для описанных тобой единичных провалов подойдёт медианная фильтрация.
Предложенное тобой усреднение не исправит плохое сечение, оно будет по-прежнему выбиваться из общей кучивыбиваться оно будет существенно меньше. И тем меньше, чем больше радиус усреднения.
Кроме того, алгоритму вполне естественно предположить наличие на сфере канавки вдоль 45й параллели.
Либо же есть ряд априорных предположений о возможной структуре объекта, которые ты не назвал, но неявно преполагаешь.
Короче, можешь привести картинки-примеры реальных данных? Иначе получается отстрел лошадей в вакууме
Попробуй заюзать базу алгоритмов 3d-редактора блендера. Он скриптуется на питоне и его можно стартовать в headless режиме для исполнения пакетных заданий. Можно и 3d модель построить и операции над ней проводить.
выбиваться оно будет существенно меньше. И тем меньше, чем больше радиус усреднения.Думаю нет. Совсем простой пример. Возьмем правильный 100-угольник в плоскости. Пусть расстояние от каждой точки до центра масс точек в ее окрестности D. Сдвинем одну точку на delta=D*0.01 в сторону центра 100-угольника. Сделаем усреднение. Все вершины сдвинуться на delta в сторону центра, кроме одной, которая сдвинется на 0.99*delta или же на delta (в зависимости от того, будем ли мы нормировать величину сдвига на расстояние до центра масс). В итоге выбивающаяся точка продолжит выбиваться на ту же delta.
Либо же есть ряд априорных предположений о возможной структуре объекта, которые ты не назвал, но неявно преполагаешь.
Есть. Известно, что исходная поверхность была небольшой степени и не имела никаких особенностей размера порядка delta.
Нагуглилось несколько алгоритмов, которые пытаются сделать облако точек локально плоским. Вполне возможно, что это то, что надо.
Думаю нет. Совсем простой пример. Возьмем правильный 100-угольник в плоскости. Пусть расстояние от каждой точки до центра масс точек в ее окрестности D. Сдвинем одну точку на delta=D*0.01 в сторону центра 100-угольника. Сделаем усреднение. Все вершины сдвинуться на delta в сторону центра, кроме одной, которая сдвинется на 0.99*delta или же на delta (в зависимости от того, будем ли мы нормировать величину сдвига на расстояние до центра масс). В итоге выбивающаяся точка продолжит выбиваться на ту же delta.Мы точно про локальное усреднение координат соседних точек говорим?
Точки сдвинутся на:
D для вершин вне окрестности испорченной точки
D+delta/n, для окрестности испорченной точки, где n-число точек в окрестности.
(Это для случая одинаковых весов точек в окрестности. Ядро Гаусса даст более мягкую картину сдвига, ступенька delta/n размажется по соседним пикселям и станет ещё менее заметна)
Точки сдвинутся на:D для вершин вне окрестности испорченной точкиНа D они сдвинуться не смогут, т.к. двигать точки больше, чем на delta, нельзя.
ещё раз: мы выбираем радиус усреднения по заданной delta. А не ищем delta, при которой усреднение с заданным радиусом налажает
Теперь разобьем стороны 100-угольника на куски по delta. Новые вершины, близкие к плохой, тоже будут подвинуты к центру на почти delta, поэтому их центр масс тоже будет подвинут на delta. В итоге как плохая так и хорошие вершины сместятся к центру на одинаковый D и плохая вершина останется на delta ближе к центру.
Можно попробовать каждое сечение аппроксимировать b-сплайном.
Я уже говорил, обрабатывать каждое сечение отдельно бесполезно.
Вторым этапом сделай "вертикальные" сечения (тут все зависит от геометрии - можно параллельно какой-нибудь плоскости, можно с поворотом относительно какой-либо оси/прямой). И в этих сечениях также построй b-сплайны. Мм?
Если твоя поверхность представляет собой график функции, т.е. каждой точке (x,y) соответствует единственное z, то можно все твои точки нанести на одну плоскость и поставить им координаты z (получить плоский график этой функции в вид изолиний). Затем можно построить глобальную поверхность методом, который как-то фильтрует шумы в данных. Например, Surfer умеет строить поверхности методом минимальной кривизны - мб ты что-то похожее ищешь.
Оставить комментарий
Devid
Задача сложная, так что максимум я надеюсь на удачную идею.Есть некоторая гладкая поверхность в R^3. Строятся ее сечения плоскостями, параллельными XY, расстояние между соседними плоскостями одинаковое. Каждое сечение аппроксимируется ломаной так, что каждая вершина каждой ломаной отстоит от поверхности не более, чем на delta.
Сама задача:
Есть набор этих ломаных. Нужно его пошевелить (т.е. подвинуть вершины не более чем на delta не меняя Z координаты) так, чтобы он стал как можно более "регулярным". Про исходную поверхность ничего не известно.
Примеры "нерегулярности":
1) может оказаться, что несколько подряд идущих (т.е. соседних по Z) ломаных на каком-то участке оказываются
на delta внутри поверхности, а следующая ломаная на этом участке наоборот на delta снаружи поверхности.
2) соседние точки одной ломаной могут оказаться на сильно разном расстоянии от поверхности.
На ум приходит разложение Фурье и выкидывание высоких частот, но не понятно, как его тут использовать.