为什么有些图像的三维尺寸为3,而另一些三维尺寸为4?

时间:2018-08-20 02:36:19

标签: python image-processing conv-neural-network

我对图像处理知识不多。我正在尝试实现一个ConvNet。我下载了一些图像作为数据集,并使其高度和宽度相等。然后我尝试通过以下代码将它们加载到np.array中:

train_list = glob.glob('A:\Code\Machine 
Learning\CNN\ConvolutionalNN1\TrainImg\*.jpg')
X_train_orig = np.array([np.array(Image.open(file)) for file in train_list])

但是它给了我无法广播(420,310)到(420,310,3)的错误。然后我打印了数组的形状,其中一些是(420,310,3),其他是(410,320,4)。为什么会这样呢?以及如何更改它以使其适合数组?

1 个答案:

答案 0 :(得分:4)

问题

因此,基本上在这里发生的是您正在使用三种不同格式的图像(至少是出现在问题中的图像)。它们分别是:

  • RGB(尺寸 (420, 310, 3)),三个频道
  • RGB-A(尺寸 (420, 310, 4)),四个频道
  • Grayscale(尺寸 (420, 310)),单个频道

您所看到的第三个维度是代表图像中通道的数量(前两个分别是高度和宽度)。

一个示例将进一步清除它。我从互联网上下载了随机图像,每个图像都属于上述三种格式之一。

RGB图像dog.png

enter image description here

RGB-A图像fish.png

enter image description here

灰度图像lena.png

enter image description here

这是一个Python脚本,可使用PIL加载每个脚本并显示其形状:

from PIL import Image
import numpy as np

dog = Image.open('dog.png')
print('Dog shape is ' + str(np.array(dog).shape))

fish = Image.open('fish.png')
print('Fish shape is ' + str(np.array(fish).shape))

lena = Image.open('lena.png')
print('Lena shape is ' + str(np.array(lena).shape))

这是输出:

Dog shape is (250, 250, 3)
Fish shape is (501, 393, 4)
Lena shape is (512, 512)

因此,当您尝试将所有图像迭代分配给数组(np.array)时,会出现形状不匹配错误。

解决方案

解决此问题的最简单方法是将所有图像转换为一种特定格式,然后再将其保存在数组中。假设您将使用经过预先训练的ImageNet模型,我们会将它们转换为RGB格式(您也可以类似地选择一种格式)。

我们将使用以下代码将RGB-A转换为RGB

fish = Image.open('fish.png')
print('Fish RGB-A shape is ' + str(np.array(fish).shape))
rgb = fish.convert('RGB')
print('Fish RGB shape is ' + str(np.array(rgb).shape))

输出为:

Fish RGB-A shape is (501, 393, 4)
Fish RGB shape is (501, 393, 3)

类似地,您可以对所有图像进行处理,然后对所有图像具有一致数量的通道(在这种情况下为三个)。

注意:在我的示例中,图像的空间尺寸也有所不同。在您的情况下,这不是问题,因为所有维度的大小都一致(420, 310)

希望这可以澄清您的疑问。