我有一个图像,我想将其平铺成较小的块,以用于一些深度学习目的。我想使用numpy数组来更好地理解使用np。
目前我的图片已加载到numpy数组中,其形状为: (448,528,3)
我想要一个较小的8x8块的列表,我相信表示将是(n,8,8,3)。
目前我采取以下行动:
smaller_image.reshape(3696, 8, 8, 3)
图像变形。
感谢您的时间。
答案 0 :(得分:5)
[更新:生成图块的新功能]
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
)
假设我们a_image
形状为(448, 528, 3)
。获取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();