我有一张图像,出于某些深度学习目的,我想将其平铺成更小的 block 。我想使用 numpy 数组来更好地理解使用 np。
目前我的图像被加载到一个 numpy 数组中,它的形状是: (448, 528, 3)
我想要一个较小的 8x8 block 列表,我相信表示形式是 (n, 8, 8, 3)。
目前当我采取以下行动时:
smaller_image.reshape(3696, 8, 8, 3)
图像变形了。
感谢您的宝贵时间。
请您参考如下方法:
[更新:生成瓦片的新函数]
import numpy as np
def get_tile_images(image, width=8, height=8):
_nrows, _ncols, depth = image.shape
_size = image.size
_strides = image.strides
nrows, _m = divmod(_nrows, height)
ncols, _n = divmod(_ncols, width)
if _m != 0 or _n != 0:
return None
return np.lib.stride_tricks.as_strided(
np.ravel(image),
shape=(nrows, ncols, height, width, depth),
strides=(height * _strides[0], width * _strides[1], *_strides),
writeable=False
)
假设我们有形状为(448, 528, 3)
的a_image
。要获得 28x33
瓦片(每个小图像的尺寸为 16x16
):
import matplotlib.pyplot as plt
image = plt.imread(a_image)
tiles = get_tile_images(image, 16, 16)
_nrows = int(image.shape[0] / 16)
_ncols = int(image.shape[1] / 16)
fig, ax = plt.subplots(nrows=_nrows, ncols=_ncols)
for i in range(_nrows):
for j in range(_ncols):
ax[i, j].imshow(tiles[i, j]); ax[i, j].set_axis_off();