gpt4 book ai didi

python - 如何在不循环每个像素的情况下同时裁剪具有窗口大小的 numpy 数组的每个元素?

转载 作者:行者123 更新时间:2023-12-04 08:55:08 25 4
gpt4 key购买 nike

我有一个大小为 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, ws//2), (0, 0)), mode='reflect')
patches = np.zeros((height, width, ws, 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,(ws,ws,1))[:-1,:-1,...,0].transpose(0,1,4,3,2)
另请注意,如果您有 for i in range(height+1),您将错过最后一个可能的窗口。和 for j in range(width+1) .为了使用我们的解决方案获得相同的结果,最后一个索引步骤将修改为 [...,0]代替 [:-1,:-1,...,0] ,从而给我们 -
out = view_as_windows(image,(ws,ws,1))[...,0].transpose(0,1,4,3,2)

关于python - 如何在不循环每个像素的情况下同时裁剪具有窗口大小的 numpy 数组的每个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63868895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com