簡體   English   中英

如何在不循環每個像素的情況下同時裁剪具有窗口大小的 numpy 數組的每個元素?

[英]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_stridedscikit-image's view_as_windows來獲得滑動窗口。 有關使用基於view_as_windowsas_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM