我对图像处理知识不多。我正在尝试实现一个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)。为什么会这样呢?以及如何更改它以使其适合数组?
答案 0 :(得分:4)
因此,基本上在这里发生的是您正在使用三种不同格式的图像(至少是出现在问题中的图像)。它们分别是:
您所看到的第三个维度是代表图像中通道的数量(前两个分别是高度和宽度)。
一个示例将进一步清除它。我从互联网上下载了随机图像,每个图像都属于上述三种格式之一。
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)
。
希望这可以澄清您的疑问。