2017-10-10 234 views
2

我有一個numpy數組,用於從FITS文件讀入的圖像。我使用scipy.ndimage.interpolation.rotate將它旋轉了N度。然後我想知道原始非旋轉幀中的某個點(x,y)在旋轉後的圖像中的位置 - 即什麼是旋轉的幀座標(x',y')?scipy.ndimage.interpolation.rotate後旋轉的圖像座標?

這應該是一個非常簡單的旋轉矩陣問題,但是如果我按照通常的基於數學或程序設計的旋轉方程,新的(x',y')不會到達原來的位置。我懷疑這與需要轉換矩陣有關,因爲scipy rotate函數基於原點(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自己的misc浣熊臉和左眼原始(x,y)點的例子。旋轉框架中66度的新(xrot,yrot)應指向左眼。 – quantumflash

回答

2

像往常一樣與旋轉,需要轉換到原點,然後旋轉,接着翻回來。在這裏,我們可以將圖像的中心作爲原點。

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