WedX - журнал о программировании и компьютерных науках

Получите только действительные точки в 2D-интерполяции точки облака, используя Scipy/Numpy

У меня есть точка помутнения, полученная с помощью фотограмметрии со спины человека. Я пытаюсь интерполировать его, чтобы получить обычную сетку, и для этого я использую scipy.interpolate с хорошими результатами. Проблема в том, что функция, которую я использую (scipy.interpolate.griddata), использует выпуклую оболочку точки облака в плоскости x,y, что дает в результате некоторые значения, которых нет на исходной поверхности, имеющей вогнутый периметр.

На следующем рисунке показана исходная точка облака слева (то, что отображается в виде горизонтальных линий, на самом деле представляет собой плотное облако точек в форме линии), результат, который griddata дает мне в середине, и результат, который я хотел бы получить справа. -- своего рода "тень" точки облака на плоскости x,y, где несуществующие точки на исходной поверхности были бы нулями или Nans.

введите здесь описание изображения

Я знаю, что могу удалить координату Z точки облака и проверить каждую позицию сетки на близость, но это слишком грубая сила, и я считаю, что это должно быть распространенной проблемой в приложениях облака точек. Другой возможностью может быть некоторая операция numpy для выполнения над облаком точек, поиск маски numpy или логического 2D-массива для «применения» к результату из griddata, но я не нашел ни одной (эти операции немного выходят за рамки моего Numpy /Scipy знания).

Любое предложение?

Спасибо за чтение!

04.05.2012

Ответы:


1

Подходящие маски можно быстро построить с помощью KDTree. Алгоритм интерполяции, используемый griddata, не имеет понятия «действительных» точек, поэтому вам необходимо настроить свои данные до или после интерполяции.

До:

import numpy as np
from scipy.spatial import cKDTree as KDTree
from scipy.interpolate import griddata
import matplotlib.pyplot as plt

# Some input data
t = 1.2*np.pi*np.random.rand(3000)
r = 1 + np.random.rand(t.size)
x = r*np.cos(t)
y = r*np.sin(t)
z = x**2 - y**2

# -- Way 1: seed input with nan

def excluding_mesh(x, y, nx=30, ny=30):
    """
    Construct a grid of points, that are some distance away from points (x, 
    """

    dx = x.ptp() / nx
    dy = y.ptp() / ny

    xp, yp = np.mgrid[x.min()-2*dx:x.max()+2*dx:(nx+2)*1j,
                      y.min()-2*dy:y.max()+2*dy:(ny+2)*1j]
    xp = xp.ravel()
    yp = yp.ravel()

    # Use KDTree to answer the question: "which point of set (x,y) is the
    # nearest neighbors of those in (xp, yp)"
    tree = KDTree(np.c_[x, y])
    dist, j = tree.query(np.c_[xp, yp], k=1)

    # Select points sufficiently far away
    m = (dist > np.hypot(dx, dy))
    return xp[m], yp[m]

# Prepare fake data points
xp, yp = excluding_mesh(x, y, nx=35, ny=35)
zp = np.nan + np.zeros_like(xp)

# Grid the data plus fake data points
xi, yi = np.ogrid[-3:3:350j, -3:3:350j]
zi = griddata((np.r_[x,xp], np.r_[y,yp]), np.r_[z, zp], (xi, yi),
              method='linear')
plt.imshow(zi)
plt.show()

Идея состоит в том, чтобы «засеять» входные данные фальшивыми точками данных, содержащими nan значений. При использовании линейной интерполяции они стирают области изображения, рядом с которыми нет фактических точек данных.

Вы также можете стереть неверные данные после интерполяции:

# -- Way 2: blot out afterward

xi, yi = np.mgrid[-3:3:350j, -3:3:350j]
zi = griddata((x, y), z, (xi, yi))

tree = KDTree(np.c_[x, y])
dist, _ = tree.query(np.c_[xi.ravel(), yi.ravel()], k=1)
dist = dist.reshape(xi.shape)
zi[dist > 0.1] = np.nan

plt.imshow(zi)
plt.show()
12.05.2012
  • Я был занят, но ваш ответ, который я прочитал сейчас (уже сильно почесал голову), имеет большой смысл. В конце концов, я использую KDtree для выполнения интерполяции для каждой точки сетки, делая следующее: я создаю сетку NaN; Я проверяю каждый узел сетки с помощью kdtree на наличие окрестности (игнорируя координату z точки облака); Если есть окрестности, интерполируйте с помощью Rbf (в конце концов, griddata не так хорош для этой задачи) и назначьте результат соответствующему узлу вывода. 30.05.2012
  • Новые материалы

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

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]