Как преобразовать файл mat, включающий в себя 4916 изображений (375x375x3) в массив numpy? - PullRequest
2 голосов
/ 07 июля 2019

Я хочу извлечь изображения в 5000BOLD , который является файлом Matlab, включающим 4916 цветных изображений.Когда я импортирую их в Python, используя следующее:

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

, я получаю словарь type(mat): dict.Как я могу изменить этот файл в массив, который позволяет мне получить доступ к каждому изображению и построить его?Поскольку каждое изображение 375x375x3, у меня должен быть массив 375x375x3x4916.

. Также, используя mat.keys(), я получаю следующее, что я понятия не имею, что означает каждый элемент:

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

Есть ли какой-либо прямой способ использовать этот файл словаря mat напрямую и построить конкретную картинку с помощью imshow?

1 Ответ

2 голосов
/ 07 июля 2019

Глядя на файл меньшего размера:

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, с двумя строковыми массивами - именем файла и некоторой меткой категории:

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. Но без загрузки этого большого файла я не смогу помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...