Самым простым решением, скорее всего, будет Scikit-Image view_as_blocks
:
import numpy as np
import skimage.util
img = np.arange(296 * 170).reshape(296, 170)
# Make sure the image dimensions are a multiple of 8
img = img[:, :-2]
img_blocks = skimage.util.view_as_blocks(img, block_shape=(8, 8))
img_blocks.shape
# (37, 21, 8, 8)
Как видите, img
был разрезан на блоки 8x8
, 37 блоков в вертикальном направлении, 21блоки в горизонтальном направлении.
Для примера с игрушкой довольно легко увидеть, что происходит:
import numpy as np
import skimage.util
img = np.arange(4 * 6).reshape(4, 6)
img
# array([[ 0, 1, 2, 3, 4, 5],
# [ 6, 7, 8, 9, 10, 11],
# [12, 13, 14, 15, 16, 17],
# [18, 19, 20, 21, 22, 23]])
img_blocks = skimage.util.view_as_blocks(img, block_shape=(2, 2))
img_blocks
# array([[[[ 0, 1],
# [ 6, 7]],
#
# [[ 2, 3],
# [ 8, 9]],
#
# [[ 4, 5],
# [10, 11]]],
#
#
# [[[12, 13],
# [18, 19]],
#
# [[14, 15],
# [20, 21]],
#
# [[16, 17],
# [22, 23]]]])