Hi, ref_CT_updated.nii.gz is still not oriented correctly, please check the RTK geometry doc more carefully. If I use the following lines CTDirection=np.zeros([3,3]) CTDirection[0,0]=1. CTDirection[1,2]=1. CTDirection[2,1]=1. CT.SetDirection(itk.matrix_from_array(CTDirection)) CT.SetOrigin([CT.GetOrigin()[0],CT.GetOrigin()[2],-CT.GetOrigin()[1]]) CTarray = itk.array_view_from_image(CT) CTarray += 1000
and set the outOfPlaneAngle to 0, the result looks more as expected. I advise you to avoid the nifti file format which has many issues according to ITK discussions on github, prefer mha or mhd. Simon On Wed, Nov 9, 2022 at 5:42 PM Isuru Suranga Wijesinghe < isurusuranga.wijesin...@gmail.com> wrote: > Hi Simon, > > Many thanks. I'm in need of some assistance once more please. > > First, I reoreinted the CT volume and used the field of view origin in the > corresponding real kV dicom file (i.e. with projection angle zero) to > adjust the correct field of view for projection angle zero (FOV origin > [116.368270874, 3.837730408]). I simply replace the default values of > projOffsetX and projOffsetY with the values shown below. > projOffsetY = -3.837730408 > > I simply rotated around the x-axis by setting the outOfPlaneAngle > parameter to 90 degrees. > > However, If I project through a 324 (degrees) projection angle (with FOV > origin [117.085998535, 3.948999882]), it will rotate in the worng axis. > For this step, I simply replace the gantryAngle parameter with 324 and set > the new projOffsetX and projOffsetY. > > I've attached the updated code, the reoriented CT volume, the correct DRR > at projection angle zero, and the incorrect DRR at projection angle 324. > > Can you assist me in resolving that error ? > > drr_0.png > <https://drive.google.com/file/d/1qOoMQ6jvOSY-7KivjmcLuAoIIMhBafmE/view?usp=drive_web> > drr_324.png > <https://drive.google.com/file/d/1RjT6_hGF2vkog3YNUfv-03RAmTClrSbK/view?usp=drive_web> > ref_CT_updated.nii.gz > <https://drive.google.com/file/d/1BntJvZ7JRF9kTxQsycB5JoipWVFESNQ_/view?usp=drive_web> > rtk_drr_projection_code.txt > <https://drive.google.com/file/d/1mEaIbj9NjuU5BZB4NKlmv0S9CUN0FME3/view?usp=drive_web> > > > > > On Wed, Nov 9, 2022 at 2:26 PM Simon Rit <simon....@creatis.insa-lyon.fr> > wrote: > >> Hi, >> The first input of JosephForwardProjectionImageFilter is the image in >> which you'll calculate the DRR, typically an empty projection (filled with >> zeros). In your code, this is computed with constantImageSource but you're >> setting the volume origin, spacing size which is probably wrong. For an >> Elekta projection (you showed an Elekta drawing), this would be >> constantImageSource.SetOrigin( [-204.4,-204.4,0] ) >> constantImageSource.SetSpacing( [0.8,0.8,0.8] ) >> constantImageSource.SetSize( [512, 512,1] ) >> Besides, for the CT volume you sent, point (0,0,0) mm is not in the image >> and this is the default center of rotation in RTK (see doc >> <http://www.openrtk.org/Doxygen/DocGeo3D.html>). Moreover the >> orientation is wrong. So either you change the origin and the direction to >> use RTK convention or you build your geometry differently, e.g. by setting >> source center, detector origin position and detector u v coordinates: >> geometry.AddProjection([-57.,20.+sid,25.],[-57+115.,20.+sid-sdd >> ,25.],[1.,1.,0.],[0.,0.,1.]) >> where the coordinates (-57,28,25) are those of a point somewhere in the >> center of the patient. This will give you line integrals, I don't know what >> is the content of your png file but you might have to take the exponential >> to have something close to real data. you also have to add 1000 to yourCT >> numbers to put air at 0. >> In short, read the geometry doc and don't expect us to be able to match >> exactly the DRR you sent... This will require some work on your side >> Cheers, >> Simon >> >> On Wed, Nov 9, 2022 at 11:32 AM Isuru Suranga Wijesinghe < >> isurusuranga.wijesin...@gmail.com> wrote: >> >>> Can I ask any possible solution to my issue please (I just want to get >>> the DRR with the limited FOV based on the machine parameters attached >>> above) ??? >>> >>> On Tue, Nov 8, 2022 at 2:12 PM Isuru Suranga Wijesinghe < >>> isurusuranga.wijesin...@gmail.com> wrote: >>> >>>> In addition to that I want to generate DRRs with a limited field of >>>> view as attached in the sample real kV Xray image. >>>> I've included a sample CT volume that I'm currently using to generate >>>> such DRR images using the machine parameters. Please assist in resolving >>>> this matter. Thank you in advance for your consideration and time. >>>> >>>> ref_CT_volume.nii.gz >>>> <https://drive.google.com/file/d/1PilfGAhqWe-NFD4Up1CYwSHqDXns04CV/view?usp=drive_web> >>>> sample_real_kv_xray.png >>>> <https://drive.google.com/file/d/1zX2HUEEL4-lGxS4daDrhXuhTy1uFBY89/view?usp=drive_web> >>>> >>>> >>>> On Tue, Nov 8, 2022 at 11:23 AM Isuru Suranga Wijesinghe < >>>> isurusuranga.wijesin...@gmail.com> wrote: >>>> >>>>> Hi, >>>>> >>>>> I have a 3D-CT volume and want to obtain the DRR projection by >>>>> adjusting the machine parameters as shown in the image below. >>>>> >>>>> Here's my code, and I didn't get the expected DRRs with the limited >>>>> FOV. Is there anything missing from the parameter setup? >>>>> >>>>> Could you please assist me in resolving this issue? Any code level >>>>> assistance or advice would be greatly appreciated. >>>>> >>>>> # Loading 3D CT image >>>>> CT = itk.imread("./ct.nii.gz", pixel_type=itk.F) >>>>> >>>>> # Defines the image type >>>>> Dimension_CT = 3 >>>>> PixelType = itk.F >>>>> ImageType = itk.Image[PixelType, Dimension_CT] >>>>> >>>>> origin_x, origin_y, origin_z = CT.GetOrigin() >>>>> space_x, space_y, space_z = CT.GetSpacing() >>>>> >>>>> # Define origin, sizeOutput and spacing (still need to change these) >>>>> origin = [origin_x, origin_y, origin_z] >>>>> spacing = [space_x, space_y, space_z] >>>>> >>>>> sizeOutput = [ 512, 512, 1] >>>>> >>>>> # Create a stack of empty projection images >>>>> ConstantImageSourceType = rtk.ConstantImageSource[ImageType] >>>>> constantImageSource = ConstantImageSourceType.New() >>>>> >>>>> constantImageSource.SetOrigin( origin ) >>>>> constantImageSource.SetSpacing( spacing ) >>>>> constantImageSource.SetSize( sizeOutput ) >>>>> constantImageSource.SetConstant(0.) >>>>> >>>>> # Defines the RTK geometry object >>>>> geometry = rtk.ThreeDCircularProjectionGeometry.New() >>>>> firstAngle = 0. >>>>> angularArc = 360. >>>>> sid = 1000 # source to isocenter distance >>>>> sdd = 1536 # source to detector distance >>>>> gantryAngle = 0. # rot around y-axis >>>>> projOffsetX = 0. >>>>> projOffsetY = 0. >>>>> outOfPlaneAngle = 90. # rot around x-axis >>>>> inPlaneAngle = 0. # rot around z-axis >>>>> sourceOffsetX = 0. >>>>> sourceOffsetY = 0. >>>>> geometry.AddProjection(sid, sdd, gantryAngle) >>>>> >>>>> REIType = rtk.JosephForwardProjectionImageFilter[ImageType, ImageType] >>>>> rei = REIType.New() >>>>> >>>>> rei.SetGeometry( geometry ) >>>>> rei.SetInput(0, constantImageSource.GetOutput()) >>>>> rei.SetInput(1, CT) >>>>> rei.Update() >>>>> >>>>> Dimension = 3 >>>>> OutputPixelType = itk.UC >>>>> OutputImageType = itk.Image[OutputPixelType, Dimension] >>>>> >>>>> RescaleType = itk.RescaleIntensityImageFilter[ImageType, >>>>> OutputImageType] >>>>> rescaler = RescaleType.New() >>>>> rescaler.SetOutputMinimum(0) >>>>> rescaler.SetOutputMaximum(255) >>>>> rescaler.SetInput(rei.GetOutput()) >>>>> rescaler.Update() >>>>> >>>>> WriteType = itk.ImageFileWriter[OutputImageType] >>>>> writer = WriteType.New() >>>>> writer.SetFileName('./drr_0.png') >>>>> writer.SetInput(rescaler.GetOutput()) >>>>> writer.Update() >>>>> >>>>> >>>>> _______________________________________________ >>> Rtk-users mailing list >>> Rtk-users@public.kitware.com >>> https://public.kitware.com/cgi-bin/mailman/listinfo/rtk-users >>> >>
_______________________________________________ Rtk-users mailing list Rtk-users@public.kitware.com https://public.kitware.com/cgi-bin/mailman/listinfo/rtk-users