<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";
        color:black;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";
        color:black;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";
        color:black;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;
        color:black;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page Section1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body bgcolor=white lang=DE-AT link=blue vlink=purple>
<div class=Section1>
<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Hi Alberto,<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-GB style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Thank you for your code. At this point i just want to visualise the
vector to understand what the algorithm is doing and not creating a display
window. So, i am trying to look at the vector field using paraview, which is
going pretty good.<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-GB style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>There are some tutorial which help to load data and view the
vector fields. <o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-GB style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span lang=EN-GB style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Regards,<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-GB style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Kana <o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-GB style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>
<div>
<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>
<p class=MsoNormal><b><span lang=EN-US style='font-size:10.0pt;font-family:
"Tahoma","sans-serif";color:windowtext'>From:</span></b><span lang=EN-US
style='font-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext'>
Gomez, Alberto [mailto:alberto.gomez@kcl.ac.uk] <br>
<b>Sent:</b> 11 February 2010 12:14<br>
<b>To:</b> Kishore Mosaliganti<br>
<b>Cc:</b> Arunachalam Kana; insight-users@itk.org<br>
<b>Subject:</b> Re: [Insight-users] Gradient vector flow calculation<o:p></o:p></span></p>
</div>
</div>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal><br>
Hi,<br>
<br>
You can visualize the vector field as arrows (or any other shape) using
vtkGlyph. I found it quite unclear when I first did it and I don't know if I am
doing it the best way, but here is an example of what works for me.<br>
<br>
You need to provide a set of points and a set of vectors corresponding to those
points (in world coords). I store them in two std::vector ,
"directions" and "positions":<br>
<br>
<br>
//positions<br>
int num_pts = directions.size();<br>
vtkSmartPointer<vtkPoints> pts =
vtkSmartPointer<vtkPoints>::New();<br>
pts->SetNumberOfPoints(num_pts);<br>
<br>
//directions<br>
vtkSmartPointer<vtkDoubleArray> vecArr =
vtkSmartPointer<vtkDoubleArray>::New();<br>
vecArr->SetNumberOfComponents(3);<br>
vecArr->SetNumberOfTuples(num_pts);<br>
<br>
for( int i=0; i < num_pts; i++)<br>
{<br>
pts->InsertPoint(i, positions[i][0],
positions[i][1], positions[i][2]);<br>
vecArr->InsertTuple3(i,
directions[i][0]*sf, directions[i][1]*sf, directions[i][2]*sf);<br>
}<br>
<br>
// put vectors and positions into a grid which will be the
glyph's input<br>
vtkSmartPointer<vtkUnstructuredGrid> uGrid =
vtkSmartPointer<vtkUnstructuredGrid>::New();<br>
uGrid->SetPoints(pts);<br>
uGrid->GetPointData()->SetVectors(vecArr);<br>
<br>
<br>
<br>
// glyph construction<br>
// build arrow<br>
vtkSmartPointer<vtkArrowSource> arrow =
vtkSmartPointer<vtkArrowSource>::New();<br>
<br>
//build arrow Field<br>
vtkSmartPointer<vtkGlyph3D> glyph =
vtkSmartPointer<vtkGlyph3D>::New();<br>
glyph->SetInput(uGrid);<br>
glyph->SetSource(arrow->GetOutput());<br>
glyph->SetScaleModeToScaleByVector();<br>
<br>
//display<br>
vtkSmartPointer<vtkPolyDataMapper>
gMapper = vtkSmartPointer<vtkPolyDataMapper>::New();<br>
gMapper->SetInput(
glyph->GetOutput());<br>
gMapper->ScalarVisibilityOn();<br>
gMapper->SetScalarRange(uGrid->GetScalarRange());<br>
<br>
vtkSmartPointer<vtkActor> gactor =
vtkSmartPointer<vtkActor>::New();<br>
gactor->SetMapper(gMapper);<br>
gactor->GetProperty()->SetColor(color);<br>
ren->AddActor(gactor);<br>
<br>
<br>
Hope this helps,<br>
<br>
<br>
Alberto<br>
<br>
<br>
<br>
<br>
<br>
<br>
Kishore Mosaliganti wrote: <o:p></o:p></p>
<pre>For 2, you can use Paraview to visualize the vector field.<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>Kishore<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>On Wed, Feb 10, 2010 at 8:35 AM, Arunachalam Kana<o:p></o:p></pre><pre><a
href="mailto:Kana.Arunachalam@fh-wels.at"><Kana.Arunachalam@fh-wels.at></a> wrote:<o:p></o:p></pre><pre> <o:p></o:p></pre>
<blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><pre>Hi User,<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>My goal is to implement insight journal paper:<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>"Edge based tube detection for coronary artery centerline extraction"<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>From the paper i understood that i have to calculate the following:<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>1. Gradient vector field<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>2. Anisotropic diffusion of gradient vector<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>3. Gradient vector flow<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>4. Hessian matrix<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>I calculate the gradientimage using itkGradientImageFilter. I use<o:p></o:p></pre><pre>itkGradientVectorFlowImageFilter<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>to directly calculate the gradient vector flow as it is given the diffusion<o:p></o:p></pre><pre>is already inbuilt in<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>itkGradientVectorFlowImageFilter.<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>I use QVTK for visualisation. The image is loaded as vtk image. To apply<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>itk algorithm, i convert the vtk image to itk image using vtkKWEITKImage.cxx<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>from vtkedge. The same file is used for itk image to vtk image for display.<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>typedef itk::Image< T, 3 > InputImageType; //input image type<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>typedef itk::Image< float, 3 > OutputImageType; //outputimage type<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>/// cast filter which converts any inputimage type to outputimage type<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>typedef itk::CastImageFilter <InputImageType, OutputImageType> castType;<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>castType::Pointer castfilter = castType::New();<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>// image is vtkKWEITKImage object<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>castfilter->SetInput( dynamic_cast< InputImageType * >( image->GetITKImage()<o:p></o:p></pre><pre>) );<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>//itk vector image declaration<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>typedef itk::CovariantVector<float, 3> VectorPixelType;<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>typedef itk::Image<VectorPixelType, 3> VectorImageType;<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>//calculate the gradient vector of image<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>typedef itk::GradientImageFilter <OutputImageType, float, float><o:p></o:p></pre><pre>GradientType;<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>GradientType::Pointer gradient = GradientType::New();<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>gradient->SetInput(castfilter->GetOutput());<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>gradient->Update();<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>//calculation of gradient vector flow from diffused gradient vector<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>typedef itk::GradientVectorFlowImageFilter<VectorImageType, VectorImageType,<o:p></o:p></pre><pre>double> VectorFlowType;<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>VectorFlowType::Pointer flowfilter = VectorFlowType::New();<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>flowfilter->SetInput(gradient->GetOutput());<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>//observer of algorithm execution for time<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>p->Observe( flowfilter );<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>//the image object is updated with output image from flowfilter<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>image->SetImage( flowfilter->GetOutput( ) );<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>image->Modified();<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>flowfilter->ReleaseDataFlagOn();<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>return EXIT_SUCCESS;<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>Questions:<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>1. I would like to know whether itkGradientVectorFlowImageFilter computes<o:p></o:p></pre><pre>anisotropic diffusion or gaussian diffusion ?<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>2. I want to visualise the gradient vector flow as arrows. How can i achieve<o:p></o:p></pre><pre>this visualisation?<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>3. If there is any example, which would help me fully or partially I would<o:p></o:p></pre><pre>like to know.<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>Thank you in advance.<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>Regards,<o:p></o:p></pre><pre><o:p> </o:p></pre><pre>Kana<o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre>_____________________________________<o:p></o:p></pre><pre>Powered by <a
href="http://www.kitware.com">www.kitware.com</a><o:p></o:p></pre><pre><o:p> </o:p></pre><pre>Visit other Kitware open-source projects at<o:p></o:p></pre><pre><a
href="http://www.kitware.com/opensource/opensource.html">http://www.kitware.com/opensource/opensource.html</a><o:p></o:p></pre><pre><o:p> </o:p></pre><pre>Kitware offers ITK Training Courses, for more information visit:<o:p></o:p></pre><pre><a
href="http://www.kitware.com/products/protraining.html">http://www.kitware.com/products/protraining.html</a><o:p></o:p></pre><pre><o:p> </o:p></pre><pre>Please keep messages on-topic and check the ITK FAQ at:<o:p></o:p></pre><pre><a
href="http://www.itk.org/Wiki/ITK_FAQ">http://www.itk.org/Wiki/ITK_FAQ</a><o:p></o:p></pre><pre><o:p> </o:p></pre><pre>Follow this link to subscribe/unsubscribe:<o:p></o:p></pre><pre><a
href="http://www.itk.org/mailman/listinfo/insight-users">http://www.itk.org/mailman/listinfo/insight-users</a><o:p></o:p></pre><pre><o:p> </o:p></pre><pre><o:p> </o:p></pre><pre> <o:p></o:p></pre></blockquote>
<pre>_____________________________________<o:p></o:p></pre><pre>Powered by <a
href="http://www.kitware.com">www.kitware.com</a><o:p></o:p></pre><pre><o:p> </o:p></pre><pre>Visit other Kitware open-source projects at<o:p></o:p></pre><pre><a
href="http://www.kitware.com/opensource/opensource.html">http://www.kitware.com/opensource/opensource.html</a><o:p></o:p></pre><pre><o:p> </o:p></pre><pre>Kitware offers ITK Training Courses, for more information visit:<o:p></o:p></pre><pre><a
href="http://www.kitware.com/products/protraining.html">http://www.kitware.com/products/protraining.html</a><o:p></o:p></pre><pre><o:p> </o:p></pre><pre>Please keep messages on-topic and check the ITK FAQ at:<o:p></o:p></pre><pre><a
href="http://www.itk.org/Wiki/ITK_FAQ">http://www.itk.org/Wiki/ITK_FAQ</a><o:p></o:p></pre><pre><o:p> </o:p></pre><pre>Follow this link to subscribe/unsubscribe:<o:p></o:p></pre><pre><a
href="http://www.itk.org/mailman/listinfo/insight-users">http://www.itk.org/mailman/listinfo/insight-users</a><o:p></o:p></pre><pre> <o:p></o:p></pre>
<p class=MsoNormal style='margin-bottom:12.0pt'><o:p> </o:p></p>
<div>
<p class=MsoNormal>-- <o:p></o:p></p>
<p>Alberto Gómez<o:p></o:p></p>
<p><i>Division of Imaging Sciences <br>
The Rayne Institute<br>
4th Floor, Lambeth Wing<br>
St Thomas' Hospital<br>
London SE1 7EH </i><o:p></o:p></p>
<p>phone: +44 (0) 20 718 88364<br>
email: <a href="mailto:alberto.gomez@kcl.ac.uk">alberto.gomez@kcl.ac.uk</a> <o:p></o:p></p>
</div>
</div>
</body>
</html>