<div dir="ltr">Hi Matt,<div><br></div><div style>Many thanks for your reply. It&#39;s a pity. When using SetImportPointer on the Output works, it saves having to duplicate the output in memory, which for an image can be large. :/</div>
<div style><br></div><div style>Best regards,</div><div style><br></div><div style>Ramon.</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On 26 May 2013 02:33, Matt McCormick <span dir="ltr">&lt;<a href="mailto:matt.mccormick@kitware.com" target="_blank">matt.mccormick@kitware.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Ramon,<br>
<br>
The approach of using SetImportPointer on the Output is not guaranteed<br>
to work.  The assumption is that the ImageToImageFilter is creating<br>
its Output.  It is more reliable to copy the produced Output to the<br>
buffer.<br>
<br>
HTH,<br>
Matt<br>
<div><div class="h5"><br>
On Fri, May 24, 2013 at 7:16 PM, Ramón Casero Cañas &lt;<a href="mailto:rcasero@gmail.com">rcasero@gmail.com</a>&gt; wrote:<br>
&gt; Hi all,<br>
&gt;<br>
&gt; I think there may be some problem with some of the itk::ImageToImageFilter<br>
&gt; when one tries to graft a C++ array to be used as the filter&#39;s output, or at<br>
&gt; least with the way I do it.<br>
&gt;<br>
&gt; This was kindly reported by Peter Thalmann in [1], and I&#39;m trying to help<br>
&gt; him. This is a problem that I had also noticed with a couple of other<br>
&gt; filters.<br>
&gt;<br>
&gt; I have attached a minimal example of a C++ MEX file that creates a function<br>
&gt; that can be run from Matlab, with the CMake files to compile it. (I have<br>
&gt; tried this with ITK 4.3.1).<br>
&gt;<br>
&gt; Save everything to directory test, and then build the example from the shell<br>
&gt;<br>
&gt; cd test<br>
&gt; mkdir bin<br>
&gt; cd bin<br>
&gt; cmake ..<br>
&gt; make install<br>
&gt;<br>
&gt; To run the example from Matlab,<br>
&gt;<br>
&gt; cd test<br>
&gt; % create a test binary square with a little hole<br>
&gt; im = zeros(15, 15, &#39;uint8&#39;);<br>
&gt; im(3:13, 3:13) = 1;<br>
&gt; im(7:8, 7) = 0;<br>
&gt; im2 = itk_test(im);<br>
&gt;<br>
&gt; This runs filter itk::VotingBinaryIterativeHoleFillingImageFilter on the<br>
&gt; image. The program outputs to the Matlab shell both the content of<br>
&gt; filter-&gt;GetOutput(), and the content of the Matlab output array. As we can<br>
&gt; see, the output is not being saved to the array<br>
&gt;<br>
&gt; Filter result, reading from the filter<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; Filter result, reading from the Matlab output array<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt;<br>
&gt;<br>
&gt; But this approach works for other filters. If we choose the Median filter<br>
&gt; instead: in ItkTestSimpleImFilter.cpp, ucomment<br>
&gt;<br>
&gt;   // typedef itk::MedianImageFilter&lt;ImageType, ImageType&gt;<br>
&gt;   //   FilterType;<br>
&gt;<br>
&gt; and comment out<br>
&gt;<br>
&gt;   typedef itk::VotingBinaryIterativeHoleFillingImageFilter&lt;ImageType&gt;<br>
&gt;     FilterType;<br>
&gt;<br>
&gt; [...]<br>
&gt;<br>
&gt;   // filter parameters only for the<br>
&gt; VotingBinaryIterativeHoleFillingImageFilter<br>
&gt;   filter-&gt;SetMaximumNumberOfIterations(4);<br>
&gt;   filter-&gt;SetBackgroundValue(0);<br>
&gt;   filter-&gt;SetForegroundValue(1);<br>
&gt;   filter-&gt;SetMajorityThreshold(2);<br>
&gt;<br>
&gt; then we can see that the array is actually being used as the filter&#39;s output<br>
&gt;<br>
&gt;&gt;&gt; im2 = itk_test(im);<br>
&gt; Filter result, reading from the filter<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; Filter result, reading from the Matlab output array<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0<br>
&gt; 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br>
&gt;<br>
&gt; I have been looking at itkVotingBinaryIterativeHoleFillingImageFilter.hxx,<br>
&gt; and I was wondering whether the problem is in<br>
&gt; VotingBinaryIterativeHoleFillingImageFilter&lt; TInputImage &gt;<br>
&gt; ::GenerateData().<br>
&gt;<br>
&gt; The filter works iteratively, doing<br>
&gt;<br>
&gt;   while ( m_CurrentNumberOfIterations &lt; m_MaximumNumberOfIterations )<br>
&gt;     {<br>
&gt;     filter-&gt;SetInput(input);<br>
&gt;     filter-&gt;Update();<br>
&gt;<br>
&gt;     m_CurrentNumberOfIterations++;<br>
&gt;     progress.CompletedPixel();   // not really a pixel but an iteration<br>
&gt;     this-&gt;InvokeEvent( IterationEvent() );<br>
&gt;<br>
&gt;     const unsigned int numberOfPixelsChangedInThisIteration =<br>
&gt;       filter-&gt;GetNumberOfPixelsChanged();<br>
&gt;     m_NumberOfPixelsChanged += numberOfPixelsChangedInThisIteration;<br>
&gt;<br>
&gt;     output = filter-&gt;GetOutput();<br>
&gt;     output-&gt;DisconnectPipeline();<br>
&gt;     input = output;<br>
&gt;     if ( numberOfPixelsChangedInThisIteration == 0 )<br>
&gt;       {<br>
&gt;       break;<br>
&gt;       }<br>
&gt;     }<br>
&gt;   this-&gt;GraftOutput(output);<br>
&gt;<br>
&gt;<br>
&gt; Here, output gets a DisconnectPipeline(). I have tried commenting that like<br>
&gt; out, rebuilding and reinstalling ITK, but it doesn&#39;t seem to make a<br>
&gt; difference.<br>
&gt;<br>
&gt; [1]<br>
&gt; <a href="https://groups.google.com/forum/?fromgroups#!topic/gerardus-users/pLH0iR0H74o" target="_blank">https://groups.google.com/forum/?fromgroups#!topic/gerardus-users/pLH0iR0H74o</a><br>
&gt;<br>
&gt; Best regards,<br>
&gt;<br>
&gt; Ramon.<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Dr. Ramón Casero Cañas<br>
&gt;<br>
&gt; Oxford e-Research Centre (OeRC)<br>
&gt; University of Oxford<br>
&gt; 7 Keble Rd<br>
&gt; Oxford OX1 3QG<br>
&gt;<br>
&gt; tlf     +44 (0) 1865 610739<br>
&gt; web     <a href="http://www.cs.ox.ac.uk/people/Ramon.CaseroCanas" target="_blank">http://www.cs.ox.ac.uk/people/Ramon.CaseroCanas</a><br>
&gt; photos  <a href="http://www.flickr.com/photos/rcasero/" target="_blank">http://www.flickr.com/photos/rcasero/</a><br>
&gt;<br>
</div></div>&gt; _____________________________________<br>
&gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;<br>
&gt; Visit other Kitware open-source projects at<br>
&gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;<br>
&gt; Kitware offers ITK Training Courses, for more information visit:<br>
&gt; <a href="http://www.kitware.com/products/protraining.php" target="_blank">http://www.kitware.com/products/protraining.php</a><br>
&gt;<br>
&gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt; <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
&gt;<br>
&gt; Follow this link to subscribe/unsubscribe:<br>
&gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
&gt;<br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>Dr. Ramón Casero Cañas<br><br>Oxford e-Research Centre (OeRC)<br>University of Oxford<br>7 Keble Rd<br>Oxford OX1 3QG<br><br>tlf     +44 (0) 1865 610739<br>web     <a href="http://www.cs.ox.ac.uk/people/Ramon.CaseroCanas" target="_blank">http://www.cs.ox.ac.uk/people/Ramon.CaseroCanas</a><br>
photos  <a href="http://www.flickr.com/photos/rcasero/" target="_blank">http://www.flickr.com/photos/rcasero/</a>
</div>