Измените целые изображения фрагментов NIFTI в Python 3,7 - PullRequest
2 голосов
/ 02 марта 2020

Я на самом деле работаю над изображениями МРТ, используя Python. Формат изображения - это формат NIFTI, который я получаю, как визуализировать срезы по осям x, y или z, но теперь я хочу использовать фильтрацию Собеля по каждому из них и создать новое изображение NIFTI с этими срезами.

Для этого:

  • Я загружаю основное изображение .nii.gz (img = nib.load (im_path))
  • Я снова загружаю основное изображение .nii.gz с новым имя "img_sobel" (img_sobel = nib.load (im_path))
  • Создать al oop для каждого среза
  • Собел, фильтрующий срез
  • Заменить этот срез на соответствующий часть img_sobel («img_sobel_data [:,:, sl] == np.hypot (sx, sy)»)
  • После l oop сохраните img_sobel с именем «image_XXX_Sobel»

Используя подзаговор, я вижу, что фильтрация sobel работает на каждом срезе, но кажется, что строка "img_sobel_data [:,:, sl] == np.hypot (sx, sy)" не работает, почему ?

Вот раздел lopp:

    # Name the interested data
    img_data = img.get_fdata()
    img_sobel_data = img_sobel.get_fdata()

    header = img.header
    nb_img = header.get_data_shape()
    nb_img_h = nb_img[2] #Hauteur

    for sl in range(0,nb_img_h):
            slice_h = img_data[:, :, sl]
            #Sobel
            sx = ndimage.sobel(slice_h, axis=0, mode='constant')
            sy = ndimage.sobel(slice_h, axis=1, mode='constant')
            sobel_h = np.hypot(sx, sy)

            img_sobel_data[:, :, sl] = sobel_h #Change the image slice to the sobel one
# Save Sobel:
nib.save(img_sobel,imSobel_path)

Что не так? Разве мы не можем заменить фрагмент изображения из другого в Python? Есть ли хитрость для решения этой проблемы?

Спасибо!

РЕДАКТИРОВАТЬ: ОК, я получаю немного больше, почему я не могу сделать так легко: я извлек фрагменты изображения NIFTI , отфильтровал их, но я не изменил сам образ NIFTI !!! Итак, мой вопрос: как изменить изображение NIFTI, полученное из img_sobel.get_fdata ()?

1 Ответ

1 голос
/ 02 марта 2020

просто потому, что вы не сохранили свои img_sobel_data с правильной аффинностью и заголовком , если вы хотите сохранить изображение Nifti, вы должны предоставить заголовок и аффин перед тем, как сохранить его img_sobel = nib.Nifti1Image(img_sobel_data, affine=img_sobel_affine, header=header) в противном случае вы можете сохранить изображение в других форматах, используя библиотеку cv2 с cv2.imwrite для сохранения изображения в формате JPG или PNG.

#======================================
# Importing Necessary Libs
#======================================
import nibabel as nib
import numpy as np 
from scipy import ndimage, misc
import matplotlib.pyplot as plt
#==============================
img  = nib.load(Nifti_img_path)
img_sobel  = nib.load(Nifti_img_sobel_path)
#==============================
if True: 
    # Name the interested data  
    img_data = img.get_fdata()
    img_sobel_data = img_sobel.get_fdata()
    img_sobel_affine = img_sobel.affine
    header = img.header
    nb_img = header.get_data_shape()
    nb_img_h = nb_img[2] #Hauteur

    for sl in range(0,nb_img_h):
            slice_h = img_data[:, :, sl]
            #Sobel
            sx = ndimage.sobel(slice_h, axis=0, mode='constant')
            sy = ndimage.sobel(slice_h, axis=1, mode='constant')
            sobel_h = np.hypot(sx, sy)

            img_sobel_data[:, :, sl] = sobel_h #Change the image slice to the sobel one
# Save Sobel:
img_sobel = nib.Nifti1Image(img_sobel_data, affine=img_sobel_affine, header=header)
nib.save(img_sobel,imSobel_path)
#==============================
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...