<div dir="ltr"><div>Hi all,</div>
<div>I must say that it is very nice to see such an interest and assitance in this mailing list.</div>
<div>Just to comment Ivan&#39;s code before updating it in the itk repository,</div>
<div>We tried to use it before several monthes, and found that the order of the eigen values is not as in the itkHessian itk::HessianRecursiveGaussianImageFilter, which cause error during the computation of the vesselness measure.</div>

<div>Below is the mails from Ivan.</div>
<div>In current version Ivan fixed it. So please verify that you use the updated version of this work.</div>
<div>I&#39;ll try to use Ivan&#39;s code to generate a streamable vesselness filter.</div>
<div>Moti</div>
<div>&nbsp;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</div>

<div>&nbsp;</div>
<div>Hi Noah,<br>&nbsp;<br>I think I have fixed the issues with the class itk::DiscreteHessianGaussianImageFunction.<br>As you said, the individual derivatives were calculated correctly. The problem was that the order of derivatives was different from that in itk::HessianRecursiveGaussianImageFilter. Now that is fixed.<br>
&nbsp;<br>Regarding the differences in the dzz derivative, this should be zero for the datasets you used as the tube axis go in z direction. However, due to errors in the approximation of the gaussian kernels, the value is not exactly zero. I made some tests and the value of this derivative tends to zero as the MaximumError parameter decreases. The error in the first derivative dz is about 1e-6 for max_error = 0.005 and 1e-9 for max_error = 0.001. If we calculate the second derivative of a Gaussian there is a deep negative basin at zero so the error in dzz is negative and tends to be larger than in the first derivative due to this effect (about 1% for max_error =&nbsp; 0.005 I think).<br>
&nbsp;<br>The differences in magnitude arise from normalization etc. (unit integral normalization, across-scale normalization, spacing normalization). I don&#39;t think there is a problem there as derivatives are calculated in itk::GaussianOperator the same way. I didn&#39;t try with the eigenvalues and vectors, I will try to see if they make sense.<br>
&nbsp;<br>I uploaded a new patch release of the paper. You can get it at<br><a href="http://www.insight-journal.org/InsightJournalManager/view_reviews.php?back=publications.php%3Fjournalid%3D9%26order%3Drating%26revision_display%3Dcombined&amp;pubid=179">http://www.insight-journal.org/InsightJournalManager/view_reviews.php?back=publications.php%3Fjournalid%3D9%26order%3Drating%26revision_display%3Dcombined&amp;pubid=179</a><br>
&nbsp;<br>If you think the paper was useful, it would be nice if you could make a review. This is a simple process once you have tested the software and increases the chances that the code is incorporated into the toolkit.<br>
&nbsp;<br>Hope that helps<br>&nbsp;<br>Ivan<br>&nbsp;</div>
<div>&nbsp;</div>
<div>De: ???? ?????? [mailto:<a href="mailto:noahbroide@gmail.com">noahbroide@gmail.com</a>] <br>Enviado el: martes, 04 de marzo de 2008 11:27<br>Para: <a href="mailto:imacia@vicomtech.es">imacia@vicomtech.es</a><br>Asunto: Help with Hessian matrix generator per pixel<br>
&nbsp;<br>Hi Ivan,<br>&nbsp;<br>I am Trying to use your code for calculating the Hessian Matrix per specific pixel, Instead of generating The Hessian Matrix on a full image. <br>Your code was very Helpful, but I Think There might be a bug in it.<br>
&nbsp;<br>I was comparing the results of both your code (using&nbsp; ImageHessianEigenvalues3D.cxx) and the ITK Hessian filter (HessianRecursiveGaussianImageFilter) and seems like this is not giving the same results. <br>&nbsp;<br>I run both options on an artificial image (cylinders.vtk) output results for Hessian 2,3,4,5 (xz,yy,yz,zz) were different.<br>
please see images attached (both vtk and jpg)<br>&nbsp;<br>To be more specific, we checked the Hessian values for pixel = (20,18,33) and saw the different results as follows:<br>&nbsp;<br>&quot;Evaluate at index&quot; - your code:<br>
Hessian = [-0.755, -4.4e-09, -0.755, -1.8e-10, -3.31e-09, -0.0702]<br>Eigen Values = [-1.24, -1.8e-10, 0.416]</div>
<div>&quot;Full Hessian&quot; - ITK Hessian filter<br>Hessian = [ -0.232, 5.1e-17, -1.34e-37,-0.232, -0, 0]<br>Eigen values = [-0.232, -0.232, 0] <br>&nbsp;<br>Our conclusion that the bug is more likely to be in your code and not in ITK&#39;s code, is due to the Eigen values, that According to our tests, did come out as expected using ITK&#39;s code (Lambda1 = Lambda2) , since If you&#39;ll see the image, it is combined from Cylinders only, and for a pixel in a Cylinder, Lambda1 should be equal to Lambda2.<br>
&nbsp;<br>I am currently working on implementing RegionGrowing filter based on Hessian for a specific pixel, I would appreciate if you can help me get this code working well :)<br>&nbsp;<br>Thanks In Advance!<br>Noah Broide<br><br>
</div>
<div class="gmail_quote">On Mon, Oct 13, 2008 at 5:04 AM, Dan Mueller <span dir="ltr">&lt;<a href="mailto:dan.muel@gmail.com">dan.muel@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">Hi Karthik, Moti, others,<br><br>Out of interest, I am in the process of transferring Ivan&#39;s<br>contribution to the ITK Review folder: I already have the filters and<br>
some tests in my local copy, I just have to add a few more tests. I<br>expect to commit the files by week&#39;s end.<br><br>Regards, Dan<br><br>2008/10/12 Karthik Krishnan &lt;<a href="mailto:karthik.krishnan@kitware.com">karthik.krishnan@kitware.com</a>&gt;:<br>

<div>
<div></div>
<div class="Wj3C7c">&gt; Moti:<br>&gt;<br>&gt; Yes, you can make the hessian filters in ITK streamable. It has been on<br>&gt; my TODO list, since I have a need to detect needles in CT in realtime,<br>&gt; for which I&#39;d like to do a localized hessian analysis, which I cannot<br>
&gt; do with the existing framework.<br>&gt;<br>&gt; The Hessian filter in ITK, uses the RecursiveGaussianFilter to compute<br>&gt; scale-space derivatives (see Deriche). This is fast, however its an IIR<br>&gt; approximation of the gaussian and cannot be streamed.<br>
&gt;<br>&gt; ITK provides a discrete gaussian operator for smoothing, (approximated<br>&gt; from weighted sums of bessel functions). This is used in the<br>&gt; DiscreteGaussianImageFilter. These are streamable.<br>&gt;<br>
&gt; Ivan Macia, (see contribution on Insight-journal below [1]) has very<br>&gt; nicely provided implementation of operators for<br>&gt;<br>&gt; &nbsp;* Local gaussian derivatives using the discrete gaussian<br>&gt; &nbsp;* Local hessian using the above<br>
&gt;<br>&gt; They are provided both in the form of operators and image functions,<br>&gt; which you can quite trivially wrap into filters. These filters should<br>&gt; be streamable.<br>&gt;<br>&gt; Unfortunately, the RecursiveGaussian has been used as the<br>
&gt; building block for most filters in ITK, so at some point, I would<br>&gt; envision having duplicate filters using these.<br>&gt;<br>&gt; ------<br>&gt; [1] <a href="http://www.insight-journal.org/browse/publication/179" target="_blank">http://www.insight-journal.org/browse/publication/179</a><br>
&gt; &quot;Generalized Computation of Gaussian Derivatives Using ITK&quot;, Ivan<br>&gt; Macia, VICOMTech.<br>&gt;<br>&gt;<br>&gt; Thanks<br>&gt; --<br>&gt; Karthik Krishnan<br>&gt; R&amp;D Engineer,<br>&gt; Kitware Inc.<br>
&gt; Ph: 518 371 3971 x119<br>&gt; Fax: 518 371 3971<br>&gt;<br>&gt;<br>&gt; On Sun, Oct 12, 2008 at 1:55 AM, Moti Freiman &lt;<a href="mailto:freiman@cs.huji.ac.il">freiman@cs.huji.ac.il</a>&gt; wrote:<br>&gt;&gt; Hi Luis,<br>
&gt;&gt; Thanks for your detailed answer.<br>&gt;&gt; According to your answer, the Hessian filter itself is not streamable,<br>&gt;&gt; However, the main cause for memory insufficient is this filter,<br>&gt;&gt; since it produces images that are 6-times (in 3D) larger than the original<br>
&gt;&gt; file.<br>&gt;&gt; If I&#39;m right, streaming the &nbsp;EigenAnalysisFilter and the vesselness will not<br>&gt;&gt; solve the problem of large files. ?<br>&gt;&gt; Moti<br>&gt;&gt;<br>&gt;&gt; On Mon, Oct 6, 2008 at 3:34 PM, Luis Ibanez &lt;<a href="mailto:luis.ibanez@kitware.com">luis.ibanez@kitware.com</a>&gt; wrote:<br>
&gt;&gt;&gt;<br>&gt;&gt;&gt; Hi Moti,<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; Looking at the code of this filter, the piece that looks suspicious is<br>&gt;&gt;&gt; the internal use of the Symmetric Eigen Analysis filter.<br>&gt;&gt;&gt;<br>
&gt;&gt;&gt; Both of these filters should be able to stream data, but, in the way<br>&gt;&gt;&gt; they are nested, the EigenAnalysys filter may be trying to update the<br>&gt;&gt;&gt; entire image unnecessarily.<br>&gt;&gt;&gt;<br>
&gt;&gt;&gt; Please try the following:<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; 1) Remove the EigenAnalysisFilter from inside the<br>&gt;&gt;&gt; &nbsp; itkHessianSmoothed3DToVesselnessMeasureImageFilter<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; 2) create a sequential pipeline where you connect:<br>
&gt;&gt;&gt;<br>&gt;&gt;&gt; &nbsp; Hessian --&gt; Symm.EigenAnalysis --&gt; VesselnessFilter<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; The Hessian filter itself is not streamable, but the<br>&gt;&gt;&gt; Symm.EigenAnalysis and the Vesselness ones, are both<br>
&gt;&gt;&gt; pixel-wise filter, and they should be streamable.<br>&gt;&gt;&gt;<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; Please let us know if you encounter any problem.<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; BTW: Once we sort this out, it will be great if you<br>
&gt;&gt;&gt; &nbsp; &nbsp; could add the conclusions of your observations<br>&gt;&gt;&gt; &nbsp; &nbsp; as a review to this paper, and if you found it<br>&gt;&gt;&gt; &nbsp; &nbsp; useful, we could try moving this contribution<br>&gt;&gt;&gt; &nbsp; &nbsp; to the Review directory, in order to include it<br>
&gt;&gt;&gt; &nbsp; &nbsp; with the upcoming release of ITK 3.10.<br>&gt;&gt;&gt;<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; &nbsp;Regards,<br>&gt;&gt;&gt;<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; &nbsp; &nbsp; Luis<br>&gt;&gt;&gt;<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; ---------------------<br>
&gt;&gt;&gt; Moti Freiman wrote:<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; Hi,<br>&gt;&gt;&gt;&gt; I want to compute a vesselness measure on a large CT volume (512*512*512,<br>&gt;&gt;&gt;&gt; 16bit per voxel) using the<br>
&gt;&gt;&gt;&gt; itkHessianSmoothed3DToVesselnessMeasureImageFilter<br>&gt;&gt;&gt;&gt; published in the InsightJournal<br>&gt;&gt;&gt;&gt; (<a href="http://www.insight-journal.org/browse/publication/163" target="_blank">http://www.insight-journal.org/browse/publication/163</a>).<br>
&gt;&gt;&gt;&gt; Since my machine memory is limited I tried to use the<br>&gt;&gt;&gt;&gt; itkStreamingImageFilter &nbsp;to divide the computation for several small parts<br>&gt;&gt;&gt;&gt; which do not require so much memory, and then merge them.<br>
&gt;&gt;&gt;&gt; However it seems that the streaming filter do not divide the computation<br>&gt;&gt;&gt;&gt; using the itkHessianSmoothed3DToVesselnessMeasureImageFilter.<br>&gt;&gt;&gt;&gt; Any reason, idea?<br>&gt;&gt;&gt;&gt; Thanks,<br>
&gt;&gt;&gt;&gt; Moti<br>&gt;&gt;&gt;&gt; --<br>&gt;&gt;&gt;&gt; __<br>&gt;&gt;&gt;&gt; Moti Freiman, Ph.D Student.<br>&gt;&gt;&gt;&gt; Medical Image Processing and Computer-Assisted Surgery Laboratory.<br>&gt;&gt;&gt;&gt; School of Computer Science and Engineering.<br>
&gt;&gt;&gt;&gt; The Hebrew University of Jerusalem Givat Ram, Jerusalem 91904, Israel<br>&gt;&gt;&gt;&gt; Phone: +(972)-2-658-5371 (laboratory)<br>&gt;&gt;&gt;&gt; WWW site: <a href="http://www.cs.huji.ac.il/~freiman" target="_blank">http://www.cs.huji.ac.il/~freiman</a><br>
&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; ------------------------------------------------------------------------<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt;&gt; Insight-users mailing list<br>&gt;&gt;&gt;&gt; <a href="mailto:Insight-users@itk.org">Insight-users@itk.org</a><br>&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;<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; --<br>&gt;&gt; __<br>&gt;&gt; Moti Freiman, Ph.D Student.<br>&gt;&gt; Medical Image Processing and Computer-Assisted Surgery Laboratory.<br>&gt;&gt; School of Computer Science and Engineering.<br>
&gt;&gt; The Hebrew University of Jerusalem Givat Ram, Jerusalem 91904, Israel<br>&gt;&gt; Phone: +(972)-2-658-5371 (laboratory)<br>&gt;&gt; WWW site: <a href="http://www.cs.huji.ac.il/~freiman" target="_blank">http://www.cs.huji.ac.il/~freiman</a><br>
&gt;&gt;<br>&gt;&gt; _______________________________________________<br>&gt;&gt; Insight-users mailing list<br>&gt;&gt; <a href="mailto:Insight-users@itk.org">Insight-users@itk.org</a><br>&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;<br>&gt;&gt;<br>&gt;<br>&gt;<br>&gt;<br>&gt; --<br>&gt; Karthik Krishnan<br>&gt; R&amp;D Engineer,<br>&gt; Kitware Inc.<br>&gt; Ph: 518 371 3971 x119<br>&gt; Fax: 518 371 3971<br>&gt; _______________________________________________<br>
&gt; Insight-users mailing list<br>&gt; <a href="mailto:Insight-users@itk.org">Insight-users@itk.org</a><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></div></div></blockquote></div><br><br clear="all"><br>-- <br>__<br>Moti Freiman, Ph.D Student.<br>Medical Image Processing and Computer-Assisted Surgery Laboratory.<br>School of Computer Science and Engineering.<br>
The Hebrew University of Jerusalem Givat Ram, Jerusalem 91904, Israel<br>Phone: +(972)-2-658-5371 (laboratory)<br>WWW site: <a href="http://www.cs.huji.ac.il/~freiman">http://www.cs.huji.ac.il/~freiman</a><br></div>