2017-10-10 14 views
2

私は、FITSファイルから読み込んだ画像のために配列がありません。 scipy.ndimage.interpolation.rotateを使ってN度回転させた。次に、回転していない元のフレームのいくつかの点(x、y)が、回転した画像のどこで終わるか、つまり回転したフレームの座標(x '、y')はどこですか?scipy.ndimage.interpolation.rotateの後の回転イメージの座標?

これは非常に単純な回転行列の問題です。通常の数学的またはプログラミングによる回転方程式を実行すると、新しい(x '、y')は元の位置には終わりません。 Scipy回転関数はイメージ配列の実際の中心ではなく、原点(0,0)に基づいているため、これには変換行列が必要であることが関係していると思われます。

回転したフレーム(x '、y')を取得する方法を教えてもらえますか?一例として、

from scipy import misc 
from scipy.ndimage import rotate 
data_orig = misc.face() 
data_rot = rotate(data_orig,66) # data array 
x0,y0 = 580,300 # left eye; (xrot,yrot) should point there 

P.S.を使用できます。以下の二つの関連の質問の回答は、私を助けていない。いつものように

+0

あなたは我々のソリューションの正しさをテストすることが可能な例(または例)を提供することはできますか? – unutbu

+0

私はscipy自身のその他のracoonの顔とオリジナルの(x、y)点を左目に使って例を追加しました。回転したフレームの新しい(xrot、yrot)が66度左の目を指すはずです。 – quantumflash

答えて

2

を回転して、1は原点に変換する必要があり、その後、その後、回転します翻訳するここでは、イメージの中心を原点とすることができます。

import numpy as np 
import matplotlib.pyplot as plt 
from scipy import misc 
from scipy.ndimage import rotate 

data_orig = misc.face() 
x0,y0 = 580,300 # left eye; (xrot,yrot) should point there 

def rot(image, xy, angle): 
    im_rot = rotate(image,angle) 
    org_center = (np.array(image.shape[:2][::-1])-1)/2. 
    rot_center = (np.array(im_rot.shape[:2][::-1])-1)/2. 
    org = xy-org_center 
    a = np.deg2rad(angle) 
    new = np.array([org[0]*np.cos(a) + org[1]*np.sin(a), 
      -org[0]*np.sin(a) + org[1]*np.cos(a) ]) 
    return im_rot, new+rot_center 


fig,axes = plt.subplots(2,2) 

axes[0,0].imshow(data_orig) 
axes[0,0].scatter(x0,y0,c="r") 
axes[0,0].set_title("original") 

for i, angle in enumerate([66,-32,90]): 
    data_rot, (x1,y1) = rot(data_orig, np.array([x0,y0]), angle) 
    axes.flatten()[i+1].imshow(data_rot) 
    axes.flatten()[i+1].scatter(x1,y1,c="r") 
    axes.flatten()[i+1].set_title("Rotation: {}deg".format(angle)) 

plt.show() 

enter image description here

+1

すてきな解決策!ちょうどあなたが知りたいと思っていた、[ndimage.rotateのソースコード](https://github.com/scipy/scipy/blob/master/scipy/ndimage/interpolation.py#L728)は、 0.5デクリメントの画像。 – unutbu

+1

@unutbu私は微視的だとは思わなかったが、もちろん正しい。 [重要な]画像(https://i.stack.imgur.com/5bbKL.png)は、とにかく回転するのに適していませんし、新しいmatplotlibバージョンのスキャッタグリフは何とかしていますピクセルのいずれにせよ、私はソリューションを更新しました。 – ImportanceOfBeingErnest

+0

美しい感謝! – quantumflash

関連する問題