Как прочитать сохраненную трехмерную матрицу (Dicom Matrix) Matlab как синтаксис Python в Python? - PullRequest
0 голосов
/ 22 января 2019

Я сохранил трехмерную матрицу с координатой (строка = 288, столбец = 288, срез (z) = 266) в Matlab.
Теперь я хочу загрузить его в Python. К сожалению, после загрузки это выглядит как (строка = 288, столбец = 266, срез (z) = 288) в Python.
Учитывая это, синтаксис Matlab для размера: (строки, столбцы, фрагменты в 3-м измерении) и синтаксис Python для размера: (фрагменты в 3-м затемнении, строки, столбцы).

Например, в следующем коде, когда я хочу добавить переменную A в качестве массива, она выглядит как (строка = 288, столбец = 266, срез (z) = 288):

from math import sqrt
from skimage import data
import matplotlib.pyplot as plt
import cv2
import pydicom
import scipy.io as sio
import os
import numpy as np


for root, dirs, files in 
os.walk('G:\PCodes\Other_Codes'):
    matfiles = [_ for _ in files if _.endswith('.mat')]
    for matfile in matfiles: # matfile: 'Final_Volume.mat'
        Patient_All_Info = sio.loadmat(os.path.join(root, matfile)) # Patient_All_Info : {dict}


Patient_All_Info.items()
A = Patient_All_Info["Final_Volume"] # A: {ndarray} : (288, 266, 288) - it isn't as (row = 288, col = 288, slice(z) =266) coordinates.
S = np.shape(A) # S: <class 'tuple'>: (288, 288, 266)  ?

dcm_image = pydicom.read_file('A')
image = dcm_image.pixel_array
plt.imshow(image, cmap='gray')
plt.show()

Как загрузить сохраненную трехмерную матрицу (Dicom Matrix) Matlab в Python?

1 Ответ

0 голосов
/ 22 января 2019

В октавном сеансе:

>> x = reshape(1:24,4,3,2);
>> save -v7 'test.mat' x

С Python loadmat сохраняет форму и F заказ:

In [200]: data = loadmat('test.mat')
In [208]: data['x'].shape
Out[208]: (4, 3, 2)
In [209]: data['x'].ravel(order='F')
Out[209]: 
array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12., 13.,
       14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24.])

Transpose создаст массив (2,3,4)

In [210]: data['x'].T
Out[210]: 
array([[[ 1.,  2.,  3.,  4.],
        [ 5.,  6.,  7.,  8.],
        [ 9., 10., 11., 12.]],

       [[13., 14., 15., 16.],
        [17., 18., 19., 20.],
        [21., 22., 23., 24.]]])

transpose может принимать параметр заказа, например data['x'].transpose(2,0,1).

(я не знаком с dicom, но, надеюсь, это иллюстрирует, как loadmat обрабатывает трехмерный массив из MATLAB.)

...