点击查看代码
import numpy as np
import SimpleITK as sitk
###############################################################################################---重采样
def resample_image(itk_image, out_spacing=[1.0, 1.0, 1.0], is_label=True):
'''
gz_path = 'PANCREAS_0015.nii.gz'
print('测试文件名为:', gz_path)
# 使用sitk读取对应的数据
Original_img = sitk.ReadImage(gz_path)
print('原始图像的Spacing:', Original_img.GetSpacing())
print('原始图像的Size:', Original_img.GetSize())
# 对数据进行重采样
Resample_img = resample_image(Original_img)
print('经过resample之后图像的Spacing是:', Resample_img.GetSpacing())
print('经过resample之后图像的Size是:', Resample_img.GetSize())
sitk.WriteImage(Resample_img,gz_path)
'''
original_spacing = itk_image.GetSpacing()
original_size = itk_image.GetSize()
out_size = [
int(np.round(original_size[0] * (original_spacing[0] / out_spacing[0]))),
int(np.round(original_size[1] * (original_spacing[1] / out_spacing[1]))),
int(np.round(original_size[2] * (original_spacing[2] / out_spacing[2])))
]
resample = sitk.ResampleImageFilter()
resample.SetOutputSpacing(out_spacing)
resample.SetSize(out_size)
resample.SetOutputDirection(itk_image.GetDirection())
resample.SetOutputOrigin(itk_image.GetOrigin())
resample.SetTransform(sitk.Transform())
resample.SetDefaultPixelValue(itk_image.GetPixelIDValue())
if is_label:
resample.SetInterpolator(sitk.sitkNearestNeighbor)
else:
resample.SetInterpolator(sitk.sitkBSpline)
return resample.Execute(itk_image)
###############################################################################################---获取可以包裹mask的最小bbox,根据bbox截取图片
def get_bbox_from_mask(mask, outside_value=0):
"""
file_path=path
old_img = sitk.ReadImage(file_path)
img_arr = sitk.GetArrayFromImage(old_img)
bbox = get_bbox_from_mask(img_arr)
"""
mask_voxel_coords = np.where(mask != outside_value) #返回值是索引
minzidx = int(np.min(mask_voxel_coords[0]))
maxzidx = int(np.max(mask_voxel_coords[0])) + 1 #这里+1因为列表索引最大值不能到头,如[0,5],只有0,1,2,3,4这五个值
minxidx = int(np.min(mask_voxel_coords[1]))
maxxidx = int(np.max(mask_voxel_coords[1])) + 1
minyidx = int(np.min(mask_voxel_coords[2]))
maxyidx = int(np.max(mask_voxel_coords[2])) + 1
return [[minzidx, maxzidx], [minxidx, maxxidx], [minyidx, maxyidx]]
def crop_to_bbox(image, bbox):
"""
# file=path1
# out_file=path2
# old_img = sitk.ReadImage(file)
# img_arr = sitk.GetArrayFromImage(old_img)
# print(img_arr.shape)
# bbox=[[minzidx, maxzidx], [minxidx, maxxidx], [minyidx, maxyidx]]
# img_arr = crop_to_bbox(img_arr, bbox)
# print("new shape: ", img_arr.shape)
# img = sitk.GetImageFromArray(img_arr)
# img.SetOrigin(old_img.GetOrigin())
# img.SetDirection(old_img.GetDirection())
# img.SetSpacing(old_img.GetSpacing())
# sitk.WriteImage(img,out_file)
# print(bbox)
"""
assert len(image.shape) == 3, "only supports 3d images"
# slice是切片函数,参数为:起始值,终止值,[步长]
resizer = (slice(bbox[0][0], bbox[0][1]), slice(bbox[1][0], bbox[1][1]), slice(bbox[2][0], bbox[2][1]))
return image[resizer]
###############################################################################################-------数据归一化
"""
image = sitk.ReadImage(path1)
resacleFilter = sitk.RescaleIntensityImageFilter()
resacleFilter.SetOutputMaximum(1) #此处0,1设置成0,255就代表将图像的灰度值归一化到0-255
resacleFilter.SetOutputMinimum(0)
image = resacleFilter.Execute(image)
sitk.WriteImage(image, path2)
"""
###############################################################################################