Notas de estudio de ITK (9) datos de remuestreo de simpleITK a un tamaño fijo

1, tamaño de remuestra

Este remuestreo no es espaciado de remuestreo, sino tamaño de remuestreo, para lograr un tamaño consistente para todos los datos.

Por ejemplo: (880, 880, 12) muestra uniforme (880, 880, 16)

Porque si el formato de entrada de los datos de la red 3DUnet se establece en (N, C, 16, xxx, xxx), el tamaño de cada dato se puede volver a muestrear (16, xxx, xxx) y luego ingresar a la red.

Si establece directamente el Tamaño en (16, xxx, xxx), la capa adicional SimpleITK se llenará con 0, lo que no puede lograr un muestreo real. Entonces, al hacer la operación inversa del muestreo de espaciado anterior

"""
统一Size
X轴和Y轴的Size和Spacing没有变化,
Z轴的Size和Spacing有变化
"""
def resampleSize(sitkImage, depth):
    #重采样函数
    euler3d = sitk.Euler3DTransform()

    xsize, ysize, zsize = sitkImage.GetSize()
    xspacing, yspacing, zspacing = sitkImage.GetSpacing()
    new_spacing_z = zspacing/(depth/float(zsize))

    origin = sitkImage.GetOrigin()
    direction = sitkImage.GetDirection()
    #根据新的spacing 计算新的size
    newsize = (xsize,ysize,int(zsize*zspacing/new_spacing_z))
    newspace = (xspacing, yspacing, new_spacing_z)
    sitkImage = sitk.Resample(sitkImage,newsize,euler3d,sitk.sitkNearestNeighbor,origin,newspace,direction)
    return sitkImage

DEPTH = 16  #需要重采样Size的层数

#读取nifit原数据 ,size为:(880, 880, 12)
NifitmPath = 'work/data/nifit/Case14.nii.gz'
sitkImage = sitk.ReadImage(NifitmPath)
print("重采样前的信息") 
print("尺寸:{}".format(sitkImage.GetSize()))
print("体素大小(x,y,z):{}".format(sitkImage.GetSpacing()) )

print('='*30+'我是分割线'+'='*30)


newsitkImage = resampleSize(sitkImage, depth=DEPTH)
print("重采样后的信息")
print("尺寸:{}".format(newsitkImage.GetSize()))
print("体素大小(x,y,z):{}".format(newsitkImage.GetSpacing()) )
重采样前的信息
尺寸:(880, 880, 12)
体素大小(x,y,z):(0.3448275923728943, 0.3448275923728943, 5.499998092651367)
==============================我是分割线==============================
重采样后的信息
尺寸:(880, 880, 16)
体素大小(x,y,z):(0.3448275923728943, 0.3448275923728943, 4.124998569488525)

Referencia: Remuestreo (Tamaño Unificado)

2. Remuestreo de preprocesamiento de imágenes CT

La desventaja de volver a muestrear los datos de acuerdo con el espaciado especificado es que, por lo general, no se pueden volver a muestrear al tamaño especificado. En aplicaciones prácticas, a menudo se encuentra que es necesario especificar el tamaño de la imagen.

def Resampling(img,lable = False):
    original_size = img.GetSize() #获取图像原始尺寸
    original_spacing = img.GetSpacing() #获取图像原始分辨率
    new_spacing = [1, 1, 1] #设置图像新的分辨率为1*1*1

    new_size = [int(round(original_size[0] * (original_spacing[0] /1))),
                int(round(original_size[1] * (original_spacing[1] / 1))),
                int(round(original_size[2] * (original_spacing[2] / 1)))] #计算图像在新的分辨率下尺寸大小
    resampleSliceFilter = sitk.ResampleImageFilter() #初始化
    if lable == False:
        Resampleimage = resampleSliceFilter.Execute(img, new_size, sitk.Transform(), sitk.sitkBSpline,
                                                img.GetOrigin(), new_spacing, img.GetDirection(), 0,
                                                img.GetPixelIDValue())
        ResampleimageArray = sitk.GetArrayFromImage(Resampleimage)
        ResampleimageArray[ResampleimageArray < 0] = 0 #将图中小于0的元素置为0
    else:# for label, should use sitk.sitkLinear to make sure the original and resampled label are the same!!!
        Resampleimage = resampleSliceFilter.Execute(img, new_size, sitk.Transform(), sitk.sitkLinear,
                                                    img.GetOrigin(), new_spacing, img.GetDirection(), 0,
                                                    img.GetPixelIDValue())
        ResampleimageArray = sitk.GetArrayFromImage(Resampleimage)

3. SKIMAGE.TRANSFORM - ambas escalas están disponibles

# 1、按目标大小缩放resize
skimage.transform.resize(image, output_shape, order=1, mode='reflect', cval=0, clip=True, preserve_range=False, anti_aliasing=True, anti_aliasing_sigma=None)
# 2、按缩放因子缩放rescale
skimage.transform.rescale(image, scale, order=1, mode='reflect', cval=0, clip=True, preserve_range=False, multichannel=False, anti_aliasing=True, anti_aliasing_sigma=None)

# The order of interpolation. The order has to be in the range 0-5:
# 0: Nearest-neighbor
# 1: Bi-linear (default)
# 2: Bi-quadratic
# 3: Bi-cubic
# 4: Bi-quartic
# 5: Bi-quintic

Referencia: Remuestreo de preprocesamiento de imágenes CT

4. Código de implementación de remuestreo de imágenes médicas (remuestreo) de la biblioteca Python SimpleItk

Requisitos: ya hay imágenes CT y PET registradas, y la etiqueta estándar de oro se dibuja en la CT, por lo que hay algunos requisitos simples, uno es volver a muestrear la imagen PET al mismo tamaño que la imagen CT (por ejemplo, de 192 ×192 × 371 a 512 × 512 × 484), o reduzca la máscara estándar de oro al mismo tamaño que PET (es decir, viceversa).

Cómo encontrar el método: la función de lectura de imágenes de ITK-SNAP (versión 3.8) admite imágenes de diferentes tamaños, espaciado, origen y dirección para que se muestren juntas, y el software será equivalente a las imágenes añadidas más tarde por remuestreo; método, el resto es encontrar el código correspondiente.

import SimpleITK as sitk

def resize_image_itk(ori_img, target_img, resamplemethod=sitk.sitkNearestNeighbor):
    """
    用itk方法将原始图像resample到与目标图像一致
    :param ori_img: 原始需要对齐的itk图像
    :param target_img: 要对齐的目标itk图像
    :param resamplemethod: itk插值方法: sitk.sitkLinear-线性  sitk.sitkNearestNeighbor-最近邻
    :return:img_res_itk: 重采样好的itk图像
    使用示范:
    import SimpleITK as sitk
    target_img = sitk.ReadImage(target_img_file)
    ori_img = sitk.ReadImage(ori_img_file)
    img_r = resize_image_itk(ori_img, target_img, resamplemethod=sitk.sitkLinear)
    """
    target_Size = target_img.GetSize()      # 目标图像大小  [x,y,z]
    target_Spacing = target_img.GetSpacing()   # 目标的体素块尺寸    [x,y,z]
    target_origin = target_img.GetOrigin()      # 目标的起点 [x,y,z]
    target_direction = target_img.GetDirection()  # 目标的方向 [冠,矢,横]=[z,y,x]

    # itk的方法进行resample
    resampler = sitk.ResampleImageFilter()
    resampler.SetReferenceImage(ori_img)  # 需要重新采样的目标图像
    # 设置目标图像的信息
    resampler.SetSize(target_Size)		# 目标图像大小
    resampler.SetOutputOrigin(target_origin)
    resampler.SetOutputDirection(target_direction)
    resampler.SetOutputSpacing(target_Spacing)
    # 根据需要重采样图像的情况设置不同的dype
    if resamplemethod == sitk.sitkNearestNeighbor:
        resampler.SetOutputPixelType(sitk.sitkUInt8)   # 近邻插值用于mask的,保存uint8
    else:
        resampler.SetOutputPixelType(sitk.sitkFloat32)  # 线性插值用于PET/CT/MRI之类的,保存float32
    resampler.SetTransform(sitk.Transform(3, sitk.sitkIdentity))    
    resampler.SetInterpolator(resamplemethod)
    itk_img_resampled = resampler.Execute(ori_img)  # 得到重新采样后的图像
    return itk_img_resampled
    

Referencia: Código de implementación de remuestreo de imágenes médicas (remuestreo) de la biblioteca Python SimpleItk

5. Usa SimpleITK para interpolar archivos de volumen

Cuando se analizan archivos dicom, a menudo se realiza la interpolación o el remuestreo, lo que se puede hacer fácilmente con SimpleITK.

import SimpleITK as sitk

def getDicomSeriesVolumeImage(folderPath):
	'''
	读取dicom序列文件
	:para folderPath:dicom文件夹
	:return volumeImage:volume
	'''
    reader = sitk.ImageSeriesReader()
    dicomNames = reader.GetGDCMSeriesFileNames(folderPath)
    reader.SetFileNames(dicomNames)
    volumeImage = reader.Execute()

    return volumeImage

def interpolate(volumeImage, newSpacing):
	'''
	插值处理
	:para volumeImage:volume格式
	:para newSpaceing:想要插值或者重采样处理后得到的三个物理间隔,格式为列表
	:return newVolumeImage:插值处理后的到的volume文件
	'''
    resampleFilter = sitk.ResampleImageFilter()
    resampleFilter.SetInterpolator(sitk.sitkLinear) 	##此处为线性插值,其他插值方式可以去官网查询
    resampleFilter.SetOutputDirection(volumeImage.GetDirection())
    resampleFilter.SetOutputOrigin(volumeImage.GetOrigin())

    newSpacing = np.array(newSpacing, float)
    newSize = volumeImage.GetSize() / newSpacing * volumeImage.GetSpacing()
    newSize = newSize.astype(np.int)

    resampleFilter.SetSize(newSize.tolist())
    resampleFilter.SetOutputSpacing(newSpacing)
    newVolumeImage = resampleFilter.Execute(volumeImage)

    return newVolumeImage

Referencia: Interpolar archivos de volumen con SimpleITK

6. Remuestreo de imágenes médicas

1. Remuestreo

En el proceso de preprocesamiento de imágenes médicas, a menudo es necesario volver a muestrear los datos a la escala que necesitamos. Porque las imágenes médicas corresponden al tamaño físico del espacio real. Por ejemplo, el tamaño de un vóxel es 0,97 mm 0,97 mm 2,5 mm, queremos muestrear el tamaño del bloque de vóxel a 1 mm 1 mm 1 mm, lo que puede ayudarnos en el siguiente paso. Esto se puede hacer usando sitk.

2. Código

import SimpleITK as sitk
"""
resample
"""

def resampleVolume(outspacing,vol):
    """
    将体数据重采样的指定的spacing大小\n
    paras:
    outpacing:指定的spacing,例如[1,1,1]
    vol:sitk读取的image信息,这里是体数据\n
    return:重采样后的数据
    """
    outsize = [0,0,0]
    inputspacing = 0
    inputsize = 0
    inputorigin = [0,0,0]
    inputdir = [0,0,0]

    #读取文件的size和spacing信息
    
    inputsize = vol.GetSize()
    inputspacing = vol.GetSpacing()

    transform = sitk.Transform()
    transform.SetIdentity()
    #计算改变spacing后的size,用物理尺寸/体素的大小
    outsize[0] = int(inputsize[0]*inputspacing[0]/outspacing[0] + 0.5)
    outsize[1] = int(inputsize[1]*inputspacing[1]/outspacing[1] + 0.5)
    outsize[2] = int(inputsize[2]*inputspacing[2]/outspacing[2] + 0.5)

    #设定重采样的一些参数
    resampler = sitk.ResampleImageFilter()
    resampler.SetTransform(transform)
    resampler.SetInterpolator(sitk.sitkLinear)
    resampler.SetOutputOrigin(vol.GetOrigin())
    resampler.SetOutputSpacing(outspacing)
    resampler.SetOutputDirection(vol.GetDirection())
    resampler.SetSize(outsize)
    newvol = resampler.Execute(vol)
    return newvol    

def main():
    #读文件
    vol = sitk.Image(sitk.ReadImage("input.mha"))

    #重采样
    newvol = resampleVolume([1,1,1],vol)

    #写文件
    wriiter = sitk.ImageFileWriter()
    wriiter.SetFileName("output.mha")
    wriiter.Execute(newvol)

Referencia: Remuestreo de imágenes médicas

Supongo que te gusta

Origin blog.csdn.net/juluwangriyue/article/details/123723564
Recomendado
Clasificación