【问题标题】:Why do some images have third dimension 3 while others have 4?为什么有些图像的三维度为 3,而有些图像的三维度为 4?
【发布时间】:2018-08-20 02:36:19
【问题描述】:

我对图像处理了解不多。我正在尝试实现一个 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)。为什么会这样?我怎样才能改变它以适应数组?

【问题讨论】:

  • RGBA的alpha值
  • 删除第四个维度,img[:, :, :3]
  • @MateenUlhaq 我应该在哪里写?并且形状元组中不是四个而是三个元素。那么你指的是什么第四维度

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


【解决方案1】:

问题

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

  • RGB(维度 (420, 310, 3)),三个频道
  • RGB-A(维度 (420, 310, 4)),四个频道
  • Grayscale(维度 (420, 310)),单通道

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

一个例子将进一步清楚。我从互联网上随机下载了属于上述三种格式之一的图片。

RGB 图像dog.png

RGB-A 图像fish.png

灰度图像lena.png

这是一个 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)

希望这能澄清您的疑问。

【讨论】:

  • 但是删除 alpha 参数是否会以任何方式影响图像,例如它们变得模糊或其他什么?
  • 我还有一个疑问,我只是在 glob 中使用了 *.jpg,但是 png 图像会自动转换为 jpg 并被选中。这正常吗?还是我应该手动将它们转换为 png 然后选择?
  • 关于您的第一个问题,这取决于您的用例。引用自 Wiki,alpha 通道定义 每个像素的不透明程度,并允许使用 alpha 合成将图像与其他图像组合在一起,具有透明区域和不透明区域边缘的抗锯齿。 如果您打算将图像用于分类或其他用途,如果使用经过训练的模型,则可以安全地删除它而不会产生太大后果。
  • 关于您的第二个查询,这不是 glob.glob 的预期行为。文档可以在这里找到:docs.python.org/3/library/glob.html#glob.glob 它只会递归地选择与*.jpg 格式匹配的文件。错误发生在我认为的其他地方。
猜你喜欢
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多