Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何重塑3D numpy阵列?_Python_Numpy_Deep Learning_Conv Neural Network - Fatal编程技术网

Python 如何重塑3D numpy阵列?

Python 如何重塑3D numpy阵列?,python,numpy,deep-learning,conv-neural-network,Python,Numpy,Deep Learning,Conv Neural Network,我有一个numpy阵列的列表,它们实际上是我的CNN的输入图像。然而,我的每幅图像的大小都不是余弦的,我的CNN只拍摄224X224的图像。我如何将我的每一个图像重塑为给定的维度? 打印(序列图像[key]。重塑(224224,224,3)) 给我一个输出 ValueError:新数组的总大小必须保持不变 如果有人能帮助我,我将不胜感激。以下是我知道的实现这一目标的几种方法: 由于您使用的是python,因此可以使用cv2.resize(),将图像大小调整为224x224。这里的问题将是扭曲

我有一个numpy阵列的列表,它们实际上是我的CNN的输入图像。然而,我的每幅图像的大小都不是余弦的,我的CNN只拍摄224X224的图像。我如何将我的每一个图像重塑为给定的维度?
打印(序列图像[key]。重塑(224224,224,3))

给我一个输出

ValueError:新数组的总大小必须保持不变

如果有人能帮助我,我将不胜感激。

以下是我知道的实现这一目标的几种方法:

  • 由于您使用的是python,因此可以使用
    cv2.resize()
    ,将图像大小调整为224x224。这里的问题将是扭曲
  • 缩放图像以调整到所需尺寸之一(W=224或H=224),并修剪掉多余的部分。这里的信息丢失了
  • 如果有较大的图像和边界框,请使用一些三角形到边界框来保持纵横比,然后向下调整大小至所需大小

  • 重塑numpy数组时,维度的生成必须匹配。如果没有,它将抛出一个
    ValueError
    。使用
    重塑
    无法解决您的问题,好吧。

    当您重塑时,新数组应该具有相同数量的值。在这两种情况下,您需要裁剪图片(如果图片大于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],:]
    
    填充稍微复杂一些,这将以所需的形状创建一个零数组,并插入图像中的值:

    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
    
    您还可以对其使用以下功能:

    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))
    
    您可能会意识到,两个函数中的填充有点不同,我不想使问题过于复杂,只是在第二个函数中填充了top和left。因为计算起来比较容易,所以双方都在第一个项目中进行了比较

    最后,为了调整大小,最好使用另一个库。你可以使用,它非常简单。这应该做到:

    imresize(np_img, size)
    

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

    您可以选择什么样的形状更改是正确的-缩放、裁剪、填充?忘了
    np。为这个应用程序重塑
    。嘿,感谢@umoto的解决方案,真的很感激。但是,将较小的尺寸调整为224不会影响图像的纵横比仔细阅读-我说
    调整图像的大小,使较小的一面等于224
    而不是只调整一面的大小。嗯……对不起,我的不好。但是裁剪图像会导致信息丢失。谢谢你的回答:)没错,裁剪图像会导致信息丢失,但是人们通常从图像的中间裁剪,假设感兴趣的对象保持完整。此外,您可能会使用大量冗余信息制作多个作物。这实际上有助于提高训练精度,是一种流行的数据增强方法。