Как правильно нарисовать oop и нанести изображение на изображение 4D Nifti - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть 4D изображения NIFTI с различными размерами [x, y, срезы, кадры] , первые два - это пространственное разрешение, третье - номер среза, а последнее один - номер кадра, я попытался нанести все фрагменты указанного c кадра на одну фигуру и обновлять кадр за кадром, используя циклы for вместо того, чтобы делать все индексацию вручную, как раньше, но у меня проблема в том, что мои изображения не Обновление рамки (кроме последней вниз), как вы можете видеть на прилагаемой фотографии, как я могу решить эту проблему, пожалуйста ?? NIFTI 4D Image

#==================================
import nibabel as nib
import numpy as np
import matplotlib.pyplot as plt
#==================================
# load image (4D) [X,Y,Z_slice,time]
nii_img  = nib.load(path)
nii_data = nii_img.get_fdata()
#===================================================
fig, ax = plt.subplots(4,3,constrained_layout=True)
fig.canvas.set_window_title('4D Nifti Image')
fig.suptitle('4D_Nifti 10 slices 30 time Frames', fontsize=16)
#-------------------------------------------------------------------------------
mng = plt.get_current_fig_manager()
mng.full_screen_toggle()
slice_counter = 0
for i in range(30):
    for j in range(3):
        for k in range(3):
            if slice_counter<9:
                ax[j,k].cla()
                ax[j,k].imshow(nii_data[:,:,slice_counter,i],cmap='gray', interpolation=None)
                ax[j,k].set_title("frame {}".format(i))
                ax[j,k].axis('off')
                slice_counter+=1
            else:
                #---------------------------------
                ax[3,0].axis('off')
                ax[3,2].axis('off')
                #---------------------------------
                ax[3,1].cla()
                ax[3,1].nii_data(nii_data[:,:,9,i],cmap='gray', interpolation=None)
                ax[3,1].set_title("frame {}".format(i))
                ax[3,1].axis('off')
                #---------------------------------
                # Note that using time.sleep does *not* work here!
                #---------------------------------
                plt.pause(.05)
            plt.close('all')

1 Ответ

1 голос
/ 03 апреля 2020

На данный момент мне не совсем понятно, как должен выглядеть ваш вывод, потому что во втором столбце изображения больше записей, чем в других. Пожалуйста, уточните это лучше в ваших вопросах, а также обновите код, который не работает из-за несогласованных имен переменных и испорченного отступа. напечатайте все свои срезы по оси X, тогда как каждый кадр находится по оси Y. Я адаптировал код, который будет печатать для первых трех срезов первые четыре кадра.

#==================================
import nibabel as nib
import numpy as np
import matplotlib.pyplot as plt
#==================================
# load image (4D) [X,Y,Z_slice,time]
nii_img  = nib.load(path)
nii_data = nii_img.get_fdata()

#===================================================
number_of_slices = 3
number_of_frames = 4

fig, ax = plt.subplots(number_of_frames, number_of_slices,constrained_layout=True)
fig.canvas.set_window_title('4D Nifti Image')
fig.suptitle('4D_Nifti 10 slices 30 time Frames', fontsize=16)
#-------------------------------------------------------------------------------
mng = plt.get_current_fig_manager()
mng.full_screen_toggle()

for slice in range(number_of_slices):
    for frame in range(number_of_frames):
        ax[frame, slice].imshow(nii_data[:,:,slice,frame],cmap='gray', interpolation=None)
        ax[frame, slice].set_title("layer {} / frame {}".format(slice, frame))
        ax[frame, slice].axis('off')

plt.show()         

Пример вывода для черного изображения выглядит так: пример вывода

Обновление - 05.04.2020
С учетом информации из обсуждения в комментариях здесь обновленная версия:

#==================================
import nibabel as nib
import numpy as np
import matplotlib.pyplot as plt
from math import ceil
#==================================
# Load image (4D) [X,Y,Z_slice,time]
nii_img = nib.load(path)
nii_data = nii_img.get_fdata()

#===================================================
number_of_slices = nii_data.shape[2]
number_of_frames = nii_data.shape[3]

# Define subplot layout 
aspect_ratio = 16./9
number_of_colums = int(number_of_slices / aspect_ratio)
if( number_of_slices % number_of_colums > 0):
    number_of_colums += 1
number_of_rows = ceil(number_of_slices / number_of_colums)

# Setup  figure
fig, axs = plt.subplots(number_of_rows, number_of_colums,constrained_layout=True)
fig.canvas.set_window_title('4D Nifti Image')
fig.suptitle('4D_Nifti {} slices {} time Frames'.format(number_of_slices, number_of_frames), fontsize=16)
#-------------------------------------------------------------------------------
mng = plt.get_current_fig_manager()
mng.full_screen_toggle()

for frame in range(number_of_frames):
    for slice, ax in enumerate(axs.flat):
        # For every slice print the image otherwise show empty space.
        if slice < number_of_slices:
            ax.imshow(nii_data[:,:,slice,frame],cmap='gray', interpolation=None)
            ax.set_title("layer {} / frame {}".format(slice, frame))
            ax.axis('off')
        else:
            ax.axis('off')

    plt.pause(0.05)

plt.close('all')

Вывод будет выглядеть так: второй пример выход

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