我有一个图像im
,它是imread
给出的数组。比如说。
im = np.array([[1,2,3,4],
[2,3,4,5],
[3,4,5,6],
[4,5,6,7]]
我有另一个(n,4)
windows
数组,其中每行定义图像的补丁为(x, y, w, h)
。 E.g。
windows = np.array([[0,0,2,2],
[1,1,2,2]]
我希望从im
中提取所有这些补丁作为子数组而不进行循环。我目前的循环解决方案是:
for x, y, w, h in windows:
patch = im[y:(y+h),x:(x+w)]
但是如果可能的话,我想要一个很好的基于数组的操作来获取所有这些操作。
感谢。
答案 0 :(得分:1)
对于相同的窗口大小,我们可以在scikit-image's 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]]
示例运行 -
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]]])
答案 1 :(得分:0)
如果scikit
不可用,我们可以使用numpy.lib.stride_tricks
自制@Divakar的解决方案。适用相同的约束(所有窗口必须具有相同的形状):
import numpy as np
from numpy.lib.stride_tricks import as_strided
im = np.array([[1,2,3,4],
[2,3,4,5],
[3,4,5,6],
[4,5,6,7]])
windows = np.array([[0,0,2,2],
[1,1,2,2]])
Y, X = im.shape
y, x = windows[0, 2:]
cutmeup = as_strided(im, shape=(Y-y+1, X-x+1, y, x), strides=2*im.strides)
print(cutmeup[windows[:, 0], windows[:, 1]])
输出:
[[[1 2]
[2 3]]
[[3 4]
[4 5]]]