3

我实际上正在使用 Python 处理 MRI 图像。图像格式是 NIFTI 格式,我知道如何在 x、y 或 z 轴上可视化切片,但是现在,我想对它们中的每一个使用 Sobel 过滤并用这些切片创建一个新的 NIFTI 图像。

为了那个原因:

  • 我加载主 .nii.gz 图像(img = nib.load(im_path))
  • 我再次使用新名称“img_sobel”(img_sobel = nib.load(im_path))加载主 .nii.gz 图像
  • 为每个切片创建一个循环
  • Sobel 过滤切片
  • 在img_sobel的对应切片上替换这个切片("img_sobel_data[:, :, sl] == np.hypot(sx, sy)")
  • 循环结束后,保存名为“image_XXX_Sobel”的img_sobel

使用 subplot,我看到每个切片上的 sobel 过滤工作,但似乎“img_sobel_data [:, :, sl] == np.hypot(sx, sy)” 行不起作用,为什么?

这是洛普部分:

    # 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 图像本身!所以我现在的问题是:如何更改从 img_sobel.get_fdata() 获取的 NIFTI 图像?

4

1 回答 1

2

仅仅因为您没有正确保存 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)
#==============================
于 2020-03-02T19:19:52.283 回答