У меня есть точка облачности, полученная от фотограмметрии от спины человека. Я пытаюсь интерполировать его, чтобы получить регулярную сетку, и для этого я использую scipy.interpolate
с хорошими результатами. Проблема в том, что функция, которую я использую (scipy.interpolate.griddata
), использует выпуклую оболочку точки облачности в плоскости x, y, что дает в результате некоторые значения, которые не существуют на исходной поверхности, которая имеет вогнутый периметр.Получите только «действительные» точки в 2D-интерполяции точки облачности с помощью Scipy/Numpy
На следующем рисунке показана исходная точка облачности слева (то, что отображается в виде горизонтальных линий, на самом деле представляет собой плотное линейное облако точек), результат griddata
дает мне посередине, и результат, который я хотел бы получить справа - вид «тени» точки облачности на плоскости x, y, где несуществующие точки на исходной поверхности будут нулями или Nans.
Я знаю, что я мог бы удалить Z координату на cloudpoint и проверить каждую позицию сетки для близости, но это так перебор, и я считаю, что это должно быть общей проблема на точки облачных приложений , Другой возможностью может быть некоторая операция numpy для выполнения над облаком точек, нахождение маски numpy или логического 2D-массива для «применения» по результату от griddata
, но я не нашел (эти операции немного выше моего Знание Numpy/Scipy).
Любое предложение?
Спасибо за чтение!
Я был занят, но ваш ответ, как я прочитал сейчас (имея уже поцарапал мою голову много) делает много смысла. В конце концов, я использую KDtree для выполнения интерполяции для каждой из точек сетки, делая это: я создаю сетку NaN; Я проверяю каждый узел сетки с помощью kdtree на наличие близости (игнорируя координату z точки облачности); Если есть окрестность, интерполируйте с использованием Rbf (в конце концов, griddata не так хорош для этой проблемы) и присвойте результат соответствующему узлу вывода. – heltonbiker