2013-07-19 59 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