在 Python 3.7 中更改 NIFTI 的整个图像切片
Change entire images slices of NIFTI in Python 3.7
我实际上是在使用 Python 处理 MRI 图像。
图片格式为NIFTI格式
我了解了如何在 x、y 或 z 轴上可视化切片,但现在,我想对每个切片使用 Sobel 过滤并使用这些切片创建一个新的 NIFTI 图像。
为此:
- 我载入主要的 .nii.gz 图片 (img = nib.load(im_path))
- 我用新名称再次加载主 .nii.gz 图像 "img_sobel" (img_sobel = nib.load(im_path))
- 为每个切片创建一个循环
- Sobel 过滤切片
- 将此切片替换到 img_sobel ("img_sobel_data[:, :, sl] == np.hypot(sx, sy)")
的对应切片上
- 循环后,将img_sobel保存为"image_XXX_Sobel"
使用 subplot,我看到 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 图像本身!!!
所以我现在的问题是:如何更改从 img_sobel.get_fdata() 获取的 NIFTI 图像?
仅仅因为你没有保存你的img_sobel_data,仿射和header正确,如果你想保存 Nifti 图片你必须提供 header 和仿射之前保存它 img_sobel = nib.Nifti1Image(img_sobel_data, affine=img_sobel_affine, header=header)
否则您可以使用带有 cv2.imwrite
的 cv2 库将图像保存为其他格式,以将图像保存为 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)
#==============================
我实际上是在使用 Python 处理 MRI 图像。 图片格式为NIFTI格式 我了解了如何在 x、y 或 z 轴上可视化切片,但现在,我想对每个切片使用 Sobel 过滤并使用这些切片创建一个新的 NIFTI 图像。
为此:
- 我载入主要的 .nii.gz 图片 (img = nib.load(im_path))
- 我用新名称再次加载主 .nii.gz 图像 "img_sobel" (img_sobel = nib.load(im_path))
- 为每个切片创建一个循环
- Sobel 过滤切片
- 将此切片替换到 img_sobel ("img_sobel_data[:, :, sl] == np.hypot(sx, sy)") 的对应切片上
- 循环后,将img_sobel保存为"image_XXX_Sobel"
使用 subplot,我看到 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 图像本身!!! 所以我现在的问题是:如何更改从 img_sobel.get_fdata() 获取的 NIFTI 图像?
仅仅因为你没有保存你的img_sobel_data,仿射和header正确,如果你想保存 Nifti 图片你必须提供 header 和仿射之前保存它 img_sobel = nib.Nifti1Image(img_sobel_data, affine=img_sobel_affine, header=header)
否则您可以使用带有 cv2.imwrite
的 cv2 库将图像保存为其他格式,以将图像保存为 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)
#==============================