<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"var\(--jp-code-font-family\)";}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML - vooraf opgemaakt Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.HTML-voorafopgemaaktChar
        {mso-style-name:"HTML - vooraf opgemaakt Char";
        mso-style-priority:99;
        mso-style-link:"HTML - vooraf opgemaakt";
        font-family:"Courier New";}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:1623658212;
        mso-list-type:hybrid;
        mso-list-template-ids:-768442358 -1 68354051 68354053 68354049 68354051 68354053 68354049 68354051 68354053;}
@list l0:level1
        {mso-level-start-at:0;
        mso-level-number-format:bullet;
        mso-level-text:-;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-font-family:"Times New Roman";}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style></head><body lang=NL link=blue vlink="#954F72" style='word-wrap:break-word'><div class=WordSection1><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Dear all,</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I’m quite new to Python (and the use of RTK and ITK), but I have a project for which I want to create digitally reconstructed radiographs (DRRs) of a CT. I therefore have successfully installed RTK for python and I have run the FirstReconstruction.py example. Now I want to edit this so that it is possible to create DRRs, thus forwardprojection. </p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I have read in the archives of RTK-users and people are mostly directed towards the C++ code <a href="https://github.com/SimonRit/RTK/blob/b32cffdc6f9d7a432c50023c370ed996a7985b69/applications/rtkforwardprojections/rtkforwardprojections.cxx">https://github.com/SimonRit/RTK/blob/b32cffdc6f9d7a432c50023c370ed996a7985b69/applications/rtkforwardprojections/rtkforwardprojections.cxx</a> for forward projections. However, I find this very hard to read since I don’t know C++ so I hope you can help. I have also read <a href="https://discourse.itk.org/t/itk-to-rtk-migration-forward-projection-issues-questions/2107">https://discourse.itk.org/t/itk-to-rtk-migration-forward-projection-issues-questions/2107</a> regarding this matter, but I cannot reproduce this.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>What I do in my code:</p><ul style='margin-top:0cm' type=disc><li class=MsoListParagraph style='margin-left:0cm;mso-list:l0 level1 lfo1'>Load 3D CT image and change it to float Image Type ( sitk.sitkFloat32)</li><li class=MsoListParagraph style='margin-left:0cm;mso-list:l0 level1 lfo1'>Define the image type I want for DRR</li><li class=MsoListParagraph style='margin-left:0cm;mso-list:l0 level1 lfo1'>Create a stack of empty projection images using ConstantImageSource, using ImageType of DRR</li><li class=MsoListParagraph style='margin-left:0cm;mso-list:l0 level1 lfo1'>Define the RTK geometry object (ThreeDCircularProjectionGeometry)</li><li class=MsoListParagraph style='margin-left:0cm;mso-list:l0 level1 lfo1'>Then create JosephForwardProjectionImageFilter</li></ul><p class=MsoNormal>Here, the problems arise.</p><p class=MsoNormal>The filter only seems to accept 3D imageTypes, so I have given it the [itk.F,3], [itk.F,3] input.</p><p class=MsoNormal>Then, if I try to setInput(0) with constantImageSource.GetOutput(), it throws the error: </p><div><pre style='word-break:break-all'><span style='font-family:"var(--jp-code-font-family)",serif'><o:p> </o:p></span></pre><pre style='word-break:break-all'><span style='font-family:"var(--jp-code-font-family)",serif'>Expecting argument of type itkImageF3 or itkImageSourceIF3.<o:p></o:p></span></pre><pre style='word-break:break-all'><span style='font-family:"var(--jp-code-font-family)",serif'>Additional information:<o:p></o:p></span></pre><pre style='word-break:break-all'><span style='font-family:"var(--jp-code-font-family)",serif'>Wrong number or type of arguments for overloaded function 'itkImageToImageFilterIF3IF3_SetInput'.<o:p></o:p></span></pre></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Probably since I have used the ImageType of the DRR (2D) for the constantImageSource. </p><p class=MsoNormal>Additionally, it seems that the setInput(1) = CT also doesn’t work, maybe because I have used sitk.sitkFloat32) to get it to a float image?</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Does anyone know what I have to do here to solve this? And/or is there some python script available which does forward projection so I can have a look how it is done in Python?</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I also don’t know what I would have to do after this step. Do I just do an FDK reconstruction etc. just as in the FirstReconstruction.py script?</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thank you in advance for anyone who can answer (some) of my questions.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>M</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>My code:</p><p class=MsoNormal>import sys</p><p class=MsoNormal>import itk</p><p class=MsoNormal>from itk import RTK as rtk</p><p class=MsoNormal>import SimpleITK as sitk</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal># Utility method that either downloads data from the Girder repository or</p><p class=MsoNormal># if already downloaded returns the file name for reading from disk (cached data).</p><p class=MsoNormal>%run update_path_to_download_script</p><p class=MsoNormal>from downloaddata import fetch_data as fdata</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal># Always write output to a separate directory, we don't want to pollute the source directory. </p><p class=MsoNormal>import os</p><p class=MsoNormal>OUTPUT_DIR = 'Output_test'</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal># Loading 3D CT image</p><p class=MsoNormal>CT = sitk.ReadImage(fdata("training_001_ct.mha"), sitk.sitkFloat32)</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal># Defines the image type CT</p><p class=MsoNormal>Dimension_CT = 3</p><p class=MsoNormal>PixelType = itk.F</p><p class=MsoNormal>ImageType_CT = itk.Image[PixelType, Dimension_CT]</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal># Defines the image type DRR</p><p class=MsoNormal>Dimension_DRR = 2</p><p class=MsoNormal>ImageType_DRR = itk.Image[PixelType, Dimension_DRR]</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal># Create a stack of empty projection images</p><p class=MsoNormal>ConstantImageSourceType = rtk.ConstantImageSource[ImageType_DRR]</p><p class=MsoNormal>constantImageSource = ConstantImageSourceType.New()</p><p class=MsoNormal># Define origin, sizeOutput and spacing (still need to change these)</p><p class=MsoNormal>origin = [ -127, -127]</p><p class=MsoNormal>sizeOutput = [ 512, 512]</p><p class=MsoNormal>spacing = [ 0.653595, 2.0]</p><p class=MsoNormal>constantImageSource.SetOrigin( origin )</p><p class=MsoNormal>constantImageSource.SetSpacing( spacing )</p><p class=MsoNormal>constantImageSource.SetSize( sizeOutput )</p><p class=MsoNormal>constantImageSource.SetConstant(0.)</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal># Defines the RTK geometry object</p><p class=MsoNormal>geometry = rtk.ThreeDCircularProjectionGeometry.New()</p><p class=MsoNormal>numberOfProjections = 360</p><p class=MsoNormal>firstAngle = 0.</p><p class=MsoNormal>angularArc = 360.</p><p class=MsoNormal>sid = 600 # source to isocenter distance</p><p class=MsoNormal>sdd = 1200 # source to detector distance</p><p class=MsoNormal>for x in range(0,numberOfProjections):</p><p class=MsoNormal>  angle = firstAngle + x * angularArc / numberOfProjections</p><p class=MsoNormal>  geometry.AddProjection(sid,sdd,angle)</p><p class=MsoNormal>    </p><p class=MsoNormal># Writing the geometry to disk</p><p class=MsoNormal>xmlWriter = rtk.ThreeDCircularProjectionGeometryXMLFileWriter.New()</p><p class=MsoNormal>xmlWriter.SetFilename ( sys.argv[2] )</p><p class=MsoNormal>xmlWriter.SetObject ( geometry )</p><p class=MsoNormal>xmlWriter.WriteFile()</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>REIType = rtk.JosephForwardProjectionImageFilter[ImageType_CT, ImageType_CT]</p><p class=MsoNormal>rei = REIType.New()</p><p class=MsoNormal>semiprincipalaxis = [ 50, 50, 50]</p><p class=MsoNormal>center = [ 0, 0, 10]</p><p class=MsoNormal># Set GrayScale value, axes, center...</p><p class=MsoNormal>#rei.SetDensity(2)</p><p class=MsoNormal>#rei.SetAngle(0)</p><p class=MsoNormal>#rei.SetCenter(center)</p><p class=MsoNormal>#rei.SetAxis(semiprincipalaxis)</p><p class=MsoNormal>rei.SetGeometry( geometry )</p><p class=MsoNormal>rei.SetInput(0, constantImageSource.GetOutput())</p><p class=MsoNormal>rei.SetInput(1, CT)</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>