![](/img/trans.png)
[英]Faster way to fill 2d numpy array with these noise parameters? Currently looping over each element
[英]How to crop each element of a numpy array with a window size at the same time without looping over each pixel?
我有一個大小為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
來獲得滑動窗口。 有關使用基於view_as_windows
的as_strided
的更多信息。
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.