我有一张图像,出于某些深度学习目的,我想将其平铺成更小的 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(); 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!