RTKConsortium / RTK

Reconstruction Toolkit
Apache License 2.0
246 stars 145 forks source link

how to convert numpy array to input of FDKConeBeamReconstructionFilter ? #560

Closed hyaihjq closed 1 year ago

hyaihjq commented 1 year ago

!/usr/bin/env python

import sys import itk import numpy as np from itk import RTK as rtk from crip.io import imreadRaws import SimpleITK as sitk

############ 2、投影数据 ############ projections = imreadRaws(raw_dir, 640, 640, dtype=np.uint16) projections = projections[20:557] projections = np.transpose(projections, (1,2,0)) projections = np.float64(projections)

projections = projections[:, :, ::-1]

####################################

Defines the image type

ImageType = itk.Image[itk.F,3]

Defines the RTK geometry object

geometry = rtk.ThreeDCircularProjectionGeometry.New() numberOfProjections = 537 firstAngle = 0. angularArc = 360. sid = 433. # source to isocenter distance sdd = 660. # source to detector distance

isox = -34.3 # X coordinate on the projection image of isocenter

isoy = -40.64 # Y coordinate on the projection image of isocenter

for x in range(0,numberOfProjections): angle = firstAngle + x * angularArc / numberOfProjections geometry.AddProjection(sid,sdd,angle)

geometry.AddProjection(sid,sdd,angle,isox,isoy)

Create a stack of empty projection images

ConstantImageSourceType = rtk.ConstantImageSource[ImageType]

constantImageSource = ConstantImageSourceType.New()

origin = [ -34.3, -40.64, 0. ]

sizeOutput = [ 640, 640, numberOfProjections ]

spacing = [ 0.254, 0.254, 0.254 ]

constantImageSource.SetOrigin( origin )

constantImageSource.SetSpacing( spacing )

constantImageSource.SetSize( sizeOutput )

constantImageSource.SetConstant(0.)

output = constantImageSource.GetOutput()

projections_sitk = sitk.GetImageFromArray(projections) origin = [ -34.3, -40.64, 0. ] spacing = [ 0.254, 0.254, 0.254 ] projections_sitk.SetOrigin(origin) projections_sitk.SetSpacing(spacing)

Create reconstructed image

ConstantImageSourceType = rtk.ConstantImageSource[ImageType] constantImageSource2 = ConstantImageSourceType.New() sizeOutput = [ 672, 672, 448 ] origin = [ 0, 0, 0 ] spacing = [ 0.223, 0.223, 0.201 ] constantImageSource2.SetOrigin( origin ) constantImageSource2.SetSpacing( spacing ) constantImageSource2.SetSize( sizeOutput ) constantImageSource2.SetConstant(0.)

FDK reconstruction

print("Reconstructing...") FDKCPUType = rtk.FDKConeBeamReconstructionFilter[ImageType] feldkamp = FDKCPUType.New() feldkamp.SetInput(0, constantImageSource2.GetOutput()) feldkamp.SetInput(1, projections_sitk) feldkamp.SetGeometry(geometry)

feldkamp.GetRampFilter().SetTruncationCorrection(0.0)

feldkamp.GetRampFilter().SetHannCutFrequency(0.0)

feldkamp.Update()

output = feldkamp.GetOutput() print(output.shape)

SimonRit commented 1 year ago

This does not seem to be an issue but a question for the mailing list: https://www.openrtk.org/RTK/project/contactus.html. Converting a numpy array to an image and back can be done with itk.image_from_array and itk.array_from_image.