楕円を2Dデータに合わせる方法


7

次のような連続した、おそらく凹状の形状に対する楕円の「最適な」適合を見つけたいのですが。

ここに画像の説明を入力してください

何を試しましたか?

私は1つがメジャーとマイナーの軸の方向に割り当てることができると思った座標にピクセル値をマッピングすることにより、楕円の、平均減算、およびPCAから最大2個の固有ベクトルを節約します。は方向を見つけるのにかなりうまくいくようです:a,b

ここに画像の説明を入力してください

私の問題は、これら2つのベクトルの長さを決定することです。ここでは、PCAの固有値からを使用しました。これは長さを過小評価しているようです。をどのように判断できますか 、およびまたは、代わりに楕円をこれらの形状に最適化しますか?λ1 λ2|a||b|


私が理解していることから、固有値はその特定の固有ベクトルのスペクトル半径の「パワー」を測定します。あなたが使用している数字はありませんが、とは実際の長さに一致していませんか?λ1λ2
スペイシー、2012年

と固有ベクトル射影の強さの関係についてはあなたは正しいですが、他に何も使用することはできませんでした。とは対照的にを使用するは、ベクトルをチャートから数桁縮小します。私は単にを最初の推測として選択しました。λλλ
フック

2次元のみなので、見つけた固有ベクトルとそれに対応する固有値を投稿してください。また、図面のいずれかの端の最大/最小ポイント。
Spacey

回答:


6

削除した回答のフォローアップ...塗りつぶした楕円を取り、すべてのポイントを軸に投影すると、円形の分布で、より多くのポイントが極値よりも原点の近くに投影されます。ガウス分布ではなく、削除された回答の1次元アナロジーで述べた均一分布でもありません。結果の分布には、実際にはpdfがあり、そこから標準偏差があることを計算できます。xp(x)=(1(xr)2)r2

したがって、半径楕円(軸は軸と軸)の内部にデータが均一に分布している場合、座標の標準偏差はであり、座標の標準偏差です。ある。したがって、使用する必要がある補正係数は単純に2です。a,bxyxa2yb2

以下は、内部からランダムにサンプリングされた点から楕円の中心(変換行列)、回転行列、および半径を回復するPythonで動作する例です。

import numpy

# Generate some points distributed uniformely along an ellipse
x = 2 * (numpy.random.rand(10000, 1) - 0.5)
y = 2 * (numpy.random.rand(10000, 1) - 0.5)
d = (x / 0.5) ** 2 + (y / 0.25) ** 2
inside = numpy.where(d < 1)[0]
x = x[inside]
y = y[inside]
data = numpy.hstack((x, y)).T

# Now rotate by 0.5 rad and translate it to (4, -8)
angle = 0.5
rotation = numpy.array([
    [numpy.cos(0.4), -numpy.sin(0.4)],
    [numpy.sin(0.4), numpy.cos(0.4)]])

data = numpy.dot(rotation, data)
data[0, :] += 4
data[1, :] -= 8

# Step 1: center the data to get the translation vector.
print 'Translation', data.mean(axis=1)
data -= numpy.reshape(data.mean(axis=1), (2, 1))

# Step 2: perform PCA to find rotation matrix.
scatter = numpy.dot(data, data.T)
eigenvalues, transform = numpy.linalg.eig(scatter)
print 'Rotation matrix', transform

# Step 3: Rotate back the data and compute radii.
# You can also get the radii from smaller to bigger
# with 2 / numpy.sqrt(eigenvalues)
rotated = numpy.dot(numpy.linalg.inv(transform), data)
print 'Radii', 2 * rotated.std(axis=1)

1
+1 PDFをどのように正確に導出したかについて詳しく教えていただけませんか?それは問題の核心に行きます。ありがとう。p(x)=1(xr)2
Spacey

2次元分布から1つの軸に沿った1次元周辺分布を導出するための標準的な手順(他の軸に沿って積分します)。その場合、積分は、投影する軸に直交する楕円のセクションの長さになります。
ピシェネット

3

Fitzgibbonらによる楕円の直接最小二乗フィッティングを確認してください。これは単純な固有値問題であり、そのサイズはサンプルのピクセル数に比例しません。スローするピクセル数に依存する唯一のステップは、まだである散布行列の計算です。O(n)


参照@pichenettesをありがとうございますが、その紙は私が解決しようとしているものとは異なります(私が間違っている場合は修正してください)。論文では、楕円の曲線に対する一連の点の最小二乗距離を最小化しようとしています。私の場合、可能な限り最良の方法で楕円で近似したい領域があります。
フック

ああ、わかりました...申し訳ありません
ピケネット2012年

それでも便利なリンクですが、Googleで最適な楕円を検索すると、同様の論文が思い付きました。どうやらその問題は明確に定義されています!
フック

しかし、その領域の輪郭を導き出し、それに@pichenettes紙を適用することはできませんか?
Jean-Yves

輪郭によく一致する楕円が表面によく一致しないコーナーケース(奇形?)があると思います。
ピシェネット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.