2011-01-22 18 views
8

現在、私が犬の各足の下の圧力を比較したい場合、私は各つま先の下の圧力を比較するだけです。しかし、私は足全体の圧力を比較しようとしたい。3D配列をどのように回転できますか?

しかし、私はそれらを回転させなければならないので、つま先は(より良い)重なります。たいていの場合、左右の足はわずかに外側に回転しているので、一方を他方の上に単に投影することはできません。したがって、私は足を回転させたいので、それらはすべて同じように整列しています。そして

alt text

現在、私は黄色の線間の角度を計算する2つの中央のつま先とリア1 using the toe detectionをルックアップすることにより、回転角度を算出する(つま先緑色と赤色との間の軸)緑色の線(ニュートラル軸)。

今、私は黄色と緑の線が整列するように、背面のつま先の周りを回転する配列を回転させたいと思います。しかし、私はこれをどのようにして行うのですか?

この画像は2D(各センサーの最大値のみ)ですが、3Dアレイ(平均10x10x50)で計算します。私の角度計算の欠点は、つま先の検出に非常に敏感なことです。誰かがこれを計算するために数学的に正しい提案をしているなら、私はすべて耳にします。

I have seen one study with pressure measurements on humansここでは、ローカル幾何学的慣性軸法を使用しましたが、これは少なくとも非常に信頼性がありました。しかしそれでも配列を回転させる方法を説明するのには役立ちません!

alt text

誰かが実験する必要性を感じている場合は、ここでall the sliced arrays that contain the pressure data of each pawを持つファイルです。明確にする:walk_sliced_dataは、測定値の名前である['ser_3'、 'ser_2'、 'sel_1'、 'sel_2'、 'ser_1'、 'sel_3']を含む辞書です。各測定には、抽出された影響を表す別の辞書[0,1,2,3,4,5,6,7,8,9,10]( 'sel_1'の例)が含まれています。

答えて

2

Python Imaging Libraryを使用して、例えば持つ配列を回転させることができます。あなたがレイヤーとしてあなたの最初の次元を持っている場合は

、そしてarray[<layer>]は、このように、2Dレイヤーを返します:

for x in range(<amount of layers>): 
    layer = <array>[i] 
    <array>[i] = (Image.fromarray(layer).rotate(<angle>, resample=Image.BICUBIC)) 

結果を@IvoFlipseにより、a conversationと示唆:

  • で配列を置きますより暗い背景を改善するためのより大きい配列。
  • リサンプリングを調べて、おそらく配列を最初にスケールします。
  • リアトーを中央に向かって動かすと、代わりにそのトーを回ることができます。
  • 小さい画像は、境界線を見つけて15x15の位置に再度配置することで判断できます。

alt text

alt text

+2

あなたのソリューションはほぼ正しいと思います。後ろのつま先を中央に動かすこと以外に必要なのは、後ろのつま先に基づいて黄色の線(角度)を作ることです。したがって、与えられた例では、画像は左(反時計方向)に回転する必要があります。ワークスペースを大きくして再編成すると、Ivoが望んでいるものが生成されます。これは、理解しているように、足の特徴が南を指しているつま先で機能しています。 – Apalala

3

なぜあなたはそのようにしますか?単に地域全体を統合して比較するのはなぜですか?この場合、力の大きさが得られ、スカラーを比較するだけで簡単に行うことができます。

どういうわけかリージョンを比較する必要がある場合(したがって、それらを整列させる必要がある場合)、機能の抽出と配置を試みることがあります。しかし、圧力マップが似ていないと(これは誰かが一歩足を踏み入れていないと言うと)失敗するようです。

私はあなたが本当に複雑になることができると思うが、単純に力を計算するように聞こえるのはあなたが望むものですか?

ところで、画像が類似している場合、最適な角度と平行移動を見つけるために単純な相関テストを使用することができます。

これを行うには、さまざまな平行移動と回転の2つの異なる画像間の相関を計算するだけです。

array(Image.fromarray(<data>).rotate(<angle>, resample=Image.BICUBIC)) 

はそこから、あなたは自分の3D配列の異なる層の上にforループを作成することができます。

+0

私はそれらすべてが揃っを取得し、画像を相関しようとしているについてのご提案を好むが、それは、私は、画像を回転させることができる方法を私に説明していません。さらに、あなたが[足でのソートに関して私の質問である](http://stackoverflow.com/q/4502656/77595)を見れば、それらを適切に標準化するために足を回転させる必要があることがわかります。現在のところ、人口内の大きな変動は、トレーニングセットの回転とは異なる回転をした足を選別するのを困難にするため、 –

+0

足は「画像」です。他の画像と同様に回転します。あなたの画像がf(x、y)で与えられるならば、回転した画像はf(x * cos(t) - y * sin(t)、y * cos(t)+ x * sin(t))です。この方法の唯一の問題は、エイリアシングのために離散関数でうまく動作しないことです。私はいくつかのコードや画像(2D配列)を回転させるライブラリを見つけることができると確信しています。それはかなり一般的なものです。ある点を中心に回転させたい場合は、まず画像を平行移動し、回転させてから平行移動します。 – AbstractDissonance

+0

3D配列を取得しているとは本当に分かりません。私が見たのは、圧力マップに対応すると思われる密度プロットです。数学的には、2D関数である関数P(x、y)です。実際に3D配列を回転させる必要がある場合は、3つの角度を回転させることができます。本質的に関数P(x、y、z)。任意のゲームプログラミングサイトからマトリックス変換を見つけることができます。この場合、それぞれのポイントを翻訳する必要があります。基本的には、行列の点(x、y、z)は(x '、y'、z ')となり、行列の回転 – AbstractDissonance

関連する問題