Как нарезать 3D Nifti (.nii) изображения на 2d изображения с определенной плоскостью? - PullRequest
1 голос
/ 31 января 2020

Я пишу скрипт, который может оценить четкость изображения 3d Nifti (.nii). В моем методе мне нужно вынуть его срез xz (ось) трехмерного изображения, а затем сначала сохранить его как файл .png (для эффективности просто взять один). Затем оцените резкость изображения. Однако я не знаю, как нарезать трехмерное изображение с определенной плоскостью (срез). Существует ли какой-либо существующий код или библиотека, которая может выполнять нарезку?

Я использую Python 3.7 (запускается в окне 10).

Я попробовал эту библиотеку: https://pypi.org/project/nii2png/ Однако она не может вывести ни одного кремнезема .

Я также попробовал метод этой страницы https://nipy.org/nibabel/coordinate_systems.html#introducing -коме Однако, он не работает. Причина, может быть, файл Nifti отличается. Я думаю, что есть два вида файлов формата nifti.

import nibabel as nib
import numpy as np
import matplotlib.pyplot as plt

def show_slices(slices):
    """ Function to display row of image slices """
    fig, axes = plt.subplots(1, len(slices))
    for i, slice in enumerate(slices):
        axes[i].imshow(slice.T, cmap="gray", origin="lower")

data = nib.load('D:\\Work\\Script\\__Project\\s\\ADNI\\good_img\\MPRAGE_SENSE2\\2012-11-08_07_32_36.0\\S174286\\ADNI_002_S_5018_MR_MPRAGE_SENSE2__br_raw_20121112145413785_28_S174286_I346236.nii')
data.get_fdata()
data = data.get_fdata()
data.shape
#d_data = np.delete(data, 3, 0) #doesn't work, because it's object of type 'Nifti1Image'
#matplotlib inline
#plt.imshow(data.get_data()[:,:,50])
plt.plot(np.mean(data,axis=(0,1,2)))
plt.show()

slice_0 = data[26, :, :, :]
slice_1 = data[:, 30, :, :]
slice_2 = data[:, :, 16, :]
slice_3 = data[:, :, :, 0]
show_slices([slice_0, slice_1, slice_2, slice_3])
plt.suptitle("Center slices for EPI image") 

Тогда я получил ошибку:

Warning (from warnings module):
  File "D:\Program_Files_2\Python\lib\site-packages\dicom\__init__.py", line 53
    warnings.warn(msg)
UserWarning: 
This code is using an older version of pydicom, which is no longer 
maintained as of Jan 2017.  You can access the new pydicom features and API 
by installing `pydicom` from PyPI.
See 'Transitioning to pydicom 1.x' section at pydicom.readthedocs.org 
for more information.

Traceback (most recent call last):
  File "D:\Work\Script\__Project\s\try_load_nii_image_and_view_slice_3.py", line 25, in <module>
    show_slices([slice_0, slice_1, slice_2, slice_3])
  File "D:\Work\Script\__Project\s\try_load_nii_image_and_view_slice_3.py", line 9, in show_slices
    axes[i].imshow(slice.T, cmap="gray", origin="lower")
  File "D:\Program_Files_2\Python\lib\site-packages\matplotlib\__init__.py", line 1601, in inner
    return func(ax, *map(sanitize_sequence, args), **kwargs)
  File "D:\Program_Files_2\Python\lib\site-packages\matplotlib\cbook\deprecation.py", line 369, in wrapper
    return func(*args, **kwargs)
  File "D:\Program_Files_2\Python\lib\site-packages\matplotlib\cbook\deprecation.py", line 369, in wrapper
    return func(*args, **kwargs)
  File "D:\Program_Files_2\Python\lib\site-packages\matplotlib\axes\_axes.py", line 5671, in imshow
    im.set_data(X)
  File "D:\Program_Files_2\Python\lib\site-packages\matplotlib\image.py", line 690, in set_data
    .format(self._A.shape))
TypeError: Invalid shape (1, 256, 256) for image data

1 Ответ

0 голосов
/ 29 февраля 2020

ваша ошибка в выборе фрагментов, обратите внимание, что если вы имеете дело с 4D image [x, y, z_Slice, time_Frame] , и вы хотите выбрать различные фрагменты, вам следует сохраняйте пространственную информацию x и y , выберите срез и рамку (если ваше изображение 4D, а не 3D)

# slices 0 --> 3 from frame 0   

slice_0 = data[:, :, 0, 0]
slice_1 = data[:, :, 1, 0]
slice_2 = data[:, :, 2, 0]
slice_3 = data[:, :, 3, 0]

Code after selecting correct slices

...