2013-07-19 60 views
2

我有一個函數,它接收一個圖像和一個切片對象,指定該圖像的子區域進行操作。爲了進行調試,我想在指定區域周圍繪製一個框。繪製一個盒子最簡單的方法是獲取兩個角的座標。然而,我找不到將這些座標從切片對象中取出的好方法。如何從numpy切片對象獲取座標

當然有這樣做的一個非常低效的方式,我定義了一個大型矩陣,並使用我的片上找出哪些元素受到影響

#given some slice like this 
my_slice = np.s_[ymin:ymax+1, xmin:xmax+1] 

#recover its dimensions 
large_matrix = np.ones((max_height, max_width)) 
large_matrix[my_slice] = 1 
minx = np.min(np.where(large_matrix == 1)[0]) 
maxx = np.max(np.where(large_matrix == 1)[0]) 
... 

如果這是最好的方法,我可能會必須從傳遞切片對象切換到某種矩形對象。

回答

7

我經常使用dir來查看對象內部。你的情況:

>>> xmin,xmax = 3,5 
>>> ymin,ymax = 2, 6 
>>> my_slice = np.s_[ymin:ymax+1, xmin:xmax+1] 
>>> my_slice 
(slice(2, 7, None), slice(3, 6, None)) 
>>> my_slice[0] 
slice(2, 7, None) 
>>> dir(my_slice[0]) 
['__class__', '__cmp__', '__delattr__', '__doc__', '__format__', 
'__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', 
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', 
'__subclasshook__', 'indices', 'start', 'step', 'stop'] 

而那些startstepstop屬性看起來有用:

>>> my_slice[0].start 
2 
>>> my_slice[0].stop 
7 

(老實說,我用IPython中,等等,而不是使用dir我通常只是製作一個物體,然後按TAB查看裏面。)

所以把你的my_slice物體變成角落,它只是:

>>> [(sl.start, sl.stop) for sl in my_slice] 
[(2, 7), (3, 6)] 
+0

謝謝!這正是我所期待的 – Hammer