<div dir="ltr"><div>Answers below. I think you need to understand better the coordinate system of an ITK image, maybe check ITK's doc.<br></div>Simon<br><div><div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, May 15, 2016 at 2:38 PM, Tobias Stein <span dir="ltr"><<a href="mailto:tstein@stud.hs-heilbronn.de" target="_blank">tstein@stud.hs-heilbronn.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div link="blue" vlink="purple" lang="EN-US"><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">If I understood you correct, the input of the Joseph-Filter needs to be oriented in the y-direction when I am dealing with axial oriented slices.</span></p></div></div></blockquote><div>Yes, or in other words, if you want to take projections around the axial axis, be aware that y is the default axis of rotation in RTK.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div link="blue" vlink="purple" lang="EN-US"><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Now I changed the direction of the 3D Slice by rotating it 90 degrees around the x-axis with the itk::ChangeInformationImageFilter to have my slice in the xz-layer in the y-direction:<u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       double rotationX = 90;<u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       itk::Versor< double > rotation;<u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       const double angleInRadians = rotationX * vnl_math::pi / 180.0;<u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       rotation.SetRotationAroundX(angleInRadians);<u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       const ImageType::DirectionType direction = inputImage->GetDirection();<u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       const ImageType::DirectionType newDirection = direction * rotation.GetMatrix();<u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       changeFilter->SetOutputDirection(newDirection);<u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       changeFilter->ChangeAll();<u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       changeFilter->SetInput(inputImage);<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas">       changeFilter->UpdateOutputInformation();</span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Then I added a zero-border as you told me (This changed the size of my region from [512, 512, 1] to [514, 514, 3]).<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">While executing the Joseph Filter I got an error because a vector subscript was out of range. Maybe that’s because the index of the region is [-1,-1,-1] caused by the padding.</span></p></div></div></blockquote><div>That should not have been a problem but that might be a bug...<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div link="blue" vlink="purple" lang="EN-US"><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">I tried the padding after the Joseph Filter, and got a result which has a size [514, 3, 45], while 45 was the number of projection images but the image was still empty.</span></p></div></div></blockquote><div>I guess you should check the origin of your projected volume and your projections. A simple test is to center your volume (check using ITK doc how you can define the origin so that (0,0,0) is at the center) and your projection (for the projection stack, only the first 2 coordinates count).<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div link="blue" vlink="purple" lang="EN-US"><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">I also tried the Jospeh Filter with a real 3D volume stack of slices, rotated it as described below and got a result.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Now I am confused how I should create the geometry of the Joseph Filter to get a good result.<u></u><u></u></span></p><span class=""><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><u></u> <u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       typedef rtk::ThreeDCircularProjectionGeometry GeometryType;<u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       GeometryType::Pointer geometry = GeometryType::New();<u></u><u></u></span></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       for (unsigned int i = 0; i < NumberOfProjectionImages; i++)<u></u><u></u></span></p></span><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas">              geometry->AddProjection(300., 500., i * 180 / NumberOfProjectionImages);<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">I am trying to use a 180-degree rotation, but i don’t have the feeling for the distance values.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">I this code example I used an 3D Image with dimensions = [256, 256, 49]</span></p></div></div></blockquote><div>This doesn't tell you anything about the size of your volume, we also need the origin and the spacing. Look at the ITK doc to understand the ITK coordinate systems.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div link="blue" vlink="purple" lang="EN-US"><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">My idea was, since there is no way to get a result with a single 3D slice, I would use a stack of slices as input and slice the output volume in y-direction to get my sinogram as you said.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Tobias<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" lang="DE">Von:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" lang="DE"> <a href="mailto:simon.rit@gmail.com" target="_blank">simon.rit@gmail.com</a> [mailto:<a href="mailto:simon.rit@gmail.com" target="_blank">simon.rit@gmail.com</a>] <b>Im Auftrag von </b>Simon Rit<br><b>Gesendet:</b> Samstag, 14. Mai 2016 12:17</span></p><div><div class="h5"><br><b>An:</b> Tobias Stein <<a href="mailto:tstein@stud.hs-heilbronn.de" target="_blank">tstein@stud.hs-heilbronn.de</a>><br><b>Cc:</b> <a href="mailto:rtk-users@public.kitware.com" target="_blank">rtk-users@public.kitware.com</a><br><b>Betreff:</b> Re: [Rtk-users] forward and back projection - MITK<u></u><u></u></div></div><p></p><div><div class="h5"><p class="MsoNormal"><u></u> <u></u></p><div><div><div><p class="MsoNormal">The output of the Joseph filter (of any forward projector) is a stack of projection images, i.e., a 3D image. If you slice this 3D image in the z direction, you get one projection images. If you slice this 3D image in the y direction, you get a sinogram, e.g., the 2D sinogram of the central slice (plane of the source trajectory) if y=0. The best way to have this sinogram is to set <span style="font-size:9.5pt;font-family:Consolas">size[1]=1 </span>and there is no better way to do it in RTK.<u></u><u></u></p></div><p class="MsoNormal">For zero-padding, you need to set extendRegion[?]=1, with (for all dimensions, i.e., ?=0,1,2) and SetConstant(0). I'm surprised though that your image is a black square, something else must be going on. One thing to remember, the typical RTK rotation is around the y axis so your 3D slice must be 1 in the y direction. A simple way to change the orientation of one slice is to change its direction with ChangeImageFilter<u></u><u></u></p></div><p class="MsoNormal">Simon<u></u><u></u></p><div><div><p class="MsoNormal"><u></u> <u></u></p></div></div></div><div><p class="MsoNormal"><u></u> <u></u></p><div><p class="MsoNormal">On Sat, May 14, 2016 at 11:48 AM, Tobias Stein <<a href="mailto:tstein@stud.hs-heilbronn.de" target="_blank">tstein@stud.hs-heilbronn.de</a>> wrote:<u></u><u></u></p><blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm"><div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Hello Simon,</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Thanks for your advice so far. I’m getting to know this filter better. At least I can now use it and save the result into a file.</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">I updated my code which now uses a volume.</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">The values of the input and output volume are equal except of the z-dimension of the output which I changed to the number of projection images.</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">                </span><span style="font-size:9.5pt;font-family:Consolas">const unsigned int Dimension = 3;</span><u></u><u></u></p><p class="MsoNormal" style="text-indent:36.0pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">…Reading image…</span><u></u><u></u></p><p class="MsoNormal" style="text-indent:36.0pt;text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">ImageType::Pointer inputImage = reader->GetOutput();</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       ImageType::Pointer outputImage = ImageType::New();</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       RegionType inputRegion = inputImage->GetLargestPossibleRegion();</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       const unsigned int NumberOfProjectionImages = 45;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       ImageType::IndexType start;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       start[0] = inputRegion.GetIndex()[0];</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       start[1] = inputRegion.GetIndex()[1];</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       start[2] = inputRegion.GetIndex()[2];</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       RegionType::SizeType size;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       size[0] = inputRegion.GetSize()[0];</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       size[1] = inputRegion.GetSize()[1];</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       size[2] = NumberOfProjectionImages;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       RegionType region;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       region.SetSize(size);</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       region.SetIndex(start);</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       ImageType::SpacingType spacing;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       spacing[0] = inputImage->GetSpacing()[0];</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       spacing[1] = inputImage->GetSpacing()[1];</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       spacing[2] = inputImage->GetSpacing()[2];</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       ImageType::PointType origin;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       origin[0] = inputImage->GetOrigin()[0];</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       origin[1] = inputImage->GetOrigin()[1];</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       origin[2] = inputImage->GetOrigin()[2];</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       outputImage->SetRegions(region);</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       outputImage->SetSpacing(spacing);</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       outputImage->SetOrigin(origin);</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       outputImage->Allocate();</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas">       outputImage->FillBuffer(size[0] * size[1] * size[2]);</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:gainsboro;background:black"> </span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       // Geometry</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       typedef rtk::ThreeDCircularProjectionGeometry GeometryType;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       GeometryType::Pointer geometry = GeometryType::New();</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       for (unsigned int i = 0; i < NumberOfProjectionImages; i++)</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas">              geometry->AddProjection(510., 510., i*8.);</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       typedef  rtk::JosephForwardProjectionImageFilter<ImageType, ImageType> ForwardType;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       ForwardType::Pointer forward = ForwardType::New();</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       forward->SetInput(1, inputImage);</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       forward->SetInput(0, outputImage);</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       forward->SetGeometry(geometry);</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas">       forward->Update();</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">I’m not sure how I have to add projection for the geometry to get a result which I’m familiar with.</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Can you describe how do I have to interpret the result of the Joseph-Filter? I am familiar with sinograms and how they are computed, but one sinogram is created by the projections of one image slice as far as I understood it. What I want is to manipulate the image in the radon space and then perform a filtered back projection. Typically the articles describe techniques to reduce metal artifacts by using one 2D Slice. Is it possible to achieve something like that with the JosephFilter? I’m guessing since this filter won’t work well for 2D I have to use another filter. Can you give me a hint if I can do something like that with RTK or another ITK-based framework? <a href="https://i.imgur.com/1yBz3o2.png" target="_blank">Here</a> a diagram which shows an example what I want to try.</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">I tried also to use my code with one slice and added a zero padding like that:</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       typedef itk::ConstantPadImageFilter <ImageType, ImageType> ConstantPadImageFilterType;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       ConstantPadImageFilterType::Pointer padFilter = ConstantPadImageFilterType::New();</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       padFilter->SetInput(inputImage);</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       ImageType::SizeType extendRegion;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       extendRegion[0] = 0;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       extendRegion[1] = 0;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       extendRegion[2] = 0;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       padFilter->SetPadLowerBound(extendRegion);</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       padFilter->SetPadUpperBound(extendRegion);</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       padFilter->SetConstant(1);</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas">       padFilter->Update();</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">But the result of my png is a black square.</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Tobias</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" lang="DE">Von:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" lang="DE"> <a href="mailto:simon.rit@gmail.com" target="_blank">simon.rit@gmail.com</a> [mailto:<a href="mailto:simon.rit@gmail.com" target="_blank">simon.rit@gmail.com</a>] <b>Im Auftrag von </b>Simon Rit<br><b>Gesendet:</b> Freitag, 13. </span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Mai 2016 18:15</span><u></u><u></u></p><div><div><p class="MsoNormal"><br><b>An:</b> Tobias Stein <<a href="mailto:tstein@stud.hs-heilbronn.de" target="_blank">tstein@stud.hs-heilbronn.de</a>><br><b>Cc:</b> <a href="mailto:rtk-users@public.kitware.com" target="_blank">rtk-users@public.kitware.com</a><br><b>Betreff:</b> Re: [Rtk-users] forward and back projection - MITK<u></u><u></u></p></div></div><div><div><p class="MsoNormal"> <u></u><u></u></p><div><div><div><div><div><p class="MsoNormal">Dear Tobias,<u></u><u></u></p></div><p class="MsoNormal">If you intialize the data of your itk::Image with FillBuffer with the corresponding constant value, it is quite similar. The constant image value allow us to stream the computation whereas you have to allocate the whole image if you pass directly itk::Image.<u></u><u></u></p></div><div><p class="MsoNormal">We only work in 3D and probably our projector don't work with 2D, that is probably the problem here. You would have to correct the code for 2D but that's a lot of work, we generally prefer pseudo 2D, see next point.<u></u><u></u></p></div><p class="MsoNormal">I doubt that our forward projector will work well with one slice only if you use 3D, we assume that the volume starts at the first pixel and ends at the last pixel. You should probably add a zero border around with itk::PadImage to see something.<u></u><u></u></p></div><p class="MsoNormal">To avoid aliasing, you can cut frequencies in the ramp filter (look for CutFrequency in the doxygen of rtk::FFTRampImageFilter).<u></u><u></u></p></div><p class="MsoNormal">Simon<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p><div><p class="MsoNormal">On Fri, May 13, 2016 at 5:35 PM, Tobias Stein <<a href="mailto:tstein@stud.hs-heilbronn.de" target="_blank">tstein@stud.hs-heilbronn.de</a>> wrote:<u></u><u></u></p><blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5.0pt"><div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Thanks for the information.</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">To keep it simple I want to project forward a single slice which I load as a DICOM file.</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Now I want to compute the sinogram of that slice and write it in a new file.</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">I got a little confused about the ConstantImageSource which is used in the test class. Do I need it to compute a sinogram or is just a replacement of a itk::Image?</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Here is my code so far:</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">                </span><span style="font-size:9.5pt;font-family:Consolas">const unsigned int Dimension = 2;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       typedef float PixelType;</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas">       </span><span style="font-size:9.5pt;font-family:Consolas" lang="DE">typedef itk::Image< PixelType, Dimension >      ImageType;</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" lang="DE">                </span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">…</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">                (reading image by itk::ImageFileReader which works)</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">                …</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       ImageType::Pointer inputImage = reader->GetOutput();</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       const unsigned int NumberOfProjectionImages = 1;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       ImageType::Pointer outputImage = ImageType::New();</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       typedef  rtk::JosephForwardProjectionImageFilter<ImageType, ImageType> ForwardType;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       ForwardType::Pointer forward = ForwardType::New();</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       forward->SetInput(1, inputImage);</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       forward->SetInput(0, outputImage);</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">       forward->Update();</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">                …</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">                (writing output image into a file)</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">                …</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">The problem is that I get some errors when I instantiate the forward-Filter.</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">The errors are like that one:</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" lang="DE">error C2784: "vnl_matrix<T> operator *(const vnl_diag_matrix<T> &,const vnl_matrix<T> &)": template-Argument für "const vnl_diag_matrix<T> &" konnte nicht von "vnl_matrix_fixed<T,4,4>" hergeleitet werden.</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" lang="DE"> </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Maybe there is something wrong with the PixelType that i used?</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">If the forward projection works, which filter should i use to achieve a filtered back projection without aliasing?</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> </span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" lang="DE">Many thanks in advance.</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" lang="DE">Tobias</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d" lang="DE"> </span><u></u><u></u></p><p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" lang="DE">Von:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" lang="DE"> </span><a href="mailto:simon.rit@gmail.com" target="_blank"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" lang="DE">simon.rit@gmail.com</span></a><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" lang="DE"> [mailto:</span><a href="mailto:simon.rit@gmail.com" target="_blank"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" lang="DE">simon.rit@gmail.com</span></a><span style="font-size:11.0pt;font-family:"Calibri",sans-serif" lang="DE">] <b>Im Auftrag von </b>Simon Rit<br><b>Gesendet:</b> Mittwoch, 4. </span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">Mai 2016 09:02<br><b>An:</b> Tobias Stein <</span><a href="mailto:tstein@stud.hs-heilbronn.de" target="_blank"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">tstein@stud.hs-heilbronn.de</span></a><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">><br><b>Cc:</b> </span><a href="mailto:rtk-users@public.kitware.com" target="_blank"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">rtk-users@public.kitware.com</span></a><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><br><b>Betreff:</b> Re: [Rtk-users] forward and back projection - MITK</span><u></u><u></u></p><div><div><p class="MsoNormal"> <u></u><u></u></p><div><div><div><div><div><div><div><div><div><div><p class="MsoNormal">Dear Tobias,<u></u><u></u></p></div><p class="MsoNormal">The forward projection has 2 inputs:<u></u><u></u></p></div><p class="MsoNormal">- input 0: the stack of projections in which you wish to forward project,<u></u><u></u></p></div><p class="MsoNormal">- input 1: the volume you wish to forward project.<u></u><u></u></p></div><p class="MsoNormal">For the backprojection, it's exactly the same:<u></u><u></u></p></div><p class="MsoNormal">- input 0: the volume in which you wish to backproject,<u></u><u></u></p></div><p class="MsoNormal">- input 1: the stack of projections you wish to backproject.<u></u><u></u></p></div><p class="MsoNormal">Be aware that JosephBackProjectionImageFilter is the transpose of the forward projection and will have some aliasing (see, e.g., <a href="http://iopscience.iop.org/article/10.1088/0031-9155/49/11/024/meta;jsessionid=87B598ABFDC2AA07D1DED2DEE607F0E7.c2.iopscience.cld.iop.org" target="_blank">De Man and Basu</a> to see what I mean).<u></u><u></u></p></div><p class="MsoNormal">I have personally never used MITK but don't hesitate to share your experience on the mailing list.<u></u><u></u></p></div><p class="MsoNormal">Simon<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p><div><p class="MsoNormal">On Wed, May 4, 2016 at 12:59 AM, Tobias Stein <<a href="mailto:tstein@stud.hs-heilbronn.de" target="_blank">tstein@stud.hs-heilbronn.de</a>> wrote:<u></u><u></u></p><blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5.0pt"><div><div><p class="MsoNormal">Hi all,<u></u><u></u></p><p class="MsoNormal"> <u></u><u></u></p><p class="MsoNormal">i want to use the forward and backward projection to reduce metal artefacts in ct images. I’ve seen so far that  I may use the JosephForwardProjectionImageFilter to perform the forward projection. I’ve also seen the test for this class but I don’t get it, where should i put my 2D slice as input to execute the transformation. About the back transformation with the JosephBackProjectionImageFilter I also need more information how I can use it to transform a sinogram back to a ct slice. There is a test at the documentation, but the link is missing there.<u></u><u></u></p><p class="MsoNormal"> <u></u><u></u></p><p class="MsoNormal">I’ve got another independent question.<u></u><u></u></p><p class="MsoNormal">Are some of you familiar with MITK and know how to get the superbuild up and running with RTK? I am writing a MITK-Plugin and want to reduce the metal artifacts before a segmentation. So if some of you have experience with the combination of RTK and MITK it would be nice if you will share it ;)<u></u><u></u></p><p class="MsoNormal"> <u></u><u></u></p><p class="MsoNormal">Best regards,<u></u><u></u></p><p class="MsoNormal">Tobias<u></u><u></u></p><p class="MsoNormal"> <u></u><u></u></p></div></div><p class="MsoNormal" style="margin-bottom:12.0pt"><br>_______________________________________________<br>Rtk-users mailing list<br><a href="mailto:Rtk-users@public.kitware.com" target="_blank">Rtk-users@public.kitware.com</a><br><a href="http://public.kitware.com/mailman/listinfo/rtk-users" target="_blank">http://public.kitware.com/mailman/listinfo/rtk-users</a><u></u><u></u></p></blockquote></div><p class="MsoNormal"> <u></u><u></u></p></div></div></div></div></div></blockquote></div><p class="MsoNormal"> <u></u><u></u></p></div></div></div></div></div></blockquote></div><p class="MsoNormal"><u></u> <u></u></p></div></div></div></div></div></blockquote></div><br></div></div></div></div>