如何将包括4916张图片(375x375x3)的mat文件转换为numpy数组?

时间:2019-07-06 22:48:54

标签: python matlab numpy

我想从5000BOLD中提取图片,这是一个Matlab文件,其中包含4916张彩色图片。当我使用以下命令将它们导入Python时:

import scipy.io as sio
mat = sio.loadmat('all_imgs.mat')

我得到一本字典type(mat): dict。如何将该文件更改为numpy数组,使我能够访问每张图片并对其进行绘制?由于每张图片都是375x375x3,所以我应该有一个数组375x375x3x4916

此外,使用mat.keys(),我有以下内容,我不知道每个元素的含义:

dict_keys(['__header__', '__version__', '__globals__', 'all_imgs'])
  

是否有直接方法直接使用此字典文件mat并使用imshow绘制特定图片?

1 个答案:

答案 0 :(得分:2)

查看较小的文件:

In [33]: from scipy import io                                                                                   
In [34]: io.loadmat('../Downloads/all_img_names.mat')     

在没有分配的情况下加载会为我显示文件内容的打印显示(我不建议在使用大图像文件时显示):

Out[34]: 
{'__header__': b'MATLAB 5.0 MAT-file, Platform: GLNXA64, Created on: Thu Oct 19 14:20:48 2017',
 '__version__': '1.0',
 '__globals__': [],
 'all_img_names': array([[array(['airplanecabin1.jpg'], dtype='<U18'),
         array(['scenes'], dtype='<U6')],
        [array(['airplanecabin3.jpg'], dtype='<U18'),
         array(['scenes'], dtype='<U6')],
        [array(['airplanecabin5.jpg'], dtype='<U18'),
         array(['scenes'], dtype='<U6')],
        ...,
        [array(['yogastudio2.jpg'], dtype='<U15'),
         array(['scenes'], dtype='<U6')],
        [array(['yogastudio3.jpg'], dtype='<U15'),
         array(['scenes'], dtype='<U6')],
        [array(['yogastudio4.jpg'], dtype='<U15'),
         array(['scenes'], dtype='<U6')]], dtype=object)}

专门查看all_img_names键。这对应于源MATLAB工作空间中该名称的变量。请注意,这是对象dtype。像单元格一样,它可以包含其他数组:

In [36]: io.loadmat('../Downloads/all_img_names.mat')['all_img_names'].shape                                    
Out[36]: (4916, 2)

再看一下该数组的第一个“行”,它也是object dtype,它有2个字符串数组-文件名和某种类别标签:

In [37]: io.loadmat('../Downloads/all_img_names.mat')['all_img_names'][0]                                       
Out[37]: 
array([array(['airplanecabin1.jpg'], dtype='<U18'),
       array(['scenes'], dtype='<U6')], dtype=object)

希望这使您对如何探索mat['all_imgs']的内容有所了解。

mat['all_imgs'][0,0]

可能是二维数组。但是,如果是某种图像编码,则可能必须使用cv2打开它。但是,如果不下载大文件,我将无济于事。