<html><head><meta http-equiv="Content-Type" content="text/html charset=iso-8859-1"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hello Jianxu,<div><br></div><div>I only have a brief moment to give a couple suggestions. I hope it's enough to get you pointed in the right direction.</div><div><br></div><div>ITK's&nbsp;HessianRecursiveGaussianImageFilter is not streamable.</div><div><br></div><div>Your streaming pipeline is not correct. You should print the progress of the filters to observe the streaming as the filters are running to know if you have it is correct.</div><div><br></div><div>If you are using win64, then make sure you compile ITK with 64BIT IDS, is should be a cmake flag.</div><div><br></div><div>I wrote a discrete hessian filter here:</div><div><br></div><div><a href="https://github.com/blowekamp/itkLocalDiscreteHessian">https://github.com/blowekamp/itkLocalDiscreteHessian</a></div><div><br></div><div>You should be able to clone that repository into to ITK's&nbsp;Modules/External/ to build and use it.</div><div><br></div><div>Consider using the following pipeline:</div><div><br></div><div>ImageReader-&gt;SmoothingRecursiveGaussian-&gt;DiscreteHessian-&gt;Objectness-&gt;ImageWriter</div><div><br></div><div>To get the pipeline to stream you should be able to just write out to an mha file, and use ImageWriter's SetNumberOfStreamDivisions method.</div><div><br></div><div>I advice to begin with a small image and make sure you have a streaming pipeline then work towards the larges.</div><div><br></div><div>Good luck, I hope this is enough to get you pointed in the right direction.</div><div><br></div><div>Brad</div><div><br><div><div>On Nov 10, 2012, at 3:03 PM, Jianxu Chen &lt;<a href="mailto:jchen16@nd.edu">jchen16@nd.edu</a>&gt; wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Hello Kevin,<div><br></div><div>Could you give me a little more details about how to use StreamingImageFilter()? I tried it &nbsp;with the following code. But the error "Failed to Allocate Memory For Image" still happened. I don't have much experience in ITK. Maybe the streaming filter is employed in an incorrect way.</div>
<div><br></div><div>The pipeline is&nbsp;ImageReader() --&gt; StreamingFilter() --&gt; HessianFilter() --&gt; HessianToObjectnessFilter() --&gt; ImageWriter()</div><div><br></div><div>Here is part of the code:</div><div><br></div>
<div><div>typedef itk::StreamingImageFilter&lt;InputImageType, InputImageType&gt; StreamingFilterType;</div><div>StreamingFilterType::Pointer streaming = StreamingFilterType::New();</div><div>streaming-&gt;SetInput(imageReader-&gt;GetOutput());</div>
<div>streaming-&gt;SetNumberOfStreamDivisions(8);</div><div><br></div><div>typedef itk::HessianRecursiveGaussianImageFilter&lt; InputImageType &gt; HessianMatrixFilterType;</div><div><div>HessianMatrixFilterType::Pointer hessianMatrix = HessianMatrixFilterType::New();</div>
<div>hessianMatrix-&gt;SetInput(streaming-&gt;GetOutput());</div></div><div><br></div><div>typedef itk::HessianToObjectnessMeasureImageFilter&lt; HessianMatrixFilterType::OutputImageType,OutputImageType &gt; ObjectnessFilterType;</div>
<div><div>ObjectnessFilterType::Pointer objectnessFilter = ObjectnessFilterType::New();</div><div>objectnessFilter-&gt;SetInput(hessianMatrix-&gt;GetOutput());</div></div><div>** Next, Set the parameter for ObjectnessFilter **</div>
<div>** Finally, Submit to Image Writer **</div><div><br></div><div>Thanks a lot for your help.</div><div>Jianxu Chen</div><div><br></div><br><div class="gmail_quote">On Tue, Nov 6, 2012 at 9:39 AM, Jianxu Chen <span dir="ltr">&lt;<a href="mailto:jchen16@nd.edu" target="_blank">jchen16@nd.edu</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><span style="color:rgb(34,34,34);font-size:13.333333969116211px;font-family:arial,sans-serif">Hello Kevin,</span></div>
<div><span style="color:rgb(34,34,34);font-size:13.333333969116211px;font-family:arial,sans-serif"><br>
</span></div><div><span style="color:rgb(34,34,34);font-size:13.333333969116211px;font-family:arial,sans-serif">Really appreciate your suggestion. I found that &nbsp;"</span><span style="color:rgb(34,34,34);font-size:13.333333969116211px;font-family:arial,sans-serif">SetNumberOfStreamDivisions" is really powerful when handling large data.</span></div>

<div><span style="color:rgb(34,34,34);font-size:13.333333969116211px;font-family:arial,sans-serif"><br></span></div><div><span style="color:rgb(34,34,34);font-size:13.333333969116211px;font-family:arial,sans-serif">For the Hessian Matrix Filter, I noticed that this problem had already been discussed via the maillist in 2008.</span></div>

<div><span style="color:rgb(34,34,34);font-size:13.333333969116211px;font-family:arial,sans-serif"><br></span></div><div><span style=""><font color="#222222" face="arial, sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.itk.org/pipermail/insight-users/2008-June/026328.html" target="_blank">http://www.itk.org/pipermail/insight-users/2008-June/026328.html</a></font></span></div>

<div><span style=""><font color="#222222" face="arial, sans-serif"><br></font></span></div><div><span style=""><font color="#222222" face="arial, sans-serif">Some tests were conducted there. It showed that it might fail to allocate memory for the Hessian matrix even when there should be enough space theoretically.&nbsp;</font></span></div>

<div><span style=""><font color="#222222" face="arial, sans-serif"><br></font></span></div><div><span style=""><font color="#222222" face="arial, sans-serif">Anyway, your suggestion of using&nbsp;</font></span><span style="color:rgb(34,34,34);font-size:13.333333969116211px;font-family:arial,sans-serif">SetNumberOfStreamDivisions is very useful. My problem can be solved.&nbsp;</span></div>

<div><span style="color:rgb(34,34,34);font-size:13.333333969116211px;font-family:arial,sans-serif"><br></span></div><div><span style="color:rgb(34,34,34);font-size:13.333333969116211px;font-family:arial,sans-serif">Thanks again for your help.</span></div>
<span class="HOEnZb"><font color="#888888">
<div><font color="#222222" face="arial, sans-serif">Jianxu Chen</font></div></font></span><div class="HOEnZb"><div class="h5"><br><div class="gmail_quote">On Tue, Nov 6, 2012 at 9:26 AM, Kevin H. Hobbs <span dir="ltr">&lt;<a href="mailto:hobbsk@ohio.edu" target="_blank">hobbsk@ohio.edu</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>On 11/04/2012 03:50 PM, Jianxu Chen wrote:<br>
&gt; Hello,<br>
&gt;<br>
&gt; I encountered a weird problem when computing the Hessian Matrix of a 3D<br>
&gt; image stack.<br>
&gt;<br>
&gt; I used HessianRecursiveGaussianImageFilter to compte the Hessian matrix.<br>
&gt; However, this filter only works well when the image is very very small.<br>
&gt;<br>
&gt; My data is a 1024*1024*30 image stack. When calling<br>
&gt; HessianRecursiveGaussianImageFilter to calculate the Hessian matrix, the<br>
&gt; system cannot allocate the memory space for it. Thus, I cut my data into<br>
&gt; a 350*350*30 image stack. The program works well. My computer has a 8GB<br>
&gt; RAM and is a 64-bit machine. I am wondering why the system fails to<br>
&gt; allocate the memory for the filter. There should be enough usable RAM in<br>
&gt; the machine.<br>
<br>
</div>If your data are unsigned char : 1024*1024*100 / 2^20 = 100 MiB.<br>
If your data are floats : 1024*1024*100 * 4 / 2^20 = 400 MiB.<br>
If your data are doubles : 1024*1024*100 * 8 / 2^20 = 800 MiB.<br>
<br>
The Hessian matrix is symmetric so only 6 values are required :<br>
&nbsp; &nbsp; &nbsp; &nbsp; 1024*1024*100 * 8 * 6 / 2^30 = 4.69 GiB.<br>
<br>
If you have a long pipeline your image could be in memory in many places.<br>
<div><br>
&gt;<br>
&gt; My data is at least 1024*1024*30, sometimes even 1024*1024*100. And I<br>
&gt; have to compute the Hessian matrix in my algorithm. What should I do in<br>
&gt; this case? Could you give my some advice? Really appreciate your help.<br>
&gt;<br>
<br>
</div>Shorten your pipeline. Reader =&gt; Filter =&gt; Writer.<br>
<br>
Set the ReleaseDataFlag or GlobalReleaseDataFlag so that filters free<br>
their data after satisfying downstream requests.<br>
<br>
Stream your pipeline :<br>
&nbsp; &nbsp; &nbsp; &nbsp; writer-&gt;SetNumberOfStreamDivisions( n );<br>
<br>
<br>
</blockquote></div><br>
</div></div></blockquote></div><br></div>
_____________________________________<br>Powered by <a href="http://www.kitware.com">www.kitware.com</a><br><br>Visit other Kitware open-source projects at<br><a href="http://www.kitware.com/opensource/opensource.html">http://www.kitware.com/opensource/opensource.html</a><br><br>Kitware offers ITK Training Courses, for more information visit:<br>http://www.kitware.com/products/protraining.php<br><br>Please keep messages on-topic and check the ITK FAQ at:<br>http://www.itk.org/Wiki/ITK_FAQ<br><br>Follow this link to subscribe/unsubscribe:<br>http://www.itk.org/mailman/listinfo/insight-users<br></blockquote></div><br></div></body></html>