Python - 将图像读入图像矩阵

标签 python arrays image-processing matrix

我正在尝试将多个 rgb 图像读取到一个矩阵中,这样矩阵尺寸为 (image_size, image_size, index) 例如data[:,:,1] 应该检索第一张图像。

data = np.zeros((image_dim, image_dim, numImages), dtype=np.float64)
for fname in os.listdir('images/sample_images/'):
       name='....'
       image=mpimg.imread(name)
       data = np.append(data, image)
return data

图像.形状 = (512, 512, 3) 数据.shape = (512, 512, 100)

除了 np.append 给我留下一个空数据数组这一事实之外,还有另一种方法可以将图像数组值附加到大数据矩阵吗?

提前致谢

最佳答案

Falko 的帖子无疑是规范的方式。但是,如果我可以建议一个更 numpy/Pythonic 的方法来做到这一点,我会让第一个维度是你想要的图像的索引,而第二个和第三个维度是行和列图像,可选的第四维是您想要的颜色 channel 。因此,假设您的图像尺寸为 M x N 并且您有 K 图像,您将创建一个矩阵为 K x M x N对于彩色图像,长或 K x M x N x 3 长。

因此,根据您当前的代码,numpy 中的一个简单的单行代码可能是这样的:

data = np.array([mpimg.imread(name) for name in os.listdir('images/sample_images/')], dtype=np.float64)

因此,如果您想要访问第 ith 个图像,您只需执行 data[i]。这将独立图像是 RGB 还是灰度...所以通过执行 data[i],您将获得 RGB 图像或灰度图像,具体取决于关于您决定使用什么来打包阵列。 但是,您需要确保所有图像都是一致的……也就是说,它们都是彩色的或都是灰度的。

但是,为了向您展示这是有效的,让我们尝试使用 5 x 5 x 3“RGB”图像,其中每个图像从 0 开始增加到 K-1 其中 K 在这种情况下将为 10:

data = np.array([i*np.ones((5,5,3)) for i in range(10)], dtype=np.float64)

让我们看一个示例运行(在 IPython 中):

In [26]: data = np.array([i*np.ones((5,5,3)) for i in range(10)], dtype=np.float64)

In [27]: data.shape
Out[27]: (10, 5, 5, 3)

In [28]: img = data[0]

In [29]: img
Out[29]: 
array([[[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]])

In [30]: img.shape
Out[30]: (5, 5, 3)

In [31]: img = data[7]

In [32]: img
Out[32]: 
array([[[ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.]],

       [[ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.]],

       [[ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.]],

       [[ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.]],

       [[ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.],
        [ 7.,  7.,  7.]]])

In [33]: img.shape
Out[33]: (5, 5, 3)

在上面的示例运行中,我创建了示例数据数组,它是我们预期的 10 x 5 x 5 x 3。我们有 10 个 5 x 5 x 3 矩阵。接下来,我提取出第一个“RGB”图像,如我们所料,它全为 0,大小为 5 x 5 x 3。我还提取了第八个切片,我们都得到了预期的 7,大小为 5 x 5 x 3

显然,选择您认为最好的答案,但我个人会选择上述路线,因为索引到您的数组以获取正确的图像更简单 - 您让维度广播为您完成工作。

关于Python - 将图像读入图像矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32077425/

相关文章:

python - 如何使用 Numpy 将 (1*3) 向量除以 (3*3) 矩阵? a/b 不起作用

python - 导入错误 : cannot import name 'getLogger'

python - 如何沿轴合并和拆分numpy数组?

python - cv2 imread 返回 None

image-processing - OpenCV 在同一窗口中相邻显示 2 个图像

python - Virtualenv 完全困惑 - 段错误 : 11

python - 从文本中提取特定模式的 URL

javascript - Javascript 中的 float 正在四舍五入

javascript - 为什么这个 JavaScript 数组返回未定义?

python - 如何提高图像质量?