Вывод триангуляции Делоне по лидарным данным

Мне нужно сгенерировать сетку 3D-облака точек. Поэтому я использовал функцию delaunay для выполнения триангуляции точек. Данные лидара являются результатом сканирования головы человека.

dt = delaunay(X,Y); 
trisurf(dt,X,Y,Z);

Когда я использовал delaunay с двумя входами, это дает мне результат, но не идеальный. Поэтому я использовал три входа (X,Y,Z)

dt = delaunay(X,Y,Z); 
trisurf(dt,X,Y,Z);

Но теперь результат выходит хуже. Я не знаю, в чем проблема?


Это полный код, который я написал:

load Head_cloud_point.txt; 
data = Head_cloud_point; 

for i = 1 : 3 
    X = data(:, 1); 
end 

for i = 1 : 3 
    Y = data(:, 2); 
end 

for i = 1 : 3 
    Z = data(:, 3); 
end 

[m n] = size(X); 
[o p] = size(Y); 
[r s] = size(Z); 
[XI,YI]= meshgrid(X(m,n),Y(o,p)); 
ZI = interp2(X,Y,Z,XI,YI); 
% dt = delaunay(X,Y); 
% trisurf(dt,X,Y,ZI); 

Head_cloud_point - это файл с координатами X,Y,Z. Я должен создать сетку, используя эти координаты.


person user3745905    schedule 18.06.2014    source источник
comment
Можете ли вы предоставить код? Настройки, которые могут способствовать возникновению проблемы? Деталей здесь, в общем-то, не хватает.   -  person Matthew Bakaitis    schedule 18.06.2014
comment
загрузить Head_cloud_point.txt; данные = Head_cloud_point; для i = 1 : 3 X = данные (:, 1); конец для i = 1 : 3 Y = данные (:, 2); конец для i = 1 : 3 Z = данные (:, 3); конец [m n] = размер (X); [o p]= размер(Y); [rs]= размер(Z); [XI,YI]=сетка(X(m,n),Y(o,p)); ZI = интерп2(X,Y,Z,XI,YI); % dt = Делоне (X, Y); % трисурф(dt,X,Y,ZI); Это код. Head_cloud_point — это файл с координатами X, Y, Z. Я должен создать сетку, используя эти координаты, поэтому я использую метод триангуляции Делоне, чтобы приблизиться к ним.   -  person user3745905    schedule 18.06.2014
comment
возможный дубликат Генерация сетки из точек с координатами x, y и z   -  person Andre Silva    schedule 21.04.2015


Ответы (2)


Что ж, Делоне не собирается здесь заниматься напрямую, ни в 2D, ни в 3D версии. Основная причина заключается в том, как работает Делоне. Вы можете получить некоторые из способов, но результат в целом не будет идеальным.

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

Во-первых, помните, что Делоне собирается триангулировать выпуклую оболочку данных, заполняя любые вогнутости, например. C-образная форма будет иметь внутреннюю часть триангуляции C (заканчивающуюся как зеркальная D-триангуляция).

Предполагая, что облако точек является поверхностью головы.

При использовании 2D Delaunay для всех (X, Y) он не может различать координаты в верхней части головы и в нижней части / шее, поэтому он будет смешивать их при создании триангуляции. По сути, у вас не может быть двух слоев кожи для одной и той же координаты (X, Y).

Один из способов обойти это — разделить данные на верхнюю и нижнюю части, возможно, по высоте кончика носа, триангулировать их по отдельности и объединить результат. Это может дать что-то довольно приятное на вид, хотя есть и другие места, где есть подобные проблемы, например, вокруг губ и ушей. Возможно, вам также придется соединить две триангуляции, что довольно сложно сделать.

Другой альтернативой может быть преобразование (X, Y, Z) в сферические координаты (радиус, тета, гамма) с началом в центре головы, а затем использование 2D Делоне на (тета, гамма). Это может не сработать вокруг уха, где может быть несколько слоев кожи в одном и том же (тета, гамма) направлении, где Делоне снова смешает их. Также в затылке (на разрыве координат) будут отсутствовать некоторые связи. Но в остальной части головы результаты, вероятно, хорошие. Триангуляция Делоне в (тета, гамма) не будет триангуляцией Делоне в (X, Y, Z) (окружность, описанная вокруг каждого треугольника, может содержать другую точку внутри), но для целей визуализации это нормально.

При использовании 3D Delaunay с использованием (X,Y,Z) заполняются все впадины, особенно вокруг кончика носа и глаз. В этом случае вам нужно будет удалить все элементы/строки в матрице триангуляции, которые представляют что-то «вне» головы. Это кажется трудным сделать с имеющимися данными.

Для идеального результата нужен еще один инструмент. Попробуйте поискать что-то вроде:

meshing of surface point cloud
person Jesper Grooss    schedule 18.06.2014
comment
Большое Вам спасибо. Это помогло мне в достижении моей цели. - person user3745905; 22.07.2014

Поскольку у вас есть облако необработанных данных, представляющих трехмерную поверхность, вам необходимо выполнить интерполяцию трехмерной поверхности, чтобы удалить шум. Это определит функцию z=f(x,y), которая лучше всего соответствует вашим данным. Для этого вы можете использовать griddata, triscatteredinterp (устарело) или interp2. Примечание. Из контекста вашего вопроса я предположил, что вы используете MATLAB. [EDIT] Поскольку вы указали, что ваши данные представляют собой голову, поверхность головы, которая является сфероидом, это не функция формы z = f (x, y). См. этот пост о возможных решениях для визуализации сферических поверхностей http://www.mathworks.com/matlabcentral/newsreader/view_thread/2287.

person Tarik    schedule 18.06.2014
comment
загрузить Head_cloud_point.txt; данные = Head_cloud_point; для i = 1 : 3 X = данные (:, 1); конец для i = 1 : 3 Y = данные (:, 2); конец для i = 1 : 3 Z = данные (:, 3); конец [m n] = размер (X); [o p]= размер(Y); [rs]= размер(Z); [XI,YI]=сетка(X(m,n),Y(o,p)); ZI = интерп2(X,Y,Z,XI,YI); % dt = Делоне (X, Y); % трисурф(dt,X,Y,ZI); - person user3745905; 18.06.2014
comment
@user3745905 user3745905 Пожалуйста, отредактируйте свой вопрос и разместите там свой код, чтобы мы могли его правильно визуализировать. Тем не менее, я предположил, что ваши данные представляют собой трехмерную поверхность, которую вы хотите визуализировать. Поскольку необработанные данные обычно зашумлены, их построение в исходном виде, вероятно, приведет к чрезвычайно неровной поверхности. Пожалуйста, внимательно обдумайте мой первоначальный ответ или переформулируйте и уточните свой вопрос, чтобы лучше понять природу ваших данных и то, чего вы пытаетесь достичь. - person Tarik; 18.06.2014
comment
У меня есть облако точек лидара для головы человека, которое содержит координаты X, Y, Z. Я хочу создать сетку этого облака точек, используя метод триангуляции Делоне. но когда я использую эту функцию delaunay(X‹Y,Z), она не показывает мне правильный результат. Мой код clc; очистить все; закрыть все; загрузить Head_cloud_point.txt; данные = Head_cloud_point; для i = 1 : 3 X = данные (:, 1); конец для i = 1 : 3 Y = данные (:, 2); конец для i = 1 : 3 Z = данные (:, 3); конец dt = Делоне (X, Y); трисерфинг(dt,X,Y,ZI); - person user3745905; 18.06.2014
comment
Смотрите обновленный ответ. Пожалуйста, сосредоточьтесь на проблеме, с которой вы столкнулись, с математической, а не с точки зрения программирования. Только с правильной точки зрения вы действительно найдете правильное решение. Опять же, пожалуйста, отредактируйте свой вопрос и разместите там свой код для ясности. - person Tarik; 18.06.2014
comment
Пожалуйста, объедините свой другой вопрос, который вы разместили, с этим и удалите другой, чтобы избежать дублирования усилий и пустой траты энергии. - person Tarik; 18.06.2014
comment
спасибо @Tarik, но когда я использую delaunay (x, y), он генерирует треугольник между координатами X и Y, который дает мне часть вывода, тогда как я пробовал для (x, z), он также дает вывод, кроме точки Y. Поэтому, когда я использую все три (x, y, z). Выход худший. Итак, мой вопрос: если у нас есть точки облака как X, Y, Z, то как я могу создать сетку, используя это? Нужно ли мне использовать какой-либо метод фильтрации? - person user3745905; 18.06.2014
comment
Как я уже говорил вам, у вас потенциально есть две проблемы: шум, который можно решить с помощью интерполяции 3D-поверхности, и тот факт, что сфероидальная поверхность, не являющаяся функцией, не может использоваться в качестве аргумента для Делоне, и я предоставил ссылку на возможные решения. . - person Tarik; 18.06.2014
comment
Вы можете использовать scatter3(X,Y,Z) для построения графика ваших данных, чтобы получить представление о том, как они выглядят, прежде чем пытаться их массировать. - person Tarik; 18.06.2014
comment
Я сделал это, это я вам говорю, когда я использую delaunay (X, Y), он дает что-то вроде вывода scatter3, но когда я использую delaunay (X, Y, Z), он дает мне тетраэдр, который не похож на scatter3. Так в чем может быть проблема по вашему? - person user3745905; 18.06.2014
comment
Судя по выложенному вами коду, я не вижу смысла использовать делоне после интерп2. Просто нарисуйте результат interp2 напрямую или альтернативно dt=delaunay (x,y), за которым следует trisurf (dt,x,y,z) - person Tarik; 18.06.2014
comment
Итог: используйте delaunay для получения данных хорошего качества с небольшим шумом или без него. Используйте interp2 или подобное, а затем trisurf для зашумленных данных. - person Tarik; 18.06.2014