繁体   English   中英

如何重塑3D numpy数组?

[英]How to reshape a 3D numpy array?

我有一个numpy数组的列表,这些数组实际上是我的CNN的输入图像。 但是,我的每个图像的大小都不一致,并且我的CNN仅拍摄尺寸为224X224的图像。 如何将每个图像重塑为给定尺寸? print(train_images[key].reshape(224, 224,3))

给我一个输出

ValueError: total size of new array must be unchanged如果有人可以帮助我,我将非常感激。

我知道几种实现此目的的方法:

  1. 由于您使用的是python,因此可以使用cv2.resize()将图像调整为224x224。 这里的问题将是失真。
  2. 缩放图像以调整为所需大小之一(W = 224或H = 224),并修剪掉多余的部分。 这里缺少信息。
  3. 如果您有较大的图像和一个边框,请使用一定数量的边框来保持纵横比,然后将其调整为所需的尺寸。

重塑numpy数组时,尺寸的产生必须匹配。 如果没有,它将抛出ValueError 没有使用reshape来解决您的问题的解决方案AFAIK。

重塑时,新数组应具有相同数量的值。 您需要的是裁剪图片(如果大于224x224)和填充(如果小于224x224)或两种情况都需要调整大小。

裁剪只是对具有正确索引的切片:

def crop(np_img, size):
    v_start = round((np_img.shape[0] - size[0]) / 2)
    h_start = round((np_img.shape[1] - size[1]) / 2)
    return np_img[v_start:v_start+size[1], h_start:h_start+size[0],:]

填充稍微复杂一点,这将创建所需形状的零点数组,并插入其中的image值:

def pad_image(np_img, size):
    v_start = round((size[0] - np_img.shape[0]) / 2)
    h_start = round((size[1] - np_img.shape[1]) / 2)

    result = np.zeros(size)
    result[v_start:v_start+np_img.shape[1], h_start:h_start+np_img.shape[0], :] = np_img

    return result

您也可以使用np.pad函数:

def pad_image(np_img, size):
    v_dif = size[0] - np_img.shape[0]
    h_dif = size[1] - np_img.shape[1]
    return np.lib.pad(np_img, ((v_dif, 0), (h_dif, 0), (0, 0)), 'constant', constant_values=(0))

您可能意识到填充在两个函数中有些不同,我不想让问题变得复杂,只需在第二个函数的顶部和左侧填充。 双方都在第一个中进行,因为它更容易计算。

最后,为了调整大小,最好使用另一个库。 您可以使用scipy.misc.imresize ,它非常简单。 应该这样做:

imresize(np_img, size)

标准方法是调整图像大小,使较小的一面等于224,然后将图像裁剪为224x224。 将图像调整为224x224的尺寸可能会使图像失真,并可能导致错误的训练。 例如,如果图像不是正方形,则圆形可能会变成椭圆形。 保持原始宽高比很重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM