Yeah, it&#39;s probably the direction cosines.  One thing that one has to keep in mind when using the B-spline filter is that the output is an image in terms of implementation output.  However, that image, for algorithmic purposes, is defined in terms of its parametric coordinates which really have no notion of directionality in physical space.  So although one can set the directions for the output of the filter, internally the filter does nothing with that information.  It simply passes it to the output.  It&#39;s not a problem if you keep this in mind and handle it appropriately like, for example, the way you&#39;re doing by resetting the directions and then performing your B-spline computations.  Let me know how it goes. <div>

<br><br><div class="gmail_quote">On Wed, Apr 7, 2010 at 4:01 PM, Andriy Fedorov <span dir="ltr">&lt;<a href="mailto:fedorov@bwh.harvard.edu">fedorov@bwh.harvard.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

Hi Nick,<br>
<br>
I am debugging this right now.<br>
<br>
All of the points that I add to the filter are within the output<br>
domain, I do have an explicit check for this.<br>
<br>
Regarding the two suggestions you made:<br>
<br>
1) my data indeed has directional cosines that are not identity. Does<br>
this pose a problem for the filter? In principle, it is not essential<br>
to keep non-identity for the output volume, since all voxels will be<br>
interpolated anyway. Maybe I should try resetting directions for the<br>
output, if everything fails.<br>
<br>
2) I actually checked the index that corresponds to the point that<br>
causes the error, it is [265, 197, 241], while the output size is<br>
[286, 241, 274], so it&#39;s not on the boundary. Perhaps directions is<br>
indeed the root of the problem...<br>
<br>
I will update the list if I have any significant progress.<br>
<br>
Thanks<br>
<br>
--<br>
Andriy Fedorov, Ph.D.<br>
<br>
Research Fellow<br>
Brigham and Women&#39;s Hospital<br>
Harvard Medical School<br>
75 Francis Street<br>
Boston, MA 02115 USA<br>
<a href="mailto:fedorov@bwh.harvard.edu">fedorov@bwh.harvard.edu</a><br>
<div><div></div><div class="h5"><br>
<br>
<br>
On Wed, Apr 7, 2010 at 15:50, Nick Tustison &lt;<a href="mailto:ntustison@wustl.edu">ntustison@wustl.edu</a>&gt; wrote:<br>
&gt; It looks like the size of your output image is too small.  When you set up<br>
&gt; the image domain (size, spacing, etc.) in the B-spline filter, you need to<br>
&gt; make sure that all of the points that constitute the input to that filter<br>
&gt; are within that domain.  Some of the related bugs that have bitten me in the<br>
&gt; past are 1) dealing with image data with non-identity directional cosines<br>
&gt; and 2) round-off errors such that the point is right on one of the<br>
&gt; boundaries.  Let me know if that helps.<br>
&gt;<br>
&gt; On Wed, Apr 7, 2010 at 2:03 PM, Andriy Fedorov &lt;<a href="mailto:fedorov@bwh.harvard.edu">fedorov@bwh.harvard.edu</a>&gt;<br>
&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Nick,<br>
&gt;&gt;<br>
&gt;&gt; I am getting the following error trying to implement this approach:<br>
&gt;&gt;<br>
&gt;&gt; itk::ERROR: PointSetToImageFilter(0x39c0dc0): The reparameterized<br>
&gt;&gt; point component 1.00002 is outside the corresponding parametric domain<br>
&gt;&gt; of [0, 1].<br>
&gt;&gt;<br>
&gt;&gt; Here&#39;s the relevant part of my code:<br>
&gt;&gt;<br>
&gt;&gt; ----&gt;<br>
&gt;&gt;<br>
&gt;&gt;  ConstIterType it1(image1, image1-&gt;GetBufferedRegion());<br>
&gt;&gt;<br>
&gt;&gt;  PointSetType::Pointer pointSet = PointSetType::New();<br>
&gt;&gt;  unsigned long numPoints = 0;<br>
&gt;&gt;<br>
&gt;&gt;  InputImageType::SizeType imageSize =<br>
&gt;&gt; image1-&gt;GetBufferedRegion().GetSize();<br>
&gt;&gt;  std::cout &lt;&lt; &quot;Processing image1. Size: &quot; &lt;&lt; imageSize &lt;&lt; std::endl;<br>
&gt;&gt;<br>
&gt;&gt;  for(it1.GoToBegin();!it1.IsAtEnd();++it1){<br>
&gt;&gt;    PointSetType::PointType pt;<br>
&gt;&gt;    InputImageType::PointType ipt;<br>
&gt;&gt;    InputImageType::IndexType idx;<br>
&gt;&gt;    PointDataType ptData;<br>
&gt;&gt;<br>
&gt;&gt;    image1-&gt;TransformIndexToPhysicalPoint(it1.GetIndex(), ipt);<br>
&gt;&gt;    if(!output-&gt;TransformPhysicalPointToIndex(ipt, idx))<br>
&gt;&gt;      continue;<br>
&gt;&gt;<br>
&gt;&gt;    pt[0] = ipt[0];<br>
&gt;&gt;    pt[1] = ipt[1];<br>
&gt;&gt;    pt[2] = ipt[2];<br>
&gt;&gt;<br>
&gt;&gt;    ptData[0] = it1.Get();<br>
&gt;&gt;<br>
&gt;&gt;    pointSet-&gt;SetPoint(numPoints, pt);<br>
&gt;&gt;    pointSet-&gt;SetPointData(numPoints, ptData);<br>
&gt;&gt;    numPoints++;<br>
&gt;&gt;  }<br>
&gt;&gt;<br>
&gt;&gt;  std::cout &lt;&lt; &quot;Total number of points: &quot; &lt;&lt; numPoints &lt;&lt; std::endl;<br>
&gt;&gt;<br>
&gt;&gt;  std::cout &lt;&lt; &quot;Output image: &quot; &lt;&lt; output &lt;&lt; std::endl;<br>
&gt;&gt;<br>
&gt;&gt;  SDAFilterType::Pointer sda = SDAFilterType::New();<br>
&gt;&gt;  SDAFilterType::ArrayType ncps;<br>
&gt;&gt;  ncps.Fill(4);<br>
&gt;&gt;  sda-&gt;SetSplineOrder(3);<br>
&gt;&gt;  sda-&gt;SetNumberOfControlPoints(ncps);<br>
&gt;&gt;  sda-&gt;SetNumberOfLevels(1);<br>
&gt;&gt;  sda-&gt;SetOrigin(output-&gt;GetOrigin());<br>
&gt;&gt;  sda-&gt;SetSpacing(output-&gt;GetSpacing());<br>
&gt;&gt;  sda-&gt;SetDirection(output-&gt;GetDirection());<br>
&gt;&gt;  sda-&gt;SetSize(output-&gt;GetBufferedRegion().GetSize());<br>
&gt;&gt;  sda-&gt;SetInput(pointSet);<br>
&gt;&gt;  sda-&gt;Update();<br>
&gt;&gt;<br>
&gt;&gt; &lt;----<br>
&gt;&gt;<br>
&gt;&gt; Any suggestions what I may be doing wrong to cause this error? I would<br>
&gt;&gt; appreciate any hints.<br>
&gt;&gt;<br>
&gt;&gt; Andriy Fedorov<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Tue, Apr 6, 2010 at 17:59, Nicholas Tustison &lt;<a href="mailto:ntustison@gmail.com">ntustison@gmail.com</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt; &gt; You&#39;re right about the implementation although, if you had segmentation<br>
&gt;&gt; &gt; masks for each input image you could trim the input by only using the voxels<br>
&gt;&gt; &gt; within the mask.  Since you are implementing it anyway, make sure that your<br>
&gt;&gt; &gt; point set ordering consists of all the points from one image followed by all<br>
&gt;&gt; &gt; the points from the second image, etc.   The processing will go faster that<br>
&gt;&gt; &gt; way.  Let me know if you have any additional questions.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; On Apr 6, 2010, at 4:48 PM, Andriy Fedorov wrote:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; On Tue, Apr 6, 2010 at 14:45, Nick Tustison &lt;<a href="mailto:ntustison@wustl.edu">ntustison@wustl.edu</a>&gt;<br>
&gt;&gt; &gt;&gt; wrote:<br>
&gt;&gt; &gt;&gt;&gt; Hi Andriy,<br>
&gt;&gt; &gt;&gt;&gt; Have you thought about using the<br>
&gt;&gt; &gt;&gt;&gt; itkBSplineScatteredDataPointSetToImageFilter?<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Hi Nick,<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Yes, I did think about this.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; However, the volumes are quite large, and, if I understand correctly<br>
&gt;&gt; &gt;&gt; how this will be implemented, I would need to add voxel<br>
&gt;&gt; &gt;&gt; coordinates/value pair for each voxel in each of the image to the<br>
&gt;&gt; &gt;&gt; point set to initialize the bspline filter. Please correct me if I am<br>
&gt;&gt; &gt;&gt; wrong. I was wondering, if there is an approach, which would just take<br>
&gt;&gt; &gt;&gt; an arbitrary number of images, and would do interpolation by reading<br>
&gt;&gt; &gt;&gt; directly from those images.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Perhaps such filter can be derived from the functionality already<br>
&gt;&gt; &gt;&gt; present in itkBSplineScatteredDataPointSetToImageFilter.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; In any case, I am working on implementing the approach based on your<br>
&gt;&gt; &gt;&gt; filter right now. Let&#39;s see how this goes.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Thanks for the reply!<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; AF<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; Nick<br>
&gt;&gt; &gt;&gt;&gt; On Tue, Apr 6, 2010 at 1:40 PM, Andriy Fedorov<br>
&gt;&gt; &gt;&gt;&gt; &lt;<a href="mailto:fedorov@bwh.harvard.edu">fedorov@bwh.harvard.edu</a>&gt;<br>
&gt;&gt; &gt;&gt;&gt; wrote:<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; Hi,<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; I have several MRI volumes of the same anatomy, which have been<br>
&gt;&gt; &gt;&gt;&gt;&gt; spatially aligned. These volumes have been acquired using different<br>
&gt;&gt; &gt;&gt;&gt;&gt; (orthogonal) acquisition direction, so they have thick slices, but in<br>
&gt;&gt; &gt;&gt;&gt;&gt; orthogonal planes with respect to each other.  I would like to<br>
&gt;&gt; &gt;&gt;&gt;&gt; construct one volume, which would essentially combine the input<br>
&gt;&gt; &gt;&gt;&gt;&gt; volumes, interpolate over the multiple input volumes to produce an<br>
&gt;&gt; &gt;&gt;&gt;&gt; image of better resolution.<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; Is there something in ITK that could be used to help me in solving<br>
&gt;&gt; &gt;&gt;&gt;&gt; this problem? It seems I need to do some sort of weighted averaging<br>
&gt;&gt; &gt;&gt;&gt;&gt; over the neighboring voxels from the input volumes. Can anyone<br>
&gt;&gt; &gt;&gt;&gt;&gt; suggest<br>
&gt;&gt; &gt;&gt;&gt;&gt; how to approach this problem?<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; Thanks<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; Andriy Fedorov<br>
&gt;&gt; &gt;&gt;&gt;&gt; _____________________________________<br>
&gt;&gt; &gt;&gt;&gt;&gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; Visit other Kitware open-source projects at<br>
&gt;&gt; &gt;&gt;&gt;&gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; Kitware offers ITK Training Courses, for more information visit:<br>
&gt;&gt; &gt;&gt;&gt;&gt; <a href="http://www.kitware.com/products/protraining.html" target="_blank">http://www.kitware.com/products/protraining.html</a><br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt;&gt; &gt;&gt;&gt;&gt; <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; Follow this link to subscribe/unsubscribe:<br>
&gt;&gt; &gt;&gt;&gt;&gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;<br>
&gt;<br>
</div></div></blockquote></div><br></div>