2

サイズが numpy の配列があり240 x 320 x 3、ウィンドウ (ウィンドウ サイズ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各ピクセルを使用せずに好きですか?

4

1 に答える 1

2

基本的に、画像全体でウィンドウをスライドさせています。np.lib.stride_tricks.as_stridedベースを活用scikit-image's view_as_windowsして、スライディング ウィンドウを取得できます。basedの使用に関する詳細情報as_stridedview_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)
于 2020-09-13T09:05:34.047 に答える