<div class="gmail_quote">On Mon, Oct 25, 2010 at 10:43 AM, Karthik Krishnan <span dir="ltr">&lt;<a href="mailto:karthik.krishnan@kitware.com">karthik.krishnan@kitware.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="gmail_quote"><div><div></div><div class="h5">On Mon, Oct 25, 2010 at 3:49 AM, David Doria <span dir="ltr">&lt;<a href="mailto:daviddoria@gmail.com" target="_blank">daviddoria@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div>I don&#39;t believe the following will work. The idea is to pass an image to a function and smooth it &quot;in place&quot;.</div><div><br></div><div>ImageType::Pointer image = get image from somewhere...</div>
<div>SmoothImage(image);</div><div><br></div><div>where:</div><div><br></div><div>void SmoothImage(ImageType::Pointer image)</div><div>{</div><div> // Create and setup a mean filter</div>
<div> typedef itk::MeanImageFilter&lt;</div><div><span style="white-space: pre-wrap;">                </span>  ImageType, ImageType &gt;  filterType;</div><div> </div><div>  filterType::Pointer meanFilter = filterType::New();</div>
<div>  meanFilter-&gt;SetInput(image);</div><div>  meanFilter-&gt;Update();</div><div><br></div><div>  image = meanFilter-&gt;GetOutput();</div><div>}</div><div><br></div><div>Of course you can do this:</div><div><br></div>


<div><div>ImageType::Pointer image = get image from somewhere...</div><div>ImageType::Pointer output = ImageType::Pointer::New();</div>
<div>SmoothImage(image, output);</div></div><div><br></div><div>void SmoothImage(ImageType::Pointer image, ImageType::Pointer output)</div><div><div>{</div><div> // Create and setup a mean filter</div><div> typedef itk::MeanImageFilter&lt;</div>


<div><span style="white-space: pre-wrap;">                </span>  ImageType, ImageType &gt;  filterType;</div><div> </div><div>  filterType::Pointer meanFilter = filterType::New();</div><div>  meanFilter-&gt;SetInput(image);</div>
<div>  meanFilter-&gt;Update();</div><div><br></div><div>  output = meanFilter-&gt;GetOutput();</div><div>}</div></div></blockquote></div></div><div><br><br>That&#39;s not an inplace processing of the data. What is being done above is to allocate the output buffer, in addition to the input buffer - executing the filter - and then taking a reference the newly created output buffer into the variable &quot;output&quot;.<br>

<br>You might as well just set ReleaseDataFlagOn() on the meanFilter. That way, the memory footprint remains the same as above, and the code is cleaner. Its input gets released after a downstream filter has consumed its output.<br>

<br>A in-place filter overwrites its input buffer. The snippet below should do that<br><br>  meanFilter-&gt;SetInput(image);<br>  meanFilter-&gt;GraftOutput(image);<br>  meanFilter-&gt;Update();<br><br></div></div></blockquote>
</div><br>Ascertain this by printing the image object to and after execution.. something like:<br><br>  meanFilter-&gt;SetInput(image);<br>  meanFilter-&gt;GraftOutput(image);<br><br>  meanFilter-&gt;GetInput()-&gt;Print(std::cout);<br>
<div>  meanFilter-&gt;Update();<br>  meanFilter-&gt;GetOutput()-&gt;Print(std::cout);<br><br>... and the internal PixelContainer object on the input as well as the output should (hopefully :) ) have the same address.<br></div>