<html xmlns:v="urn:schemas-microsoft-com:vml" 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=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@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;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri",sans-serif;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">Hi,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I am trying to modify the first reconstruction example to read a set of 16-bit grayscale TIFF projections that I captured, run the 3D reconstruction, and save the output. The projects are taken at 5 degree increments over a 180 degree arc.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">It runs without errors, but the reconstructed volume looks very strange which makes me think I am doing something wrong.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Here is the basic python code I am trying to use (modified from the example), if anyone can see what I might be doing wrong I would appreciate it.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># Defines the image type<o:p></o:p></p>
<p class="MsoNormal">ImageType = itk.Image[itk.F,3]<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># Defines the RTK geometry object<o:p></o:p></p>
<p class="MsoNormal">geometry = rtk.ThreeDCircularProjectionGeometry.New()<o:p></o:p></p>
<p class="MsoNormal">numberOfProjections = 37<o:p></o:p></p>
<p class="MsoNormal">firstAngle = 0.<o:p></o:p></p>
<p class="MsoNormal">angularArc = 185.<o:p></o:p></p>
<p class="MsoNormal">sid = 914 # source to isocenter distance (mm)<o:p></o:p></p>
<p class="MsoNormal">sdd = 1219 # source to detector distance (mm)<o:p></o:p></p>
<p class="MsoNormal">for x in range(0,numberOfProjections):<o:p></o:p></p>
<p class="MsoNormal"> angle = firstAngle + x * angularArc / numberOfProjections<o:p></o:p></p>
<p class="MsoNormal"> geometry.AddProjection(sid,sdd,angle)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Skipping some code … (file name list setup, geometry output writing) …<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">tiffio = itk.TIFFImageIO.New()<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">ProjectionsReaderType = rtk.ProjectionsReader[ImageType]<o:p></o:p></p>
<p class="MsoNormal">projectionsSource = ProjectionsReaderType.New()<o:p></o:p></p>
<p class="MsoNormal">projectionsSource.SetImageIO(tiffio)<o:p></o:p></p>
<p class="MsoNormal">projectionsSource.SetFileNames(fileNameList)<o:p></o:p></p>
<p class="MsoNormal">projOrigin = [ -0.14*(3072-1)/2, -0.14*(2560-1)/2, 0 ] #input images are 3072x2560 pixels with a 0.14mm pixel size<o:p></o:p></p>
<p class="MsoNormal">projSpacing = [ 0.14, 0.14, 1.0 ]<o:p></o:p></p>
<p class="MsoNormal">projectionsSource.SetOrigin( projOrigin )<o:p></o:p></p>
<p class="MsoNormal">projectionsSource.SetSpacing( projSpacing )<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">ConstantImageSourceType = rtk.ConstantImageSource[ImageType]<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># Create reconstructed image<o:p></o:p></p>
<p class="MsoNormal">constantImageSource2 = ConstantImageSourceType.New()<o:p></o:p></p>
<p class="MsoNormal">sizeOutput = [ 512, 512, 512 ]<o:p></o:p></p>
<p class="MsoNormal">origin = [ -255.5, -255.5, -255.5 ]<o:p></o:p></p>
<p class="MsoNormal">spacing = [ 1.0, 1.0, 1.0 ]<o:p></o:p></p>
<p class="MsoNormal">constantImageSource2.SetOrigin( origin )<o:p></o:p></p>
<p class="MsoNormal">constantImageSource2.SetSpacing( spacing )<o:p></o:p></p>
<p class="MsoNormal">constantImageSource2.SetSize( sizeOutput )<o:p></o:p></p>
<p class="MsoNormal">constantImageSource2.SetConstant(0.)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># FDK reconstruction<o:p></o:p></p>
<p class="MsoNormal">print("Reconstructing...")<o:p></o:p></p>
<p class="MsoNormal">FDKCPUType = rtk.FDKConeBeamReconstructionFilter[ImageType]<o:p></o:p></p>
<p class="MsoNormal">feldkamp = FDKCPUType.New()<o:p></o:p></p>
<p class="MsoNormal">feldkamp.SetInput(0, constantImageSource2.GetOutput()) # this is the template for the output image type<o:p></o:p></p>
<p class="MsoNormal">feldkamp.SetInput(1, projectionsSource.GetOutput()) # this is the projection stack from rtk.ProjectionsReader<o:p></o:p></p>
<p class="MsoNormal">feldkamp.SetGeometry(geometry)<o:p></o:p></p>
<p class="MsoNormal">feldkamp.GetRampFilter().SetTruncationCorrection(0.0)<o:p></o:p></p>
<p class="MsoNormal">feldkamp.GetRampFilter().SetHannCutFrequency(0.0)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># Writer<o:p></o:p></p>
<p class="MsoNormal">print("Writing output image...")<o:p></o:p></p>
<p class="MsoNormal">WriterType = rtk.ImageFileWriter[ImageType]<o:p></o:p></p>
<p class="MsoNormal">writer = WriterType.New()<o:p></o:p></p>
<p class="MsoNormal">writer.SetFileName(sys.argv[1])<o:p></o:p></p>
<p class="MsoNormal">writer.SetInput(feldkamp.GetOutput())<o:p></o:p></p>
<p class="MsoNormal">writer.Update()<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>