从(图像)数组中提取多个窗口/补丁,如另一个数组中所定义

J. *_*Doe 5 python numpy

我有一个图像im,这是一个数组给出imread.比如说

im = np.array([[1,2,3,4],
               [2,3,4,5],
               [3,4,5,6],
               [4,5,6,7]]
Run Code Online (Sandbox Code Playgroud)

我有另一个(n,4)数组,windows其中每行定义一个图像的补丁(x, y, w, h).例如

windows = np.array([[0,0,2,2],
                    [1,1,2,2]]
Run Code Online (Sandbox Code Playgroud)

我想从im子数组中提取所有这些补丁而不进行循环.我目前的循环解决方案是这样的:

for x, y, w, h in windows:
    patch = im[y:(y+h),x:(x+w)]
Run Code Online (Sandbox Code Playgroud)

但是如果可能的话,我想要一个很好的基于数组的操作来获取所有这些操作.

谢谢.

Div*_*kar 1

对于相同的窗口大小,我们可以在scikit-image 的view_as_windows帮助下获取视图,如下所示 -

from skimage.util.shape import view_as_windows

im4D = view_as_windows(im, (windows[0,2],windows[0,3]))
out = im4D[windows[:,0], windows[:,1]]
Run Code Online (Sandbox Code Playgroud)

样本运行 -

In [191]: im4D = view_as_windows(im, (windows[0,2],windows[0,3]))

In [192]: im4D[windows[:,0], windows[:,1]]
Out[192]: 
array([[[1, 2],
        [2, 3]],

       [[3, 4],
        [4, 5]]])
Run Code Online (Sandbox Code Playgroud)