6

人の背中からの写真測量から得られた曇点があります。私はそれを補間して通常のグリッドを取得しようとしてscipy.interpolateいます。そのために、これまでのところ良い結果で使用しています。問題は、私が使用している関数 ( scipy.interpolate.griddata) が、平面 x、y の雲点の凸包を使用しているため、結果として、凹面の周囲を持つ元の表面には存在しない値が得られることです。

次の図は、左側に元の雲点 (水平線として表示されているものは、実際には密集した線状の点群です)、griddata中央に私が得た結果、右側に取得したい結果を示しています - - x,y 平面上の曇点の「影」のようなもので、元の表面に存在しない点はゼロまたはナンになります。

ここに画像の説明を入力

クラウドポイントの Z 座標を削除して、各グリッド位置の近接性をチェックできることはわかっていますが、これは力ずくであり、ポイント クラウド アプリケーションでは一般的な問題であると考えています。別の可能性は、点群に対して実行するいくつかのnumpy操作であり、 からの結果に「適用」するnumpyマスクまたはブール2D配列をgriddata見つけますが、何も見つかりませんでした(これらの操作は私のNumpy/を少し超えています) Scipy の知識)。

なにか提案を?

読んでくれてありがとう!

4

1 に答える 1

5

を使用すると、適切なマスクをすばやく作成できます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()
于 2012-05-12T01:10:14.653 に答える