<div dir="ltr"><div><div><div><div><div><div><div><div><div><div><div>Hello Nicolas,<br><br></div>Those are very good questions.<br></div>itkImageSSRTD33 is not currently wrapped in PyBuffer. I just submitted a patch to take care of this.<br></div><div>However, you can use your other approach to get the pixel values, waiting for the patch to be merged into ITK.<br></div><div><br></div>The order of the different components can be found by comparing the two ways to access the values in a Symmetric Second Rank Tensor:<br></div>Following your code, you can add the following lines:<br>image=hessian_filter.GetOutput()<br>t=image.GetPixel([0,0,0])<br></div>print("%f,%f,%f,%f,%f,%f"%(t[0],t[1],t[2],t[3],t[4],t[5]))<br></div><div>print("%f,%f,%f,%f,%f,%f"%(t(0,0),t(0,1),t(0,2),t(1,1),t(1,2),t(2,2)))<br></div><br></div>You can see that the components are ordered the following way:<br>0 1 2<br>1 3 4<br>2 4 5<br><br></div>To extract the boundaries of a region:<br>size=hessian_filter.GetOutput().GetBufferedRegion().GetSize()<br></div>print("%d,%d,%d"%(size[0],size[1],size[2]))<br><br></div>To extract the eigenvectors and eigenvalues, you can do the following:<br>v=itk.FixedArray[itk.D,3]()<br>e=itk.Matrix[itk.D,3,3]()<br>t.ComputeEigenAnalysis(v,e)<br></div>print("%f,%f,%f"%(v[0],v[1],v[2]))<br><div>arr=itk.GetArrayFromVnlMatrix(e.GetVnlMatrix().as_matrix())<br></div><div>print arr[0,0]<br><br></div><div>Hope this helps,<br></div><div>Francois<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Mar 24, 2017 at 4:52 AM, Nicolas Cedilnik <span dir="ltr"><<a href="mailto:nicolas.cedilnik@inria.fr" target="_blank">nicolas.cedilnik@inria.fr</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  

    
  
  <div bgcolor="#FFFFFF" text="#000000">
    Hello,<br>
    <br>
    I am very new to ITK and looking for help.<br>
    I am trying to obtain hessian matrix values, in order to extract
    information about the detected vessels orientation. I'd be fine
    directly obtaining eigenvalues and eigenvectors.<br>
    I have compiled ITK with python wrappers and the BridgeNumpy module.<br>
    <br>
    What I've managed to do so far:<br>
    <pre># read my image
pixelType = itk.F
imageType = itk.Image[pixelType, 3]
readerType = itk.ImageFileReader[imageType]
reader = readerType.New()
reader.SetFileName("/path/to/<wbr>my/image.mha")
# compute Hessian matrix
hessian_filter = itk.<wbr>HessianRecursiveGaussianImageF<wbr>ilter[imageType].New()
hessian_filter.SetInput(<wbr>reader.GetOutput())
# compute vesselness image
vesselness_filter = itk.<wbr>Hessian3DToVesselnessMeasureIm<wbr>ageFilter[itk.F].New()
vesselness_filter.SetInput(<wbr>hessian_filter.GetOutput())
vesselness_filter.Update()
# convert vesselness image to numpy array
itk_py_converter = itk.PyBuffer[imageType]
vesselness_ndarray = itk_py_converter.<wbr>GetArrayFromImage(vesselness_<wbr>filter.GetOutput())
# output: x,y,z numpy array corresponding to my input image, which is a good start

</pre>
    Unfortunately, if I try to convert the Hessian matrix the same way:<br>
    <pre>buf = itk.PyBuffer[itk.Image.<wbr>SSRTD33]
hess_matrix_ndarray = buf.GetArrayFromImage(hessian_<wbr>filter.GetOutput())
</pre>
    I run into this error:<br>
    <pre>(...)
KeyError: "itkTemplate : No template [<class 'itkImagePython.<wbr>itkImageSSRTD33'>] for the itk::PyBuffer class"
</pre>
    <b>Is this because I did not compile/install properly or because
      this type of pixel (itkImageSSRTD33) is not implemented in the
      PyBuffer module?</b><br>
    <br>
    Anyway I tried a different approach to obtain hessian matrix values:<br>
    <pre>hessian_filter.GetOutput().<wbr>GetPixel([x,y,z]).<wbr>GetNthComponent(n)
</pre>
    which works but I don't know <b>in what order are</b><b><b> </b>the
      6 components</b> and didn't even find out <b>how to extract the
      image boundaries as python standard types?</b><br>
    <pre>In: hessian_filter.GetOutput().<wbr>GetBufferedRegion()
Out: itkImageRegion3([0, 0, 0], [480, 384, 255])  # this looks OK but...
In: hessian_filter.GetOutput().<wbr>GetBufferedRegion()[1]
Out: TypeError: 'itkImageRegion3' object does not support indexing  # DAMN!
</pre>
    As the vesselness filter performs eigenanalysis of the hessian
    matrix,<b> is there a way to extract the eigenvectors from there</b>?<br>
    <br>
    If you've read this far, thanks a lot. Please point me the right
    direction... I used SimpleITK before and was less confused but
    unfortunately it is my understanding that it is not possible to use
    hessian filters in SimpleITK at the moment.<br>
    <br>
    Regards,<span class="HOEnZb"><font color="#888888"><br>
    <br>
    -- <br>
    Nicolas<br>
  </font></span></div>

<br>______________________________<wbr>_________________<br>
Community mailing list<br>
<a href="mailto:Community@itk.org">Community@itk.org</a><br>
<a href="http://public.kitware.com/mailman/listinfo/community" rel="noreferrer" target="_blank">http://public.kitware.com/<wbr>mailman/listinfo/community</a><br>
<br></blockquote></div><br></div>