web-dev-qa-db-ja.com

numpy2D配列を回転させる

2Dnumpy配列としてグレースケール画像のセットがあります。

異なるフロート角度の1点(画像内)を中心に画像を回転させる必要があります。回転を配置する必要はありません。(もちろん、これまでよく説明した場合は)補間を許可します。

結果に対して数値演算を実行する必要があるため、numpyのままにしておきたいのですが、(それが不可能な場合は)ステップイン/ステップアウトも許可できます。たとえば、PIL、つまりImage.rotate(theta)を使用しようとしましたが、それを配列に適用する方法と、配列を元に戻す方法がわかりません。

ご意見ありがとうございます。

15
astabada

2011年11月10日18:34にcgohlkeのコメントを参照してください。

2D numpy配列の補間された平行移動と回転については、 scipy.ndimage.interpolation 。shift()とrotate()を検討してください。

6
Vasco

基本的な操作はウィキペディアで説明されています 変換行列 ページ-ここではascii行列アートを実行しようとはしませんが、出力P '= R * Pここで、P'は出力ポイントです。 Rは回転角の正弦と余弦を含む2x2変換行列であり、Pは入力点です。原点以外の何かを中心に回転する場合は、回転する前に原点をシフトします。P '= T + R *(P-T)ここで、Tは平行移動座標です。基本的な行列演算は補間を行わないため、numpyベースの 画像処理ライブラリ を使用していない場合は、逆変換を実行する必要があります:各(整数値)出力に対して座標を指定し、回転するポイントの(浮動小数点)座標を見つけて、周囲のピクセルからその入力ポイントの値を補間します。

2
Dave

私は上記の助けを借りて、例によってこれを解決したいと思います:

import pandas as pd
import numpy as np
bd = np.matrix([[44., -1., 40., 42., 40., 39., 37., 36., -1.],
                [42., -1., 43., 42., 39., 39., 41., 40., 36.],
                [37., 37., 37., 35., 38., 37., 37., 33., 34.],
                [35., 38., -1., 35., 37., 36., 36., 35., -1.],
                [36., 35., 36., 35., 34., 33., 32., 29., 28.],
                [38., 37., 35., -1., 30., -1., 29., 30., 32.]])
def rotate45(array):
    rot = []
    for i in range(len(array)):
        rot.append([0] * (len(array)+len(array[0])-1))
        for j in range(len(array[i])):
            rot[i][int(i + j)] = array[i][j]
    return rot

df_bd = pd.DataFrame(data=np.matrix(rotate45(bd.transpose().tolist())))
df_bd = df_bd.transpose()
print df_bd

その出力は次のようになります:

44   0   0   0   0   0   0   0   0
42  -1   0   0   0   0   0   0   0
37  -1  40   0   0   0   0   0   0
35  37  43  42   0   0   0   0   0
36  38  37  42  40   0   0   0   0
38  35  -1  35  39  39   0   0   0
0   37  36  35  38  39  37   0   0
0    0  35  35  37  37  41  36   0
0    0   0  -1  34  36  37  40  -1
0    0   0   0  30  33  36  33  36
0    0   0   0   0  -1  32  35  34
0    0   0   0   0   0  29  29  -1
0    0   0   0   0   0   0  30  28
0    0   0   0   0   0   0   0  32
2
Sandeep Sharma