如何在Python中使用.img / .hdr数据?

时间:2018-03-27 11:15:04

标签: python medical

我有一些MRI扫描扩展文件.img/.hdr/.gif。我是全新的。

我该如何使用它?我怎样才能看到那片' .img'阵列

我找到了

import nibabel as nib
img = nib.load('./OAS1_0001_MR1_mpr_n4_anon_111_t88_masked_gfc_fseg.img')
print(img)

显示

<class 'nibabel.spm2analyze.Spm2AnalyzeImage'>
data shape (176, 208, 176, 1)
affine: 
[[  -1.     0.     0.    87.5]
 [   0.     1.     0.  -103.5]
 [   0.     0.     1.   -87.5]
 [   0.     0.     0.     1. ]]
metadata:
<class 'nibabel.spm2analyze.Spm2AnalyzeHeader'> object, endian='>'
sizeof_hdr     : 348
data_type      : b'\x00B\x00\x00YA\x00\x00\xe8@'
db_name        : b'\x00\x00\x14@\x00\x00\x9d?\x00\x00\xbf>\x00\x005>'
extents        : 16384
session_error  : 0
regular        : b'r'
hkey_un0       : b' '
dim            : [  4 176 208 176   1   0   0   0]
vox_units      : b'mm'
cal_units      : b'7\x00\x00\x006\x16'
unused1        : 0
datatype       : uint8
bitpix         : 8
dim_un0        : 0
pixdim         : [  0.00000000e+00   1.00000000e+00   1.00000000e+00   1.00000000e+00
   1.65311180e-41   1.60658869e-41   1.55614194e-41   1.50821754e-41]
vox_offset     : 0.0
scl_slope      : nan
scl_inter      : 0.0
funused3       : 0.0
cal_max        : 0.0
cal_min        : 0.0
compressed     : 0
verified       : 0
glmax          : 3
glmin          : 0
descrip        : b'                                                                               '
aux_file       : b'                       '
orient         : b''
origin         : [8224 8224 8224 8224 8192]
generated      : b'         '
scannum        : b'         '
patient_id     : b'         '
exp_date       : b'         '
exp_time       : b'         '
hist_un0       : b'  '
views          : 0
vols_added     : 0
start_field    : 0
field_skip     : 0
omax           : 0
omin           : 0
smax           : 0
smin           : 0

但是我无法获得MRI扫描片。我该怎么画呢?我假设img.get_data()应该帮助我......

2 个答案:

答案 0 :(得分:1)

对于绘图,您可以使用

from nilearn import plotting
plotting.plot_anat(img, title="plot_anat")

要提取正确的数据,可以使用 img.get_data()

答案 1 :(得分:1)

从数据的形状(data shape (176, 208, 176, 1)来看,它是3D图像,因此您需要指定要以2D绘制的平面。共有三个选项:

  • 轴向或水平或横向平面;将身体分为头和尾(Z轴)
  • 冠状或额状平面;将身体分为前后部分(Y轴)
  • 矢状或纵向平面;将身体分为左右(X轴)

您可以在Wikipedia中找到有关解剖平面的更多详细信息以及非常有用的图表。

因此,对于数据,按照说明阅读后,您可以通过调用来获取普通数组

im_data = img.get_fdata()(我收到get_data()的折旧警告)

数据数组将具有相同的形状,因此,如果您想沿着一个平面绘制中心切片,只需编写:

import matplotlib.pyplot as plt

center_slice = im_data[:,:,88, 0]
fig, ax = plt.subplots(1,1)
ax.imshow(center_slice, cmap="gray")
plt.show()

请注意,图像不一定正确放置(旋转,轴等)。有时足以将其旋转90度或使用scipy.ndimage.shift()进行手动移位。 nilearn plotting源代码提供了对默认MPL轴的完整转换和修改列表,因此值得一看。