如何解决如何在不循环每个像素的情况下,以窗口大小同时裁剪numpy数组的每个元素?
我有一个大小为240 x 320 x 3
的numpy数组,我想使用一个窗口(窗口大小为ws=5
)在每个像素上滑动并裁剪出以该像素为中心的子数组。最终输出尺寸应为240 x 320 x ws x ws x 3
。因此,我用窗口大小填充了原始数组,并使用for loop
进行填充。
height = 240
width = 320
image = np.random.rand((height,width,3))
image = np.pad(image,((ws//2,ws//2),(ws//2,(0,0)),mode='reflect')
patches = np.zeros((height,ws,3))
for i in range(height):
for j in range(width):
patches[i,j] = image[i:i+ws,j:j+ws]
是否有任何方法可以在采样时对每个像素进行裁剪?就像不在每个像素上使用for loop
一样?
解决方法
基本上,您会在图像上滑动窗口。我们可以利用基于np.lib.stride_tricks.as_strided
的scikit-image's view_as_windows
来获取滑动窗口。 More info on use of as_strided
based view_as_windows
。
from skimage.util.shape import view_as_windows
out = view_as_windows(image,(ws,ws,1)).transpose(0,1,4,3,2,5)[:-1,:-1,...,0]
# Alternatively :
out = view_as_windows(image,1))[:-1,0].transpose(0,2)
还请注意,如果您有for i in range(height+1)
和for j in range(width+1)
,则可能会错过最后一个窗口。为了在我们的解决方案中获得相同的结果,最后的索引步骤将修改为[...,0]
代替[:-1,0]
,从而使我们-
out = view_as_windows(image,1))[...,2)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。