<div dir="ltr">Hi all,<div><br></div><div style>I think there may be some problem with some of the itk::ImageToImageFilter when one tries to graft a C++ array to be used as the filter&#39;s output, or at least with the way I do it.</div>
<div style><br></div><div style>This was kindly reported by Peter Thalmann in [1], and I&#39;m trying to help him. This is a problem that I had also noticed with a couple of other filters.</div><div style><br></div><div style>
I have attached a minimal example of a C++ MEX file that creates a function that can be run from Matlab, with the CMake files to compile it. (I have tried this with ITK 4.3.1).</div><div style><br></div><div style>Save everything to directory test, and then build the example from the shell</div>
<div style><br></div><div style>cd test</div><div style>mkdir bin</div><div style>cd bin</div><div style>cmake ..</div><div style>make install</div><div style><br></div><div style>To run the example from Matlab,</div><div style>
<br></div><div style>cd test</div><div style>% create a test binary square with a little hole</div><div style><div>im = zeros(15, 15, &#39;uint8&#39;);</div><div>im(3:13, 3:13) = 1;</div><div>im(7:8, 7) = 0;</div><div>im2 = itk_test(im);<br>
</div></div><div><br></div><div style>This runs filter itk::VotingBinaryIterativeHoleFillingImageFilter on the image. The program outputs to the Matlab shell both the content of filter-&gt;GetOutput(), and the content of the Matlab output array. As we can see, the output is not being saved to the array</div>
<div style><br></div><div style><div>Filter result, reading from the filter</div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div>
<div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div>
<div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>Filter result, reading from the Matlab output array</div>
<div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div>
<div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div>
<div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div></div><div style><br></div><div style><br></div><div style>But this approach works for other filters. If we choose the Median filter instead: in ItkTestSimpleImFilter.cpp, ucomment</div>
<div style><br></div><div style><div>  // typedef itk::MedianImageFilter&lt;ImageType, ImageType&gt;</div><div>  //   FilterType;</div><div><br></div><div style>and comment out</div><div style><br></div><div style><div>  typedef itk::VotingBinaryIterativeHoleFillingImageFilter&lt;ImageType&gt;</div>
<div>    FilterType;</div></div></div><div><br></div><div>[...]</div><div><br></div><div><div>  // filter parameters only for the VotingBinaryIterativeHoleFillingImageFilter</div><div>  filter-&gt;SetMaximumNumberOfIterations(4);</div>
<div>  filter-&gt;SetBackgroundValue(0);</div><div>  filter-&gt;SetForegroundValue(1);</div><div>  filter-&gt;SetMajorityThreshold(2);</div><div><br></div><div style>then we can see that the array is actually being used as the filter&#39;s output</div>
<div style><br></div><div style><div>&gt;&gt; im2 = itk_test(im);</div><div>Filter result, reading from the filter</div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 </div>
<div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div>
<div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div>
<div>Filter result, reading from the Matlab output array</div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div>
<div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div>
<div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 </div><div>0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div><div>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 </div></div><div><br></div>
<div style>I have been looking at itkVotingBinaryIterativeHoleFillingImageFilter.hxx, and I was wondering whether the problem is in VotingBinaryIterativeHoleFillingImageFilter&lt; TInputImage &gt;</div><div>::GenerateData().</div>
<div><br></div><div style>The filter works iteratively, doing</div><div style><br></div><div style><div>  while ( m_CurrentNumberOfIterations &lt; m_MaximumNumberOfIterations )</div><div>    {</div><div>    filter-&gt;SetInput(input);</div>
<div>    filter-&gt;Update();</div><div><br></div><div>    m_CurrentNumberOfIterations++;</div><div>    progress.CompletedPixel();   // not really a pixel but an iteration</div><div>    this-&gt;InvokeEvent( IterationEvent() );</div>
<div><br></div><div>    const unsigned int numberOfPixelsChangedInThisIteration =</div><div>      filter-&gt;GetNumberOfPixelsChanged();</div><div>    m_NumberOfPixelsChanged += numberOfPixelsChangedInThisIteration;</div>
<div><br></div><div>    output = filter-&gt;GetOutput();</div><div>    output-&gt;DisconnectPipeline();</div><div>    input = output;</div><div>    if ( numberOfPixelsChangedInThisIteration == 0 )</div><div>      {</div><div>
      break;</div><div>      }</div><div>    }</div><div>  this-&gt;GraftOutput(output);</div><div><br></div><div><br></div><div style>Here, output gets a DisconnectPipeline(). I have tried commenting that like out, rebuilding and reinstalling ITK, but it doesn&#39;t seem to make a difference.</div>
<div style><br></div><div style>[1] <a href="https://groups.google.com/forum/?fromgroups#!topic/gerardus-users/pLH0iR0H74o">https://groups.google.com/forum/?fromgroups#!topic/gerardus-users/pLH0iR0H74o</a></div><div style>
<br></div><div style>Best regards,</div><div style><br></div><div style>Ramon.</div></div><div><br></div><div><br></div><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></div>