es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Registro deformable de imagen Dicom.

Tengo archivos dicom para dos escaneos CT y registro deformable entre ellos. Me gustaría saber cómo puedo deformar un escaneo CT basado en el archivo de registro deformable:

Hasta ahora, he logrado extraer el campo de vectores de deformación del archivo dicom:

import pydicom, numpy as np 
from struct import unpack
ds = pydicom.read_file(fn) # fn: archivo dicom de deformación.
v = ds.DeformableRegistrationSequence[0].DeformableRegistrationGridSequence[0].VectorGridData
values = unpack(f"<{len(v) // 4}f", v)
dim = B.GridDimensions
nx, ny, nz  = (dim[0],dim[1],dim[2]) # número de voxels en dirección x, y, z
# extraer el dx, dy, dz según https://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.20.3.html#sect_C.20.3.1.3
dx3d = values[0::3]
dy3d = values[1::3]
dz3d = values[2::3]
dx = np.reshape(dx3d,[nz,ny,nx])
dy = np.reshape(dy3d,[nz,ny,nx])
dz = np.reshape(dz3d,[nz,ny,nx])

Puedo graficar el campo de deformación en cada corte CT como se puede ver en la imagen debajo.

imagen

Entonces, la tarea restante es cómo deformar los datos CT basados en los vectores de deformación (dx, dy, dz).

Muchas gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para deformar un escáner CT basado en los vectores de deformación extraídos del archivo DICOM, necesitarás usar un algoritmo de transformación que tenga en cuenta los vectores de deformación en cada voxel del volumen CT original.

    Un enfoque común para hacer esto es usar el algoritmo “demons”, el cual es un método de registro deformable no paramétrico bien conocido que opera deformando iterativamente una imagen para que coincida con otra. El algoritmo trabaja adaptando iterativamente un campo de deformación hasta que alinea la imagen objetivo con la imagen de referencia.

    Para realizar la deformación usando el algoritmo demons, puedes usar la biblioteca SimpleITK en Python, la cual proporciona una interfaz fácil de usar para las tareas de registro de imágenes, incluyendo el algoritmo demons. Aquí hay un ejemplo de fragmento de código para mostrar cómo deformar un escáner CT usando los vectores de deformación en Python:

    import SimpleITK as sitk
    
    # Lee el escáner CT original como un objeto sitk.Image
    original_image = sitk.ReadImage('original_ct_scan.dcm')
    
    # Lee los vectores de deformación
    dx, dy, dz = # carga los arreglos dx, dy, dz desde tu archivo DICOM
    
    # Crea el campo de deformación como un objeto sitk.Image
    deformation_field = sitk.Image(original_image.GetSize(), sitk.sitkVectorFloat32, 3)
    deformation_field.SetSpacing(original_image.GetSpacing())
    deformation_field.SetOrigin(original_image.GetOrigin())
    deformation_field.SetDirection(original_image.GetDirection())
    
    # Llena el campo de deformación con los vectores de deformación
    deformation_field_arr = sitk.GetArrayFromImage(deformation_field)
    deformation_field_arr[..., 0] = dx
    deformation_field_arr[..., 1] = dy
    deformation_field_arr[..., 2] = dz
    deformation_field = sitk.GetImageFromArray(deformation_field_arr)
    
    # Deforma la imagen original usando el algoritmo demons y el campo de deformación
    deformed_image = sitk.DemonRegistration(original_image, original_image, deformation_field)
    
    # Guarda la imagen deformada como un nuevo archivo DICOM
    sitk.WriteImage(deformed_image, 'deformed_ct_scan.dcm')
    

    En el código anterior, primero leemos el escáner CT original como un objeto sitk.Image usando la función ReadImage de SimpleITK. Luego, cargamos los vectores de deformación del archivo DICOM y creamos un nuevo objeto sitk.Image para contener el campo de deformación. Llenamos el campo de deformación con los vectores de deformación y usamos la función DemonRegistration de SimpleITK para deformar la imagen original usando el algoritmo demons y el campo de deformación. Finalmente, guardamos la imagen deformada como un nuevo archivo DICOM usando la función WriteImage.

    Ten en cuenta que el código anterior asume que los vectores de deformación ya están alineados con la cuadrícula de la imagen y que la imagen original y el campo de deformación tienen el mismo tamaño y espaciado. Si no es así, deberás volver a muestrear el campo de deformación o la imagen original para que coincidan con su geometría.

Comments are closed.